舍入错误在DFT中给出错误的结果?

时间:2013-10-08 14:43:10

标签: c++ fft rounding dft

我一直在这个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;
}

1 个答案:

答案 0 :(得分:1)

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

由于DFT / FFT处理超越基函数,因此使用任何非符号和有限计算机数字格式的结果将永远不会(除了少数特殊情况或幸运事故)。因此,非常接近(在几个LSB内)到零的值应该被简单地忽略为噪声,或者被认为与零相同。