FFT实现会产生故障

时间:2016-01-29 10:52:57

标签: android c++ c fft

我在FFT图中发现了一个奇怪的白噪声故障:

enter image description here

我已经使用参考程序检查了,而噪音文件似乎很好。 这是实施中的错误吗?

void four1(float data[], int nn, int isign) {
    int n, mmax, m, j, istep, i;
    float wtemp, wr, wpr, wpi, wi, theta;
    float tempr, tempi;

    n = nn << 1;
    j = 1;
    for (int i = 1; i < n; i += 2) {
        if (j > i) {
            tempr = data[j];
            data[j] = data[i];
            data[i] = tempr;
            tempr = data[j + 1];
            data[j + 1] = data[i + 1];
            data[i + 1] = tempr;
        }
        m = n >> 1;
        while (m >= 2 && j > m) {
            j -= m;
            m >>= 1;
        }
        j += m;
    }
    mmax = 2;
    while (n > mmax) {
        istep = 2 * mmax;
        theta = TWOPI / (isign * mmax);
        wtemp = sin(0.5 * theta);
        wpr = -2.0 * wtemp * wtemp;
        wpi = sin(theta);
        wr = 1.0;
        wi = 0.0;
        for (m = 1; m < mmax; m += 2) {
            for (i = m; i <= n; i += istep) {
                j = i + mmax;
                tempr = wr * data[j] - wi * data[j + 1];
                tempi = wr * data[j + 1] + wi * data[j];
                data[j] = data[i] - tempr;
                data[j + 1] = data[i + 1] - tempi;
                data[i] += tempr;
                data[i + 1] += tempi;
            }
            wr = (wtemp = wr) * wpr - wi * wpi + wr;
            wi = wi * wpr + wtemp * wpi + wi;
        }
        mmax = istep;
    }
}

1 个答案:

答案 0 :(得分:2)

除了一些细微的变化之外,这段代码似乎是从C版的第二版数字食谱中删除的。该函数的文档(摘自本书)指出:

  

如果data[1..2*nn]输入为1,则通过其离散傅立叶变换替换isign;如果data[1..2*nn]输入为-1,则将nn替换为其isign次反离散傅里叶变换。   data是一个长度为nn的复杂数组,或者等效地是一个长度为2*nn的实数数组。 nn必须是2的整数幂(不检查!)。

给定具有基于1的索引的输入数组,此实现产生正确的结果。您可以通过分配大小为2*nn+1的C数组并从索引1开始填充数组来选择使用相同的索引约定。或者,您可以传递一个大小为2*nn的数组,该数组已从索引处开始填充0,但调用four1(data-1, nn, isign)(注意-1数组上的data偏移量。