我将一些简单的IDL代码传递给Python。但是,从SciPy / NumPy包中返回的FFT值与IDL包不同,我无法找到原因。
将所有内容简化为8个元素的简单示例我发现SciPy / NumPy例程返回的值比IDL大8(2 ^ 3)倍(我认为是规范化问题)。
以下是两种语言的示例代码(从here复制):
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)
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的回答中,有我错过的文档。
答案 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
相同,k
为u
,n
为N
。我认为a_m
和f(x)
也是一样的。因此,1/N
因子是明显的差异,解释了8-elt案例中8的差异。
对于256-elt的情况,我不确定256 * 8的情况;你可以发布原始阵列和两个输出吗? (这是否适用于所有256-elt阵列?其他尺寸怎么样?我没有IDL ....)