2010-10-28 15 views
3

J'ai fait FFT d'un fichier audio en utilisant OouraFFTl.Comment vérifier si la sortie Sampled est bonne ou fausse. Quel est le moyen le meilleur et le plus facile à vérifier.Ceci est mon code.Comment vérifier les résultats FFT dans l'iphone?

MyAudioFile *audioFile = [[MyAudioFile alloc]init]; 
OSStatus result = [audioFile open:var ofType:@"wav"]; 
int numFrequencies=16384; 
int kNumFFTWindows=10; 

OouraFFT *myFFT = [[OouraFFT alloc] initForSignalsOfLength:numFrequencies*2 andNumWindows:kNumFFTWindows]; 
for(long i=0; i<myFFT.dataLength; i++) 
{ 
myFFT.inputData[i] = (double)audioFile.audioData[i]; 
} 
[myFFT calculateWelchPeriodogramWithNewSignalSegment]; 
NSLog(@"the spectrum data 1 is %f ",myFFT.spectrumData[1]); 
NSLog(@"the spectrum data 2 is %f",myFFT.spectrumData[2]); 
NSLog(@"the spectrum data 8192 is %f ",myFFT.spectrumData[8192]); 

J'ai créé la classe MyAudioFile qui contient

-(OSStatus)open:(NSString *)fileName ofType:(NSString *)fileType{ 
OSStatus result = -1; 

CFStringRef filePath=fileName; 

    CFURLRef audioFileURL = CFURLCreateWithFileSystemPath(kCFAllocatorDefault,  (CFStringRef)filePath, kCFURLPOSIXPathStyle, false); 
//open audio file 
result = AudioFileOpenURL (audioFileURL, kAudioFileReadPermission, 0, &mAudioFile); 
if (result == noErr) { 
//get format info 
UInt32 size = sizeof(mASBD); 

result = AudioFileGetProperty(mAudioFile, kAudioFilePropertyDataFormat, &size, &mASBD); 

UInt32 dataSize = sizeof packetCount; 
result = AudioFileGetProperty(mAudioFile, kAudioFilePropertyAudioDataPacketCount, &dataSize, &packetCount); 
NSLog([NSString stringWithFormat:@"File Opened, packet Count: %d", packetCount]); 

UInt32 packetsRead = packetCount; 
UInt32 numBytesRead = -1; 
if (packetCount > 0) { 
    //allocate buffer 
    audioData = (SInt16*)malloc(2 *packetCount); 
    //read the packets 
    result = AudioFileReadPackets (mAudioFile, false, &numBytesRead, NULL, 0, &packetsRead, audioData); 
    NSLog([NSString stringWithFormat:@"Read %d bytes, %d packets", numBytesRead, packetsRead]); 
} 
} 
    else 
    NSLog([NSString stringWithFormat:@"Could not open file: %@", filePath]); 


CFRelease (audioFileURL);  
return result; 
} 

Répondre

1

La façon facile de vérifier FFT est de prendre FFT du signal sinusoïdal. La sortie doit être tous des zéros sauf une douzaine de valeurs non nulles.

3

Vous devez tracer l'amplitude de la sortie de la FFT. Je ne connais pas votre langage de programmation, mais en Python, vous utiliseriez quelque chose comme plot(abs(fft(a))). Pour une entrée silencieuse, la sortie doit être tous des zéros. Pour une entrée d'onde sinusoïdale, vous devriez voir deux pointes:

alt text

Pour un signal réel, les pointes seront symétriques de gauche à droite. Cependant, si vous faites un real FFT (ce qui est plus efficace sur le plan des calculs), la moitié gauche de l'intrigue ne sera que la sortie, car elle ignore l'image miroir redondante.

Si la fréquence est plus élevée, les pointes seront plus proches du centre. Si the frequency is perfectly in sync with the chunk size, le pic ne sera que d'un point de large et tout le reste sera très proche de 0. Sinon, il aura une "jupe" effilée comme ci-dessus.

1

La méthode la plus courante consiste à effectuer une transformation FFT, puis à transformer le spectre de fréquences obtenu avec iFFT (Reverse Fast Fourier Transform) en domaine temporel. Ensuite, vous devez comparer votre signal horaire d'entrée avec le signal horaire résultant. La façon la plus simple de faire des comparaisons est de calculer une différence entre les deux RMS.

Exemple:

Il est donné un temps de signal x de longueur n. Trouvez X=FFT(x), puis trouvez y=iFFT(X). y sera de la même longueur n. Puis, afin de comparer x avec y, calculer

RMS_x=sqrt(x[0]*x[0] + x[1]*x[1] + ... + x[n]*x[n]) 
RMS_y=sqrt(y[0]*y[0] + y[1]*y[1] + ... + y[n]*y[n]) 

et enfin,

Error=abs(RMS_x - RMS_y) 

Le moins est cette erreur, meilleure est la qualité de FFT/iFFT.