※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。


複素離散フーリエ変換


fftw_plan fftw_plan_dft_1d( int n,
                            fftw_complex *in, fftw_complex *out,
                            int sign, unsigned flags );
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 );

 複素数を入出力とする、0次元または多次元の離散フーリエ変換(DFT)をおこない、fftw_planを返り値として返します(4.2章プランの利用参照)。
 一たび、特定の型及びパラメータに対しプランを作り、その後同じ型、パラメータに対する異なるプラン(ただし対象とする配列が異なるもの)を生成すれば、プラン生成は高速におこなわれ、最初のプランと同じデータは共有されます(仮に最初のプランがまだ存在すれば)。

 プランナーは、プランの生成に失敗すればNULLを返します。
FFTWの設定をカスタマイズして、特定の変換を行うようにしない限りベーシックインターフェースは常にNULLでない値を返します。

引数

rank

ランク(rank)は変換の次元(配列*nのサイズであるはずです)であり、任意の非負整数をとりえます。"_1d","_2d","_3d"のプランナーはそれぞれrankが1,2,3に対応します。rankが0は、サイズ1の変換に対応し、これはすなわち1つの数を入力から出力へコピーとなります。

n, nx, ny, nz, n[rank]

nまたは、nx,ny,nzもしくは、n[rank]はそれぞれ変換の次元のサイズを与え、任意の非負整数をとりえます。
  • 多次元の配列は列メジャー順で次元が格納されます。すなわちnx x ny、あるいはnx x ny x nz、あるいはn[0] x n[1] x ... n[rank-1]という順です。詳細は3.2章の多次元配列のフォーマット参照。
  • FFTWは配列サイズが2^a3^b5^c7^d11^e13^fの時に、一番性能が発揮され
ます。ただし、e+fは、0か1で他の係数(a,b,c,d)は任意です。他のサイズの時は、一般的なアルゴリズムを用いた遅いアルゴリズムで計算されます(それでも遅くてもO(nlogn)の次元です)。FFTWを違うサイズ用にカスタマイズすることもできるので、必要なら8章のInstallation and Customizationを参照してください。2の階乗のサイズの変換はとりわけ高速に計算できます。

in, out

inとoutは変換の入力および出力の配列を表し、同じものを取りえます(in-place変換)。これらの配列は、FFTW_ESTIMATEフラグが使われない限り、プラン生成の際に値が上書きされます。(配列は初期化する必要はないが、確保する必要があります)。
in == outの時には、変換はin-placeとなり、入力配列は上書きされます。in != outであれば、2つの配列はメモリ領域が重なってはいけません(FFTWはこの条件はチェックしません)。

sign

signはフーリエ変換を定義するエクスポーネントです。-1(=FFTW_FOWRARD)もしくは+1(FFTW_BACKWARD)の値をとります。

※変換の方向と考えてよい

flags

flagはビットごとのORで構成されるゼロ以上のフラグです。24ページの4.3.2章のプランナーフラグで定義されます。

FFTWの演算では規格化がされません 。すなわち、逆変換を行った後、正変換(またはその逆)を行うと、計算結果は元のデータを変換のサイズ倍(配列の次元の積)されます。より詳しい情報は、4.7章のWhat FFTW Really Computesを参照してください。