Matlab和Java中的FFT

5

我在Matlab和Java中使用jtransforms库进行了FFT,但结果略有不同。

Matlab results:
-0.0530528652679544
-0.00775535711930750 + 0.0281791646147104i
-0.0304104457750988 - 0.209776156064443i
0.266945753193636 + 0.200338044445226i

Jtransforms results:
-0.05305448436232618
-0.007755593801247046 + 0.028180024600812384
-0.03041137385657606 -0.20978255812004887
0.26695389998013486 + 0.20034415846373468

结果是否不同,还是Matlab只是四舍五入了这些值?


1
有很大的不同。一个库使用32位浮点数,而另一个使用64位吗? - Peter Lawrey
2个回答

7

几种不同的算法可以进行FFT。原则上它们都是相等的,但在实践中,结合浮点运算,结果会略有不同。即使基本的FFT算法相同,如求和顺序等实现细节也可能导致差异。许多现代处理器即使不做任何特殊处理也会这样做,具体取决于优化标志。

在您的结果中,差异在第5个有效数字左右。这是一个相当小的差异。您可以尝试对结果进行反变换(使用Matlab和JTransforms IFTs),以查看哪个变换更准确。


1

这些差异似乎比双精度浮点算术的正常数值精度问题更大。看起来更像是其中一个FFT使用了一些短浮点算术或数据,然后将结果打印为双精度(这使得所有这些额外的数字都是无意义的)。


在这种情况下,可能是这样,也可能不是,但至少对于FPA精度来说,不存在所谓的“正常”。特别是在累加器/积分器中(FFT算法不可避免地包含),舍入误差几乎可以无限累积。 - Joonas Pulakka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接