IDL和Python之间的FFT差异

时间:2012-04-24 16:48:16

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

我将一些简单的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,0.00000)(0.420495,0.506282)(0.250000,0.125000)( - 1.17050,-1.74372)( - 2.6500,-0.00000)( - 1.7050,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的回答中,有我错过的文档。

1 个答案:

答案 0 :(得分:9)

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

http://docs.scipy.org/doc/numpy/_images/math/dd1819fee3d9660e590d152f0c7cb7aa0c441ff1.png

http://docs.scipy.org/doc/numpy/_images/math/6bbd972502306a4225d33ac6919fc6fc8244f67d.png

而IDL是(来自here):

http://www.physics.nyu.edu/grierlab/idl_html_help/images/Fa8.gif

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

对于256-elt的情况,我不确定256 * 8的情况;你可以发布原始阵列和两个输出吗? (这是否适用于所有256-elt阵列?其他尺寸怎么样?我没有IDL ....)