全般

# スケーリング
変換の結果は配列のスケール倍される。

プラン生成

プラン生成は、原則的にデータの”メモリ空間”に対して行われ、
(これはFFTWのバージョン3になってから大きく変更されたポイントである。)
プラン生成時には、計算時間の最適化などを行うので、多少時間がかかる。
したがって、繰り返し計算を行う時には、一度生成したプランを繰り返し使うことが推奨されている。

すると、例えば、同じサイズの入力データが複数あるとき、一度プランを生成してから、プラン生成時に指定したメモリ空間にデータをコピーして演算を行うことが考えられる。

この際、プラン用のメモリ空間が、”バッファ”として余分に消費されることになるので、多くのメモリを必要とする場合には検討が必要だ。
また、ここまででプランは特定の”メモリ空間”に対して生成されると述べたが、データサイズが同じ、などの制約下であれば、他のメモリ空間に対してプランを再利用する関数も存在する。

また、プラン生成時に入出力配列は上書きされることがある。フラグの設定をよく確認しよう。面倒だったら、入力配列はプラン生成後の初期化するよう心がけよう。

データのメモリ空間上の並び(行メジャー)

FFTWのデータはrow-major(行メジャー)で考えられて作られている。
行メジャーとは、最後の配列が、もっともはやく変化する順序である。

int a[SIZEX][SIZEY];

というものがあったとすると、メモリ空間では、

a[0][0],a[0][1],・・・,a[1][0],・・・,a[SIZEX-1][SIZEY-1]

のように並ぶ。

利用上は、column-major(列メジャー)でも構わないが注意が必要である。

すると、利用者は、int a[SIZEY][SIZEX]のつもりなのに、FFTWは、int a[SIZEX][SIZEY]だと思っているので、


のようにパラメータのヒントなどで誤解を招く表現が生じる。
要注意である。

このページでは、画像データなどを扱うことを考え、FFTWの推奨ではないのを承知で、列メジャーのデータを扱うコードに統一することとする。

行メジャー(row-major)ーと列メジャー(column-major)

実数->複素数/複素数->実数変換

最終更新:2009年03月23日 01:51
添付ファイル