2013-02-14 101 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”。