java - wolframalpha 和 commons-math 之间的快速傅里叶变换结果差异

标签 java math fft apache-commons-math

我有一个与快速傅里叶变换相关的问题。 我下载了 FFT 所在的“Math Commons 3.2”库。但是结果和我预想的不一样。

例如,对于这样的数据,实数:1,0,0,0,0,0,0,0,0 虚数:0,0,0,0,0 ,0,0,0,0 我有,实数:1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 虚数:0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 我使用 this code 时得到的结果相同 (在“public static main”部分,此示例作为“测试”存在) 但在 wolframalpha实际值都是 1/3 而不是 1.0。

问题:
哪里/有什么区别,我怎样才能得到与 wolframalpha 相同的结果
最好的问候
大卫·D

最佳答案

理想情况下,离散傅立叶变换是一种正交变换。它只是旋转坐标系,为空间中的同一点提供一组不同的坐标。

DFT的很多实现都不正常;他们只是为了计算方便而改变 vector 的大小。本质上,它们所做的所有加法都是将 vector 长度乘以其中元素的数量,并且实现从不乘法或除法来补偿这一点。

观察返回给你的 vector WolframAlpha 的长度为 1,与输入 vector 的长度相同。 (长度为元素平方和的平方根。输入 vector 的长度为sqrt(1+0+0+0+0+0+0+0+0) = 1。长度为输出 vector 是 sqrt(1/9+1/9+1/9+1/9+1/9+1/9+1/9+1/9) = 1.)

对于 DFT 实现来说,忽略归一化并返回缩放结果是一种常见的约定。这是可行的,因为大多数用于转换结果的操作并不关心绝对大小。此外,一个常见的过程是计算一个或多个 DFT,组合或处理结果,然后计算逆 DFT。如果缩放是 DFT 的一部分,那么它必须在每个 DFT 和每个逆 DFT 中执行。如果您不考虑 DFT 的缩放,那么应用程序可以在最后将涉及的所有缩放组合成一个缩放操作。缩放一次比多次缩放对计算性能更好,所以这是首选。

关于java - wolframalpha 和 commons-math 之间的快速傅里叶变换结果差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19363114/

相关文章:

numpy - 为什么 Python 和 CUDA 不支持半精度复数浮点运算?

java - 为 SOAP header 生成证书

c# - Android/Java对应C# Stream对象方法Write()的方法是什么?

javascript - 如何在javascript中对素数进行降序排列?

php - 使用 PHP/GMP 计算整数的 n 次方根

audio - 计算STFT的赫兹

java - 在 Java 中创建对象(继承和多态)

java - 相对路径说明

python - python 中的“力量”

java - 使用 JTransform 进行 FFT 混淆