【问题标题】:Fast Fourier Transform difference in result between wolframalpha and commons-mathwolframalpha和commons-math之间结果的快速傅立叶变换差异
【发布时间】:2013-10-14 23:33:43
【问题描述】:

我有一个与快速傅里叶变换有关的问题。 我下载了 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

【问题讨论】:

    标签: java math fft apache-commons-math


    【解决方案1】:

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

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

    观察返回给你的向量 WolframAlpha 的长度为 1,与输入向量的长度相同。 (长度为元素平方和的平方根。输入向量的长度为 sqrt(1+0+0+0+0+0+0+0+0) = 1。输出向量为 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 之外,则应用程序可以在最后将所有涉及的缩放组合到单个缩放操作中。一次缩放比多次缩放对计算性能更好,所以这是首选。

    【讨论】:

      【解决方案2】:

      按照惯例,1 的向量的 FFT 应该是 1,0,0,0...因此,我会说 Wolfram Alpha 结果是未归一化的。没什么大不了的,也不是真的“不正确”,但要从 Alpha 获得标准化结果,您显然必须乘以 3。

      【讨论】:

      • 其实恰恰相反。大多数 DFT 实现都是非规范化的;他们不会缩放结果以匹配正交变换的数学值。 WolframAlpha 结果被归一化;它的输出向量与输入向量的向量长度相同。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-21
      • 1970-01-01
      • 2011-07-12
      • 1970-01-01
      相关资源
      最近更新 更多