3

我正在使用 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,它们完全不同。

在此处输入图像描述

4

2 回答 2

4

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

vDSP_fft_zrip用于前向(实数到复数)变换时的输出具有 H 0输出(纯实数;其虚部为零)A.realp[0]。H N/2输出(也是纯实数)存储在A.imagp[0]. 对于 0 < i < N/2,其余值 H i正常存储在A.realp[i]和中A.imagp[i]

解释这一点的文档在这里,在“Real FFT 的数据打包”部分。

于 2013-02-15T20:30:12.857 回答
0

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

于 2013-02-14T15:23:33.550 回答