複素多次元離散フーリエ変換 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]変換を示します。

 これらの変換は、C標準の行メジャー順(※1)で規定される連続な配列で扱われます。したがって、最後の次元のインデクスが最も速く変わります。このメモリ配置については、3.2節Multi-dimensional Array Formatを参照してください。

 ここまでで、全てのプラン生成のルーチンが、機能的に重複していることにお気づきかもしれません。例えば、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