使用iOS vDSP的FFT不对称

时间:2013-02-14 10:25:24

标签: ios fft vdsp

我正在使用Apples vDSP API来计算音频的FFT。但是,根据我对实际输入的FFT的理解,我的结果(在amp[]中)在N / 2周围不对称,它们应该是对称的吗?

在下面frame是一个包含音频样本的浮点数数组[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

2 个答案:

答案 0 :(得分:4)

因为实际到复数FFT的数学输出是对称的,所以返回后半部分没有任何价值。传递给vDSP_fft_zrip的数组中也没有空间。因此vDSP_fft_zrip仅返回前半部分(除了下面讨论的特殊N / 2点)。下半部分通常不需要明确,如果是,你可以从上半部分轻松计算出来。

用于前向(实数到复数)变换的vDSP_fft_zrip输出在{{1}中具有H 0 输出(纯粹是真实的;其虚部为零) }}。 H N / 2 输出(也是纯粹的实际)存储在A.realp[0]中。剩余值H i ,0 <&lt;我&lt; N / 2,通常存储在A.imagp[0]A.realp[i]

解释此文档的文档为here,在“实数FFT的数据打包”部分中。

答案 1 :(得分:0)

要获得从严格实际输入到基本FFT的对称结果,您的复杂数据输入和输出数组必须与FFT的长度相同。您似乎只将一半数据分配并复制到FFT输入中,这可能会给FFT带来非实际内存垃圾。