2013-02-14 102 views
3

我正在使用Apples vDSP API來計算音頻的FFT。但是,我的結果(在amp[])在N/2左右不對稱,根據我對FFT的真實輸入的理解,它們應該是對稱的嗎?FFT與iOS vDSP不對稱

在下面frame是包含音頻樣本float數組[128]。

 int numSamples = 128; 
     vDSP_Length log2n = log2f(numSamples); 
     FFTSetup fftSetup = vDSP_create_fftsetup(log2n, FFT_RADIX2); 
     int nOver2 = numSamples/2; 

     COMPLEX_SPLIT A; 
     A.realp = (float *) malloc(nOver2*sizeof(float)); 
     A.imagp = (float *) malloc(nOver2*sizeof(float)); 

     vDSP_ctoz((COMPLEX*)frame, 2, &A, 1, nOver2); 

     //Perform FFT using fftSetup and A 
     //Results are returned in A 
     vDSP_fft_zrip(fftSetup, &A, 1, log2n, FFT_FORWARD); 

     //Convert COMPLEX_SPLIT A result to float array to be returned 
     float amp[numSamples]; 
     amp[0] = A.realp[0]/(numSamples*2); 
     for(int i=1;i<numSamples;i++) { 
      amp[i]=A.realp[i]*A.realp[i]+A.imagp[i]*A.imagp[i]; 
      printf("%f ",amp[i]); 
     } 

如果我把同一個浮點數組放入在線FFT計算器中,我會得到一個對稱的輸出。我上面做錯了什麼?

出於某種原因,在amp[]最值約爲0〜1E-5,但我也得到約1e23一個巨大的價值。我沒有在這裏做任何窗口,只是試圖初步獲得基本的FFT工作。

我已經連接的兩個FFT輸出的圖片,使用相同的數據。你可以看到他們是相似的高達64,雖然不是一個常數比例因子,所以我不確定他們是不同的。然後超過64歲,他們完全不同。

enter image description here

回答

0

要想從嚴格實INOUT一個基本的FFT對稱的結果,您的複雜數據輸入和輸出數組必須是相同長度的FFT。您似乎只將一半的數據分配並複製到FFT輸入中,這可能會給FFT帶來非實際的內存垃圾。

+0

好的,謝謝,其中大部分來自SO的其他帖子,我不太瞭解整個vDSP複雜的包裝。我會再次通過它... – Mark 2013-02-14 18:14:10

4

因爲實數到複數FFT的數學輸出是對稱的,有在返回第二半沒有價值。在傳遞給vDSP_fft_zrip的陣列中也沒有空間。所以vDSP_fft_zrip只返回前半部分(下面討論的特殊N/2點除外)。下半場通常不是明確需要的,如果是這樣,你可以從上半場輕鬆計算出來。

vDSP_fft_zrip用於一個前進(實到複合物)時,輸出變換具有H 輸出;在A.realp[0](它是純實其虛部爲零)。輸出(其也純粹是實際的)存儲在A.imagp[0]中。剩餘值H. ,爲0 <我< N/2,通常存儲在A.realp[i]A.imagp[i]

文件,說明這是here,在部分「數據包裝爲真正的FFT」。