「Real-Data DFTs」の編集履歴(バックアップ)一覧はこちら
「Real-Data DFTs」(2009/03/24 (火) 13:10:05) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
[[FFTWマニュアル]] - [[FFTWリファレンス>FFTW Reference]] - [[ベーシックインターフェース>>Basic Interface]] - [[実データ離散フーリエ変換>>Real-Data DFTs]]
* 実データ離散フーリエ変換 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節の[[プランの利用>>Using Plans]]参照)。
いったんある変換タイプおよびパラメータのプランを生成すれば、異なる配列に対して、同じタイプおよびパラメータのプランを生成する際に、高速にプランが生成され、定数は共有されます(もし存在すれば)。
プランナーはプランが生成できなかったとき、返り値として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]はそれぞれ変換の次元の&i(){論理的}サイズを与え、任意の非負整数をとりえます。これは一般的に、&i(){物理的}配列次元とはことなります。これについては4.3.4章の[[実データ離散フーリエ変換配列形式>>Real-data DFT Array Format]]に記されています。
- 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変換の&i(){最後の}次元が偶数であるときに効果があるということになります。
*** in,out
inとoutは変換の入力および出力の配列を表し、同じものを取りえます(in-place変換)。これらの配列は、FFTW_ESTIMATEフラグが使われない限り、プラン生成の際に値が上書きされます。(配列は初期化する必要はないが、確保する必要があります)。入出力が同じであるin-place変換の時は、実配列はパディングが必要です。これについては4.3.4章の[[実データ離散フーリエ変換配列様式>>Rea-data DFT Array Format]]に記されています。
*** flags
flagはビットごとのORで構成されるゼロ以上のフラグです。24ページの4.3.2章の[[プランナーフラグ>>Planner Flags]]で定義されます。
逆変換については、複素数の入力(エルミート配列の論理的に半分のサイズに非冗長に格納されているもの)をとり、実数を出力とする以下のようなものです。
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変換と、まったく同じです。
&color(red){FFTWの変換結果は正規化されていません}
[[FFTWマニュアル]] - [[FFTWリファレンス>FFTW Reference]] - [[ベーシックインターフェース>>Basic Interface]] - [[実データ離散フーリエ変換>>Real-Data DFTs]]
* 実データ離散フーリエ変換 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節の[[プランの利用>>Using Plans]]参照)。
いったんある変換タイプおよびパラメータのプランを生成すれば、異なる配列に対して、同じタイプおよびパラメータのプランを生成する際に、高速にプランが生成され、定数は共有されます(もし存在すれば)。
プランナーはプランが生成できなかったとき、返り値として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]はそれぞれ変換の次元の&i(){論理的}サイズを与え、任意の非負整数をとりえます。これは一般的に、&i(){物理的}配列次元とはことなります。これについては4.3.4章の[[実データ離散フーリエ変換配列形式>>Real-data DFT Array Format]]に記されています。
- 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変換の&i(){最後の}次元が偶数であるときに効果があるということになります。
*** in,out
inとoutは変換の入力および出力の配列を表し、同じものを取りえます(in-place変換)。これらの配列は、FFTW_ESTIMATEフラグが使われない限り、プラン生成の際に値が上書きされます。(配列は初期化する必要はないが、確保する必要があります)。入出力が同じであるin-place変換の時は、実配列はパディングが必要です。これについては4.3.4章の[[実データ離散フーリエ変換配列様式>>Rea-data DFT Array Format]]に記されています。
*** flags
flagはビットごとのORで構成されるゼロ以上のフラグです。24ページの4.3.2章の[[プランナーフラグ>>Planner Flags]]で定義されます。
逆変換については、複素数の入力(エルミート配列の論理的に半分のサイズに非冗長に格納されているもの)をとり、実数を出力とする以下のようなものです。
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変換と、まったく同じです。
&color(red){FFTWの演算では規格化がされません}。すなわち、c2r変換を行った後、r2c変換(またははその逆)を行うと、計算結果は元のデータを変換のサイズ倍(配列の論理的次元の積)されます。r2c変換は、同じ入力を用いて、複素離散フーリエ変換のでFFTW_FORWARDとした時と、同じ結果になり、c2r変換はFFTW_BACKWARDに対応します。より詳しい情報は、4.7章の[[What FFTW Really Computes>>What FFTW Really Computes]]を参照してください。