簡単な IDL コードを Python に渡しています。ただし、SciPy/NumPy パッケージから返される FFT 値は IDL のものとは異なり、その理由がわかりません。
すべてを 8 つの要素の単純な例に還元すると、SciPy/NumPy ルーチンは IDL のものよりも 8 (2^3) 倍大きな値を返すことがわかりました (正規化の問題だと思いました)。
両方の言語でのコード例 (ここからコピー) を次に示します。
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.62500、-0.00000)(-1.17050、1.74372)(0.25000000、0.125000)(0.425000)(0.0.125000)
パイソン
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's answer には、私が見逃したドキュメントがあります。