Linuxサーバ奮戦記 --- FFTW ---  22Nov2008   >>TOP

フーリエ変換(FFT:Fast Fourier Transform)なるものを考えてみようと思って探してみたが,殆んどがCで書かれているので僕には判りません。何をしたいかというと,時系列データがある特定の周期を持った波から出来ているとすれば,その周波数を知ることが可能になるということ。
ライブラリーとして FFTW(http://www.fftw.org/)をインストールすることにする。
C言語でフーリエ変換のサイトのソースを参考にして,コンパイルしWEBブラウザ上で実行させることを考えてみた。
PHPの exec で実行させて一次元FFTを(ASCII)出力し,Jpgraphでグラフ化してみる。

時系列データとして適当な物が無いかと探してみたけど・・・,気象庁過去の気象データをサンプルとして確認してみることに。
ここ10年位頃から1時間毎の気温が収録されていた。試しに京都の2000~2007年分をFFTにかけてみる。(一点未観測があったような~)

他に手頃なデータとして正弦波にランダムノイズを加えて時系列データを作って,FFTを計算する簡単なプログラムも作ってみた。


FFTWのインストール

/usr/local/src 以下で作業をするとして。

# tar zxvf fftw-3.2.tar.gz
# cd fftw-3.2
# ./configure
# make
# make install


コンパイル

ユーザディレクトリ内にソースを置き,コンパイルする。実行プログラムをFFTWとして作成している。
ソース: fftw3.c (http://www.cs.miyazaki-u.ac.jp/~date/lectures/fftw/ を参考)

$ gcc -o FFTW fftw3.c -lm -lfftw3


PHPで実行

FFTWと同じところにPHPで実行するHTMLファイルを置く(exec_fftw.php)。
<?

exec("./FFTW > fft.dat");
header("Location: plot.php");

?>
wave.txt(京都の2000~2007年までの気温データ) を FFTW で実行させ結果を fft.dat に出力し,plot.php(JpGraphで出力) でグラフを書かせる。




出力結果

興味深い結果が得られ,メインのピークとして以下のような周波数が求まった。
  • f1 = 3.17x10-8 [Hz]
  • f2 = 1.16x10-5 [Hz]
  • f3 = 2.31x10-5 [Hz]
  • f4 = 3.47x10-5 [Hz]
  • f5 = 4.63x10-5 [Hz]

これらの逆数をとると周期が求まる。秒となるので,時間に変換(1/3600)すると以下の様になる。
  • T1 = 1/f1 = 8765.875 [時間] => 8765.875/24 => 365.2 [日]
  • T2 = 1/f2 = 24.0 [時間]
  • T3 = 1/f3 = 12.0 [時間]
  • T4 = 1/f4 = 8.0 [時間]
  • T5 = 1/f5 = 6.0 [時間]




今回得られた結果はあくまでも参考であって,数値・データおよび情報に関して保証するものではありません。ご利用に伴って発生した不利益や問題について,何ら責任を負いません。