FFTWマニュアル

FFTWのマニュアルらしきものを作ったのであげておきます。ちなみに翻訳間違いとかあってもサポートは…たぶんできないんじゃないかなぁ。
でもつっこみはうれしいかもです。

FFTWはC++FFT変換(高速フーリエ変換)を提供するライブラリです。http://www.fftw.org/にソースやドキュメントがありますのでそちらを参照してください。また、http://hyperion.ie.isenshu-u.ac.jp/ucc/hint/hint_extend_soft.htmhttp://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);
}