【问题标题】:Difference in FFT between IDL and PythonIDL 和 Python 的 FFT 区别
【发布时间】:2012-05-05 08:26:33
【问题描述】:

我将一些简单的 IDL 代码传递给 Python。然而,从 SciPy/NumPy 包返回的 FFT 值与 IDL 不同,我不知道为什么。

将所有内容简化为 8 个元素的简单示例,我发现 SciPy/NumPy 例程返回的值是 IDL 例程的 8 (2^3) 倍(我认为是标准化问题)。

以下是两种语言的示例代码(复制自here):

IDL

signal = ([-2., 8., -6., 4., 1., 0., 3., 5.])
fourier = fft(signal)
print, fourier

返回

(1.62500,000000)(0.420495,0.506282)(0.250000,0.125000)(-1.17050,-1.74372)(-2.62500,0.00000)(-1.17050,0.0.00000)(-1.17050,1.74372)(0.250000,-0.125000)(0.420495,-0.506282)

Python

from scipy.fftpack import fft
import numpy as N
…
signal = N.array([-2., 8., -6., 4., 1., 0., 3., 5.])
fourier = fft(signal)
print fourier

返回

[ 13. +0.j , 3.36396103 +4.05025253j, 2. +1.j , -9.36396103-13.94974747j, -21. +0.j , -9.36396103+13.94974747j, 2. -1.j , 3.36396103 -4.05025253j]

我使用 NumPy 包完成了它,并且得到了相同的结果。我也尝试了print fft(signal, 8 ) 以防万一,但它返回的结果与预期的一样。

但这还不是全部,回到我的 256 个元素的真实数组,我发现差异不再是 8 或 256,而是 256*8!这简直是​​疯了。

虽然我解决了这个问题,但我需要知道为什么会有这种差异。

已解决:这只是归一化,在某些时候我将 IDL 256 数组除以 8 的因数,但我忘记删除了。在 Dougal 的回答中有我错过的文档。

【问题讨论】:

  • 对不起,我试过和你一样的代码,结果也一样。修改结果的 8 个因素在哪里?
  • IDL 在前向变换上除以 N,这里恰好是 8。

标签: python scipy fft idl idl-programming-language


【解决方案1】:

IDL 和 numpy 对 DFT 的定义略有不同。 Numpy 是(来自the documentation):


(来源:scipy.org

而 IDL 是(来自 here):

Numpy 的 m 与 IDL 的 x 相同,kunN。我认为a_mf(x) 也是一回事。所以 1/N 的因子是明显的差异,解释了 8 在你的 8-elt 案例中的差异。

我不确定 256*8 是否适用于 256-elt 的情况;您可以将原始数组和两个输出都发布到某处吗? (所有 256-elt 数组都会发生这种情况吗?其他尺寸呢?我没有 IDL....)

【讨论】:

  • 对不起,我到了顶部的 fft 链接,我没有向下滚动到 scipy 案例中的文档...无论如何我尝试使用更长和更短的数组,规范化似乎是问题,但是我使用的 256 长向量仍然是错误的 8 因子。我这样做print len(matflux[i,:]), fft(matflux[i,:] len 是 256
  • 对不起,我试过和你一样的代码,结果也一样。修改结果的 8 个因素在哪里?
猜你喜欢
  • 2013-05-09
  • 2013-10-26
  • 2020-10-23
  • 1970-01-01
  • 2010-12-07
  • 1970-01-01
  • 2012-04-30
  • 1970-01-01
  • 2012-08-20
相关资源
最近更新 更多