iOS vDSP中的FFT不对称问题

3

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

下面的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以上,它们完全不同。
2个回答

4
由于实数到复数的FFT的数学输出是对称的,因此返回第二部分没有任何价值。在传递给vDSP_fft_zrip的数组中也没有空间。因此,vDSP_fft_zrip仅返回前半部分(除了下面讨论的特殊N / 2点)。通常不需要显式使用第二个半部分,如果需要,可以轻松从第一个半部分计算出来。
当用于正向(实数到复数)变换时,vDSP_fft_zrip的输出具有H0输出(纯实数;其虚部为零),存储在A.realp [0]中。 HN / 2输出(也是纯实数)存储在A.imagp [0]中。对于0 这方面的说明文档在这里,位于“实数FFT数据打包”一节中。


1
要从严格实数输入中获得对称结果,需要将复杂数据的输入和输出数组长度与FFT相同。您似乎只分配和复制了一半的数据到FFT输入中,这可能会向FFT提供非实际内存垃圾。

好的,谢谢。大部分内容都是从 Stack Overflow 的其他帖子中摘录的,我并不完全理解整个 vDSP 复杂打包的过程。我会再仔细阅读一遍... - Mark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接