複素多次元離散フーリエ変換 Complex Multi-Dimensional DFTs
多次元変換も、一次元の変換とほとんど同じように動きます。すなわち、まずfftw_complexの配列のメモリを確保し、(fftw_mallocの使用を推奨)、次にfftw_planを作成し、3番目に、fftw_execute(plan)を必要な回数実行し、最後にfftw_destroy_plan(plan)とfftw_freeでメモリの解放を行います。唯一の違いは、プランを作るときに使うルーチンだけです。
すなわち、
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(int rank, const int *n,
fftw_complex *in, fftw_complex *out,
int sign, unsigned flags);
となっています。
これらのルーチンはnx×nyの2次元(2d)変換、nx×ny×nzの3次元(3d)変換、そして任意のサイズの変換をそれぞれ表します。
3番目のfftw_plan_dftのケースでは、nは配列n[rank]へのポインタです。配列n[rank]は、n[0]×n[1]×...×n[rank-1]変換を示します。
ここまでで、全てのプラン生成のルーチンが、機能的に重複していることにお気づきかもしれません。例えば、1次元や2次元変換のプランを立てるのには、fftw_plan_dftのランク1か2をつかっても良いでしょうし、あるいは、fftw_plan_dft3dでnxとny(かnxまたはny)を1にしたってよいでしょう(こうしても、パフォーマンスの低下は一切起きません)この傾向は、他に対しても同じで、FFTWのプラン作成ルーチンは、概して”半順序”で、さまざまなインターフェースで、一般性が増せば、それに応じて複雑さも増します。
fftw_plan_dftは、このチュートリアルで述べた中で、もっとも一般的な複素離散フーリエ変換のルーチンです。しかし、これに加え、アドバンストインターフェース、グルインターフェースというものもあって、それらを使えば、複数の変換、あるいはstrided transformを、効率的に1つのFFTWプランでまとめることや、多次元の大きい配列の一部の変換や、さらに、より一般的な形式を扱うことができます。
詳細な情報は、4章の
FFTW Referenceを参照してください。
最終更新:2009年03月23日 01:36