IDL和Python中FFT的差异

4
我将一些简单的IDL代码传递给Python。但是,SciPy/NumPy软件包返回的FFT值与IDL不同,我找不到原因。
简化为8个元素的简单示例后,我发现SciPy/NumPy程序返回的值比IDL大8倍(我认为这是一个归一化问题)。
以下是两种语言的示例代码(从这里复制):
signal = ([-2., 8., -6., 4., 1., 0., 3., 5.])
fourier = fft(signal)
print, fourier

返回值

(1.62500, 0.00000) (0.420495, 0.506282) (0.250000, 0.125000) (-1.17050, -1.74372) (-2.62500, 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因子是如何修改结果的? - eduardosufan
IDL在前向变换中以N(此处为8)进行除法运算。 - honeste_vivere
1个回答

9

IDL和numpy在DFT的定义上略有不同。Numpy的定义如下(来自文档):


(来源:scipy.org)

而IDL的是(来自这里):

Numpy的是与IDL的相同,是,是。我认为和也是一样的。因此,<1/N>的因素是显而易见的区别,解释了您8元素情况下的差异为8。

我不确定256*8的256元素情况;您能否在某处发布原始数组和两个输出?(所有256元素数组都会发生这种情况吗?其他大小呢?我没有IDL....)


抱歉,我只看到了FFT链接在顶部,没有向下滚动到Scipy文档... 无论如何,我尝试使用更长和更短的数组,归一化似乎是问题所在,但我正在使用的256个向量仍然有8倍的错误。 我执行 print len(matflux[i,:]), fft(matflux[i,:] 其中长度为256。 - fffff
抱歉,我尝试了与您相同的代码,并且得到了相同的结果。那个8因子是如何修改结果的? - eduardosufan

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