【问题标题】:FFT with iOS vDSP not symmetrical带有 iOS vDSP 的 FFT 不对称
【发布时间】:2013-02-14 10:25:24
【问题描述】:

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

【问题讨论】:

    标签: ios fft vdsp


    【解决方案1】:

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

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

    解释此问题的文档是 here,位于“真实 FFT 的数据打包”部分。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 好的,谢谢,大部分内容来自 SO 上的其他帖子,我不太了解整个 vDSP 复杂的打包内容。我再过一遍...
      猜你喜欢
      • 2011-09-15
      • 1970-01-01
      • 2017-09-03
      • 1970-01-01
      • 2013-11-18
      • 2017-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多