4

簡単な 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 には、私が見逃したドキュメントがあります。

4

1 に答える 1

9

IDL と numpy は、わずかに異なる DFT の定義を使用します。Numpy は (ドキュメントから):


(ソース: scipy.org )

一方、IDL は (ここから):

Numpyは IDL の, is , ismと同じです。とも同じことだと思います。したがって、の因数は明らかな違いであり、8-elt の場合の 8 の違いを説明しています。xkunNa_mf(x)1/N

256-elt の場合の 256*8 についてはよくわかりません。元の配列と両方の出力をどこかに投稿できますか? (これはすべての 256-elt アレイで発生しますか?他のサイズはどうですか?私は IDL を持っていません....)

于 2012-04-24T17:05:54.837 に答える