ライセンス | GPL |
URL | http://www.fftw.org/ |
フーリエ変換を行うライブラリです。
フーリエ変換の性質上複素数がでてくるので、そのあたりが少しややこしい、、、。
コンパイル
ver. 3.0.1
./configure --prefix=/c/mingw
→ make
で問題ないはずです。
ですが、DLLは作られません。
インクルード、リンク
インクルードは”fftw3.h”だけでOK。リンクオブジェクトはlibfftw3.aをリンクします。
基本的使用方法
2次元ならば大体以下のようなコードで事足ります。
#include <fftw3.h> int main( int argc, char *argv[] ) { fftw_complex *in, *out; fftw_plan p; int i; unsigned int uiImageLength, uiImageWidth; /* 領域の確保 */ in = fftw_malloc( uiImageLength * uiImageWidth * sizeof(fftw_complex) ); out = fftw_malloc( uiImageLength * uiImageWidth * sizeof(fftw_complex) ); /* inの実部に画像を詰め込む*/ /* プランの作成 */ p = fftw_plan_dft_2d( uiImageLength, uiImageWidth, in, out, FFTW_FORWARD, FFTW_ESTIMATE ); /* フーリエ変換の実行 */ fftw_execute( p ); /* プランの消去 */ fftw_destroy_plan( p ); /* FFT係数の正規化 */ for ( i = 0; i < uiImageLength * uiImageWidth; i++ ) { out[i][0] /= uiImageLength*uiImageWidth; out[i][1] /= uiImageLength*uiImageWidth; } /* 逆変換 */ p = fftw_plan_dft_2d( uiImageLength, uiImageWidth, out, in, FFTW_BACKWARD, FFTW_ESTIMATE ); /* 領域の開放 */ fftw_free( in ); fftw_free( out ); return 0; }
データ型
fftw_complex
型は、double[2]
で、[0]は実部、[1]は虚部になっています。変換前に実数データをコピーするのは、[0]のほうで、[1]は0.0を入れておきます。
FFT変換の出力
FFTWで変換した結果は、複素数として出力されるのですが、「正規化はされていない」だそうで、
データを正規化するには、各データをデータ個数で割ればいいらしいです。
これをしないと、変換→逆変換でもとの画像を再構成できません。
そのほか
fftw_plan_dft_*()の最後の引数は、通常FFTW_ESTIMATEで問題ないらしいですが、
よくわかりませんがそのほかのモードもあります。
2次元配列を指定することもできますが、この場合配列順は添え字の後ろが先になります。
これはおそらく処理を高速にするためです。