「Complex Multi-Dimensional DFTs」の編集履歴(バックアップ)一覧はこちら
追加された行は緑色になります。
削除された行は赤色になります。
* 複素多次元離散フーリエ変換 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]変換を示します。
これらの変換は、&color(red){C標準の列メジャー順}(※1)で規定される連続な配列で扱われます。したがって、最後の次元のインデクスが最も速く変わります。このメモリ配置については、3.2節[[Multi-dimensional Array Format>>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>>FFTW Reference]]を参照してください。
(※1) [[列メジャー>FFTW使用上の注意]]
* 複素多次元離散フーリエ変換 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]変換を示します。
これらの変換は、&color(red){C標準の行メジャー順}(※1)で規定される連続な配列で扱われます。したがって、最後の次元のインデクスが最も速く変わります。このメモリ配置については、3.2節[[Multi-dimensional Array Format>>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>>FFTW Reference]]を参照してください。
(※1) [[行メジャー>FFTW使用上の注意]]