Mon, December 27, 2004
Igor Pro lecture No. 39
フーリエ変換(FFT)による振幅評価の注意点:correct magnitude(中級)
過去2回の講座で IGOR Pro による高速フーリエ変換(FFT)について解説してきた。今回はフーリエ変換後の振幅の値について補足したい。
ガウス関数のフーリエ変換がガウス関数となる事は、皆さんよくご存じだろう。exp(-0.5*(ax)^2)のフーリエ変換は、(1/a/sqrt(2*pi))*exp(-0.5*(x/a)^2)となり、x の係数 a が、逆空間では1/aとなるのが特徴だ。これを計算して確かめてみよう。
オリジナルデータを作成するところは前回と同じだ。-100から+100の範囲で、128点のデータ配列からなるOrgWaveを作成しよう。今回は、線幅の値には0.5を入力しよう。
make/O/D OrgWave
setscale/I x -100, 100, "", OrgWave;
OrgWave=exp(-0.5*(0.5*x)^2)
redimension/C OrgWave
以下のようなグラフが得られただろうか。最後の行の命令は、第31回の講座で説明したように、OrgWaveを複素数型の wave に変換する命令だ。これによってフーリエ変換後のデータは負の k 軸を含む対称スペクトルとなる。
次に振幅を求めてみよう。
duplicate/O OrgWave MagWave
FFT Magwave
MagWave*=conj(MagWave)
MagWave=MagWave^0.5
redimension/R MagWave
FFTの実数部をA、虚数部をBとすると、振幅はsqrt(A^2+B^2)だ。real() と imag() 関数を使ってもよいが、今回は共役をかけてから平方根をとった。つまりsqr((A+iB)(A-iB)) だ。
以上の結果が、ガウス関数のFFTの計算値と合致するか調べてみよう。まずMagWaveの複製をとり、そこに上で述べた計算値を入れてみる。IGORのFFTは、 x に 2*pi をかけて実行されるので、以下ではその事を考慮している。
Duplicate MagWave CalcWave
CalcWave=(1/0.5/sqrt(2*pi))*exp(-0.5*(2*pi*x/0.5)^2)
さて、MagWave と CalcWave を比較してみてどうだろうか?sqrt(2*pi)はFFTの定義に依存するので、適応の有無はさておき、それを考慮したとしてもFFTの縦軸の値が計算値とあわない。他の値を各自で設定して計算してみるとわかるが、FFTの結果は、与えたX軸の範囲とデータ点数の両方に依存する。正しいFFTの大きさを求めるためには、オリジナルのX軸の幅とデータ点数の比の値をかける必要がある。
以下のように wave の複製を作成し、そこに補正値を代入してみよう。(上で述べたsqrt(2*pi)に、もう一つsqrt(2*pi)がかかっている)
duplicate/O MagWave MagWaveCorr
MagWaveCorr=MagWave*200/128/(2*pi)
いかがだろうか。これで、FFTの結果と計算値が完全に合致した。一般的に、FFTの振幅の値を細かく議論する機会は少ないが、正確な値が必要な場合はこのようにして求めることができる。
さてこの補正計算だが、一つだけ注意点がある。FFTの結果が、データの長さ L やデータ数 N に依存するのは実はおかしなことではなく(定義を参照)、むしろ逆変換(IFFT)との整合性を考慮してのことだ。よって、特殊な用途を除いて通常は今回述べた補正計算は不要だ。FFTデータに対して各種バンドパスフィルターをかけ、その後逆変換したい場合には、このような補正は一切不要である。
posted at December 27, 2004 01:33 AM
« Igor Pro lecture No. 38 | ホームに戻る | Igor Pro lecture No. 40 »
さんのサイン・インを確認しました。 (サイン・アウト)
(いままで、ここでコメントしたとがないときは、コメントを表示する前にこのウェブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)