FFT その1

みんな大好きFFTのお話です
FFTとはもちろんファイナルファンタジータクティクス・・・のことではなく,高速フーリエ変換(Fast Fourier Transform)を指します
原理やアルゴリズムはともかくとして,高速にDFTを行ってくれるすごいヤツです
MaximaにもFFTのパッケージがありますので使ってみたいと思います
fft1.wxm
http://cdn-ak.f.st-hatena.com/images/fotolife/r/ryooji_f/20111020/20111020203753.png
Ls : サンプリングデータ(振幅の配列)
N : サンプル数
dt : サンプリング間隔[s]
T : サンプリング時間[s]
df : 周波数分解能[Hz]
%o1にてパッケージ"fft"をロードします(画面出力は省略)
%o2のfpprintprec : 6 は表示桁数の宣言です(画面出力は省略)
サンプリングデータをLsに配列として代入します(fft関数に渡す配列の数は2のべき乗であることが前提で,違うと怒られます)
Lsの配列の数をNとして%o4式に示します
N/2をnとして%o5式に示します(nについては後述します)
dtを%o6式に示します
N*dtをTとして%o7式に,1/Tをdfとして%o8式にそれぞれ示します



サンプリングデータを確認してみます
Lsとサンプリング時刻tで二次元配列Sを作成します(%o9)
これを横軸にt, 縦軸に振幅として%t10にプロットします


http://cdn-ak.f.st-hatena.com/images/fotolife/r/ryooji_f/20111124/20111124214739.png
では早速FFTにかけてみましょう(*゚Д゚)クワッ
ここでFFT関数の引数は振幅の配列Lsのみで,サンプリング間隔には依存しないことに注意しましょう
FFTの結果と周波数fで二次元配列Fを作成します(%o11)
これを横軸にf, 縦軸に振幅として%t12にプロットします
縦軸横軸共に対数軸としたものを%t13にプロットします


これより,8Hz, 40Hz, 400Hz の周波数成分が卓越していることが解ります


追記
%t10のグラフを眺めると,隣り合う頂点との長さ(周期)がおよそ0.12sなので
周波数は1/0.12 = 8.33[Hz]となり,一次の周波数成分と大体合っていますね