0

我听说浮点 FFT 不准确,尤其是 cos 和 sin 函数 - 与 double 相比,数字完全不同。

我问是因为我重写了一些代码——Cooley-Tukey FFT 算法;结果是不同的。原始项目使用双精度,新项目使用浮点数。那是我的错误吗?我用 matlab 和 c++ 编写这段代码......很少问 matlab 的 double 和 java 和 c+ double 一样吗?

float  PI=3.141592;
// Make sure n is a power of 2
// if (n != (1 << m))
//    throw new RuntimeException("FFT length must be power of 2");

// precompute tables

 for (int i = 0; i < n / 2; i++) {
     cosa[i] = cos (-2 * PI * i / n);
     sina[i] =sin (-2 * PI * i / n);
 }
4

1 回答 1

3

对于大多数 FFT 算法,“非准确度”随着输入元素的大小以大约 O(NlogN) 的速度增长;KCS/IEEE754 浮点数的精度约为 24 位。因此对于不是超长的 FFT,数据中的噪声、不完善的抗锯齿和输入的量化通常大于算术误差。

仅当您真正关心小数点后 6 位左右的有效和准确数据时,float 和 double 之间的结果才会“完全不同”。

于 2013-02-25T20:18:32.140 回答