実データ離散フーリエ変換 Real-Data DFTs


fftw_plan fftw_plan_dft_r2c_1d( int n, 
                                double *in, fftw_complex *out,
                                unsigned flags );
fftw_plan fftw_plan_dft_r2c_2d( int nx, int ny, 
                                double *in, fftw_complex *out,
                                unsigned flags );
fftw_plan fftw_plan_dft_r2c_3d( int nx, int ny, int nz, 
                                double *in, fftw_complex *out,
                                unsigned flags );
fftw_plan fftw_plan_dft_r2c( int rank, const int *n, 
                             double *in, fftw_complex *out,
                             unsigned flags );

実数入力/複素数出力の0次以上の離散フーリエ変換(DFT)のプランをたてて、fftw_planを返します(4.2節のプランの利用参照)。

いったんある変換タイプおよびパラメータのプランを生成すれば、異なる配列に対して、同じタイプおよびパラメータのプランを生成する際に、高速にプランが生成され、定数は共有されます(もし存在すれば)。

プランナーはプランが生成できなかったとき、返り値としてNULLを返します。そして、ベーシックインターフェースでは、FFTWをある制限された変換群をサポートする設定にカスタマイズするか、入出力が異なるout-of-placeのc2r多次元変換でFFTW_PRESERVE_INPUTフラグを使わない限り、返り値としてNULLでない値を返します。

引数 Arguments

rank

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

nまたは、nx/ny/nzまたは、n[rank]

nまたは、nx,ny,nzもしくは、n[rank]はそれぞれ変換の次元の論理的サイズを与え、任意の非負整数をとりえます。これは一般的に、物理的配列次元とはことなります。これについては4.3.4章の実データ離散フーリエ変換配列形式に記されています。

  • FFTWは配列サイズが2^a3^b5^c7^d11^e13^fの時に、一番性能が発揮され
ます。ただし、e+fは、0か1で他の係数(a,b,c,d)は任意です。他のサイズの時は、一般的なアルゴリズムを用いた遅いアルゴリズムで計算されます(それでも遅くてもO(nlogn)の次元です)。FFTWを違うサイズ用にカスタマイズすることもできるので、必要なら8章のInstallation and Customizationを参照してください。2の階乗のサイズの変換はとりわけ高速に計算でき、それは一般的にr2c/c2r変換の最後の次元が偶数であるときに効果があるということになります。

in,out

inとoutは変換の入力および出力の配列を表し、同じものを取りえます(in-place変換)。これらの配列は、FFTW_ESTIMATEフラグが使われない限り、プラン生成の際に値が上書きされます。(配列は初期化する必要はないが、確保する必要があります)。入出力が同じであるin-place変換の時は、実配列はパディングが必要です。これについては4.3.4章の実データ離散フーリエ変換配列様式に記されています。

flags

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


逆変換については、複素数の入力(エルミート配列の論理的に半分のサイズに非冗長に格納されているもの)をとり、実数を出力とする以下のようなものです。

fftw_plan fftw_plan_dft_c2r_1d( int n,
                                fftw_complex *in, double *out,
                                unsigned flags );
fftw_plan fftw_plan_dft_c2r_2d( int nx, int ny,
                                fftw_complex *in, double *out,
                                unsigned flags );
fftw_plan fftw_plan_dft_c2r_3d( int nx, int ny, int nz,
                                fftw_complex *in, double *out,
                                unsigned flags );
fftw_plan fftw_plan_dft_c2r( int rank, const int *n
                             fftw_complex *in, double *out,
                             unsigned flags );

引数は、入出力のデータ形式が逆になっているところ以外はr2c変換と、まったく同じです。

FFTWの演算では規格化がされません。すなわち、c2r変換を行った後、r2c変換(またははその逆)を行うと、計算結果は元のデータを変換のサイズ倍(配列の論理的次元の積)されます。r2c変換は、同じ入力を用いて、複素離散フーリエ変換のでFFTW_FORWARDとした時と、同じ結果になり、c2r変換はFFTW_BACKWARDに対応します。より詳しい情報は、4.7章のWhat FFTW Really Computesを参照してください。
最終更新:2009年03月24日 13:10