FFTWマニュアル
FFTWのマニュアルらしきものを作ったのであげておきます。ちなみに翻訳間違いとかあってもサポートは…たぶんできないんじゃないかなぁ。
でもつっこみはうれしいかもです。
FFTWはC++のFFT変換(高速フーリエ変換)を提供するライブラリです。http://www.fftw.org/にソースやドキュメントがありますのでそちらを参照してください。また、http://hyperion.ie.isenshu-u.ac.jp/ucc/hint/hint_extend_soft.htmやhttp://www.sip.eee.yamaguchi-u.ac.jp/kou/fftw.htmlの日本語の解説ページも参考にしてみてください。
- 1次元複素配列についてFFT変換する
まずは一次元の数値配列に関してFFT変換をする方法について説明します。
//サンプル #include<fftw3.h> { //数値配列の宣言 fftw_complex *in,*out; //フーリエ変換設定の宣言 fftw_plan p; //数値配列用のメモリの確保 in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N); out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N); //入力に値を挿入 //フーリエ変換の設定 p = fftw_plan_dft_ld(N,in,out,FFTW_FORWARD,FFTW_ESTIMATE); … //フーリエ変換の実行 fftw_execute(p); … //メモリの解放 fftw_destroy_plan(p); fftw_free(in); fftw_free(out); }
説明
まずfftwのヘッダ(fftw3.h)をインクルードします。
次に入力・出力用に配列、及びプランの宣言をします。今回は値が複素数であるとしましょう。
数値配列のメモリを確保します。このfftw_mallocは「メモリーの確保」を提供するmallocとほとんど同じ仕様になっています。
入力用の数値配列に値を挿入していきます。fftw_complexはデフォルトではサイズが2の配列になっています。たとえば
fftw_complex z; z[0] = 1; z[1] = 2; //z = 1+2i
となります。
次にフーリエ変換の設定(plan)の設定をします。fftw_planはフーリエ変換の設定を持つクラスです。fftw_plan_dft_ld();は引数に設定値を入れてfftw_planを作成し、返す関数です。
fftw_plan fftw_plan_dft_1d( int N, fftw_complex *in, fftw_complex *out, int sign ,unsigned flags)
最初の引数、Nはフーリエ変換したい配列の要素数です。それゆえにint型で指定してください。FFT変換はフーリエ変換を最速で行う方法ですが、それでもオーダーはO(n log n)です。第二引数、第三引数は数値配列の入力・出力のポインタです。先ほど宣言したポインタを設定します。第四引数は数値にたいしてどっち向きにフーリエ変換を行うか指定するものです。FFTW_FORWARDまたはFFTW_BACKWARDのいずれかになります。FFTW_FORWARDはフーリエ変換FFTW_BACKWARDは逆フーリエ変換となります。最後のflagsは、FFTW_MEASUREかFFTW_ESTIMATEのどちらかになります。FFTW_MEASUREは処理の時間を測定し、毎回最適化を行わせます。FFTW_ESTIMATEはそんなことは一切せず予測して適当に値を決めてフーリエ変換します。要は、同じサイズの処理を毎回行い、初期化の時間を気にしないならFFTW_MEASUREを指定し、そうでないのならFFTW_ESTIMATEをしろ、ということです。通常はFFTW_ESTIMATEを利用するとのことです。FFTW_MEASUREの作業中は*in,*outともに上書きされるので、あらかじめ初期化しておいてやる必要があります。
fftw_executeはフーリエ変換を実際に行う関数です。fftw_planのインスタンスは一度設定したら何度でも実行できます。好きなだけfftw_executeを呼び出してください。
最後にメモリの解放を忘れないでください。
2次元以上の複素配列についてFFT変換する
基本的には1次元配列のときと同じです。
fftw3.hをincludeし、fftw_complex *in,*outを宣言し、fftw_mallocでサイズを確保します。1次元のときと異なるのはフーリエ変換の設定です。
二次元の場合は
fftw_plan fftw_plan_dft_2d(int nx , int ny , fftw_complex *in , fftw_complex *out , int sign , unsigned flags)
三次元の場合は
fftw_plan fftw_plan_dft_3d(int nx , int ny , int nz , fftw_complex *in , fftw_complex *out , int sign , unsigned flags)
多次元の場合は
fftw_plan fftw_plan_dft_3d(int rank , const int *n , fftw_complex *in , fftw_complex *out , int sign , unsigned flags)
です。
rankは何次元か、を示します。nx,ny,nzや*nは軸の要素数を示します。*nには要素数の配列を与えてください。
//サンプル #include<fftw3.h> { //数値配列の宣言 fftw_complex *in,*out; //フーリエ変換設定の宣言 fftw_plan p; //数値配列用のメモリの確保 in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * nx * ny); out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * nx * ny); //入力に値を挿入 //フーリエ変換の設定 p = fftw_plan_dft_2d(nx,ny,in,out,FFTW_FORWARD,FFTW_ESTIMATE); … //フーリエ変換の実行 fftw_execute(p); … //メモリの解放 fftw_destroy_plan(p); fftw_free(in); fftw_free(out); }