全般
# スケーリング
変換の結果は配列のスケール倍される。
プラン生成
プラン生成は、原則的にデータの”メモリ空間”に対して行われ、
(これは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