How to use FFTW

fortranからfftwを呼び出す方法を紹介します。 プログラムの流れとしては

  • 1. ライブラリの読み込み
  • 2. 変数の定義
  • 3. プラン(計画)をたてる
  • 4. 実行
  • 5. 終了

という順番です。これはC言語の場合と同じです。次のプログラムはsin(3x)をフーリエ変換したプログラムです。fftwに関係するところだけbold typeにしてあります。

   fftw_f

次に変数の定義です。sin(3x)は実数データなのでdouble型で定義出来ますが変換されたデータは複素数なのでcomplex*16を用います。

次にftwを読み込みます。読み込みにはinclude文を使います。

次にplan(計画)をたてます。fftwはplanで管理しており、どの配列にどのような変換を施し、どこに出力するかという情報を始めに定義します。この役割をplanが担っています。 まず、planをたてるために変数を定義します。planの型はinteger(8)です。integer(4)でないことに注意してください。

そしてプランをたてます。今、1次元実数データをフーリエ変換して1次元複素数データに出力したいのでdfftw_plan_dft_r2c_1dという関数を用います。

call dfftw_plan_dft_r2c_1d(N, in, out, FFTW_ESTIMATE)

関数には配列の要素数、入力データ、出力データをいれます。最後のFFTW_ESTIMATEはおまじないだと思ってもらって大丈夫です。また、関数名の’r2c’は実数から複素数、’1d’は1次元を表しています。例えば二次元にする場合は’1d’を’2d’に、逆変換で戻す場合には’r2c’を’c2w’にするといった具合で変換することができます。またC言語と違い、関数ではなくサブルーチンであること、名前が’fftw’でなく’dfftw’で始まることに注意してください。

これで計画がたてられたのであとは実行です。実行は以下のようにします。

fftw_execute(p)

このように実行する内容はすべてplanで決められています。他の配列についてフーリエ変換を行いたい場合はそれぞれに対してplanを作る必要があります。また、同じ配列に対して同じフーリエ変換を行う場合には同じplanを使うことが出来ます。

最後に使わなくなったプランは'fftw_destruct_plan(p)で解放します。

トップへ戻る

Hiroyuki R. Takahashi