c++ - 舍入错误在 DFT 中给出不正确的结果?

标签 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;
}

最佳答案

FFT 实际上可以产生比直接 DFT 计算更准确的结果,因为较少的算术运算通常可以减少算术量化误差累积的机会。 FFTW 的一位作者就此主题发表了一篇论文。

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

关于c++ - 舍入错误在 DFT 中给出不正确的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19250859/

相关文章:

c++ - 忽略转义序列 C++

java - 我应该从 getFft 看到什么样的输出?

c# - 离散傅里叶变换

c++ - 防止对象立即被销毁

c++ - 为什么 boost interprocess named mutex docs 说每个进程都应该有自己的命名互斥体?

r - 保留尾随零

java - 如何对浮点值进行四舍五入,使其小数点后不包含 0

python - 在 Python 中将数字四舍五入到 5 万

c++ - 将成员指针作为比较器/"key"的 std 算法

python - 计算功率谱