2014年5月19日月曜日

IDLで離散フーリエ変換

クソ雑魚なんでメモしておきます。

これみたいな一定間隔で取られたデータをIDLで離散フーリエ変換する方法。自分で調べたけど全くわからなくて温まった。

データはが1列で6480行ずーーーーーっと値が続いてるやつ。↑の図。これをIDLで離散フーリエ変換する。

IDL> openr,1,'data.dat'                                ;データのdatファイルを開く
IDL> input=DblArr(1,6480)                        ;インプットさせる配列、Arrayを用意する
IDL> readf,1,input                                       ; inputにデータを読ませる
IDL> close,1                                                ; datを閉じる
IDL> result=Abs(fft(input))                   ; フーリエ変換してそのパワーをresultに入れる

IDL> freq=findgen(6480)/(6480*40.)*1e6 ;findgenで1から6480まで数を作って周波数変換で6480*40とする。後ろの1e6はμHzで見るために。ここでポイントは40.とドットを打つこと。打たないと整数と思ってくれない。あと10^6じゃだめだった。1e6とする。
IDL> output=plot(freq,result,/ylog)      ; outputって名前のところにplotする。plot(x,y,option)。

これで

となる。画像の保存のコマンドもあるだろうけど、ちょっと今はわからないのでwindowに出てきた保存ボタンで保存した。

普通のfftコマンドというかプロシージャーで出てくるアウトプットは
(    0.0135218,      0.00000)(   0.00441036,  -0.00179633)
って感じでカッコつきでしかも2列。これは実部と虚部。あとフーリエ変換後の図を見るとわかるんだけど、ちょうど中心に対して軸対称。これは
FD(ω+2ωnyq)=FD(ω)、FD(2ωnyq-ω)=F*D(ω)
で中心に対して複素共役になっているから。ここらへんは勉強不足なので。わかりません。