0

在这个 DFT 上,我一直在碰壁。它应该打印出: 8,0,0,0,0,0,0,0 但我得到 8 然后是非常非常小的数字。这些是舍入错误吗?有什么我可以做的吗?我的 Radix2 FFT 给出了正确的结果,看起来愚蠢的 DFT 也无法工作。

我从复数开始,所以我知道有很多遗漏,我试图将其剥离以说明问题。

#include <cstdlib>
#include <math.h>
#include <iostream>
#include <complex>
#include <cassert>

#define SIZE 8
#define M_PI 3.14159265358979323846

void fft(const double src[], double dst[], const unsigned int n) 
{
    for(int i=0; i < SIZE; i++)
    {
        const double ph = -(2*M_PI) / n;
        const int gid = i;

        double res = 0.0f;
        for (int k = 0; k < n; k++) {

            double t = src[k];

            const double val = ph * k * gid;
            double cs = cos(val);
            double sn = sin(val);

            res += ((t * cs) - (t * sn));
            int a = 1;
        }

        dst[i] = res;
        std::cout << dst[i] << std::endl;
    }
}

int main(void)
{
    double array1[SIZE];
    double array2[SIZE];

    for(int i=0; i < SIZE; i++){
        array1[i] = 1;
        array2[i] = 0;
    }

    fft(array1, array2, SIZE);

    return 666;
}
4

1 回答 1

1

FFT 实际上可以产生比直接 DFT 计算更准确的结果,因为较少的算术运算通常允许较少的算术量化误差累积机会。FFTW 的一位作者有一篇关于这个主题的论文。

由于 DFT/FFT 处理超越基函数,因此使用任何非符号和有限计算机数字格式的结果将永远不会(可能在少数特殊情况下或幸运的意外除外)完全正确。因此,与零非常接近(在几个 LSB 内)的值应简单地作为噪声忽略,或视为与零相同。

于 2013-10-08T19:15:34.517 回答