「Complex Multi-Dimensional DFTs」の編集履歴(バックアップ)一覧はこちら

Complex Multi-Dimensional DFTs」(2009/03/23 (月) 01:36:41) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

* 複素多次元離散フーリエ変換 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使用上の注意]]

表示オプション

横に並べて表示:
変化行の前後のみ表示: