FFTW@wiki
http://w.atwiki.jp/amaeda/
FFTW@wiki
ja
2009-07-04T23:17:14+09:00
1246717034
-
Real-to-Real Transforms
https://w.atwiki.jp/amaeda/pages/60.html
[[FFTWマニュアル]] - [[FFTWリファレンス>FFTW Reference]] - [[ベーシックインターフェース>>Basic Interface]] - [[実数から実数への変換>>Real-to-Real Transforms]]
* 実数から実数への変換 Real-to-Real Transforms
2009-07-04T23:17:14+09:00
1246717034
-
Real-data DFT Array Format
https://w.atwiki.jp/amaeda/pages/59.html
[[FFTWマニュアル]] - [[FFTWリファレンス>FFTW Reference]] - [[ベーシックインターフェース>>Basic Interface]] - [[実データ離散フーリエ変換配列様式>>Real-data DFT Array Format]]
* 実データ離散フーリエ変換配列様式
実データの離散フーリエ変換出力(r2c変換)は、対称性を持つ。つまり、原則的には、2倍の冗長性を持つ(4.7節[[What FFTW Really Computes>>What FFTW Really Computes]]参照)。(逆c2r変換の入力も、同様)。実際のところ、これらの冗長性の排除を、効果的かつ理解しやすい形式(多次元変換の一般化するもの)で行うことを、完全に実現することは不可能である。その代わりに、r2c変換の出力は、対応する複素変換の出力の半分を&italic(){わづかに}超える。データはいかなる方法でも”圧縮”せず、通常のfftw_complex値の配列として、格納している。実際のところ、このデータは対応する複素変換の配列の一部分である。
具体的にいえば、d(=ランク)次元の n1 x n2 x n3 x ... x nd の実変換では、複素データは、fftw_complex値で、n1 x n2 x n3 x ... x (nd/2 + 1)の行メジャー形式の配列である(割り算の余りは切り捨て)。つまり、我々は通常の複素変換で得られるデータの最後の次元の、小さいほうの半分(非負周波数)、に加えて1要素しか保存していません。(他の次元を半分にすることも可能でしたが、実装が最も簡単だったため、最後の次元を半分にしました)。
入出力が異なる、アウトオブレイス変換では、実データは単なる配列で、物理次元 n1 x n2 x n3 x ... x nd(列メジャー形式)となっています。
入出力が同じである、インプレイス変換では、いくつか複雑な問題が生じます。というのも、複素データは、実データより僅かに大きいためです。このケースでは、実データの最後の次元は、必ず&italic(){余白}がとられている必要があり、そこには追加の余分な値が格納されます。--最後の次元が偶数であれば、2つの追加、奇数であれば1つの追加データで
2009-07-04T23:13:43+09:00
1246716823
-
Real-Data DFTs
https://w.atwiki.jp/amaeda/pages/58.html
[[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]]参照)。
いったんある変換タイプおよびパラメータのプランを生成すれば、異なる配列に対して、同じタイプおよびパラメータのプランを生成する際に、高速にプランが生成され、定数は共有されま
2009-03-24T13:10:05+09:00
1237867805
-
Planner Flags
https://w.atwiki.jp/amaeda/pages/57.html
[[FFTWマニュアル]] - [[FFTWリファレンス>FFTW Reference]] - [[ベーシックインターフェース>>Basic Interface]] - [[プランナーフラグ>>Planner Flags]]
* プランナーフラグ Planner Flags
FFTWのすべてのプラン生成ルーチンは、整数のflags引数をとり、これは以下で定義される0個以上のビット毎定数フラグの、のOR('|')となります。これらのフラグは、プラン生成の計算の厳密性(および時間)に関係し、同時にまた、使われる変換アルゴリズムに制限を加えることも可能です。
&i(){重要} : &color(red){プラン生成時に、入力配列は上書きされます}。したがって、&color(red){プラン生成の後に入力配列の初期化を行う}必要があります。これは、FFTW_ESTIMATEフラグを宣言することによってのみ、回避可能です。
** プラン生成のの厳密さにかかわるフラグ Planning-rigor flags
*** FFTW_ESTMATE
FFTW_ESTIMATEは、異なるアルゴリズムを用いたときの計算時間を実測する代わりに、ヒューリスティックかつ高速にプランを決めます(このプラン選択は、おそらく準最適でしょう)。
このフラグを使えば、入出力配列はプラン生成時には上書きされません。
*** FFTW_MEASURE
FFTW_MEASUREは、実際にいくつかのFFTを計算し実行時間を計測することによって、最適なプランを探索します。ご使用の計算機によって、この操作にはしばし時間がかかるかもしれません(ほとんどの場合2,3秒)。FFTW_MEASUREは、標準のプラン生成オプションです。
*** FFTW_PATIENT
FFTW_PATIENTは、FFTW_MEASUREと似ていますが、より広範囲のアルゴリズムを考慮にいれるため、"より最適な"プランを生成します(特に大きいサイズの変換の場合)。しかし、プラン生成にかかる時間はいくらか長くなります(特に大きいサイズの変換の場合)。
*** FFTW_EXHAUSTIVE
FFTW_EXHAUSTIVEはFFTW_PATIENTと似ていますが、さらに広範囲のアルゴリズムを考慮に
2009-03-22T23:38:42+09:00
1237732722
-
Complex DFTs
https://w.atwiki.jp/amaeda/pages/56.html
[[FFTWマニュアル]] - [[FFTWリファレンス>FFTW Reference]] - [[ベーシックインターフェース>>Basic Interface]] - [[複素離散フーリエ変換>>Complex DFTs]]
* 複素離散フーリエ変換
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章[[プランの利用>>Using Plans]]参照)。
一たび、特定の型及びパラメータに対しプランを作り、その後同じ型、パラメータに対する異なるプラン(ただし対象とする配列が異なるもの)を生成すれば、プラン生成は高速におこなわれ、
2009-03-24T12:57:27+09:00
1237867047
-
Basic Interface
https://w.atwiki.jp/amaeda/pages/55.html
[[FFTWマニュアル]] - [[FFTWリファレンス>FFTW Reference]] - [[ベーシックインターフェース>>Basic Interface]]
* ベーシックインターフェース Basic Interface
ベーシックインターフェースは、おそらく大多数のユーザーの要望を満たすもので、FFTWのサポートする全てのタイプの、単一の連続した配列の変換に関するプランナールーチンを提供します。
- [[複素離散フーリエ変換>Complex DFTs]]
- [[プランナーフラグ>>Planner Flags]]
- [[実データ離散フーリエ変換>>Real-Data DFTs]]
- [[実データ離散フーリエ変換の配列の形式>>Real-Data DFT Array Format]]
- [[実数から実数への変換>>Real-to-Real Transforms]]
- 実数から実数への変換種
2009-07-04T23:17:40+09:00
1246717060
-
Using Plans
https://w.atwiki.jp/amaeda/pages/54.html
[[FFTWマニュアル]] - [[FFTWリファレンス>FFTW Reference]] - [[プランの利用>>Using Plans]]
* プランの利用 Using Plans
FFTWにおけるすべての変換のプランは、fftw_plan型として(不透明なポインタ型)格納され、これからの節で述べる様々なルーチンによって生成されます。fftw_planは、変換を計算するのに必要なすべての情報を持っていて、たとえば入出力配列のポインタなどもそれに含まれます。
void fftw_execute( const fftw_plan plan );
上記によってプランが実行され、あらかじめ計画された配列に対する変換が計算されます(その配列はこの時、存在する必要があります)。プランに変更がなければ、fftw_executeは所望の回数だけ実行することができます。
既にあるプランを、違う配列に使いたいときは、グルインターフェースを使うことができます。これについては、4.5節のグルインターフェースを参照のこと。
fftw_execute(と同等の関数)は、FFTWがスレッドセーフであることを保証した唯一の関数です。これについては、5.2節のスレッドの安全性を参照のこと。
次の
void fftw_destroy_plan( fftw_plan plan );
は、プランと関連するデータを解放します。
FFTWのプランナーは、いくつかの持続性のあるデータをセーブしています。たとえば、蓄積されたwisdom(知)や、現在の設定で利用できるアルゴリズムの一覧などです。もしこれら全てを解放し、FFTWをプログラムを立ち上げたときの最初の状態に戻したい場合、
void fftw_cleanup( void );
を呼び出してください。
fftw_cleanupを呼び出したあとには、すべての現存するプランが未定義となり、プランを実行(execute)することも、破棄(destroy)することもすべきでありません。しかし、新しいプランに関しては、生成、実行/破棄することができて、FFTWは知(wisdom)の情報の蓄積が再び始まります。
fftw_cleanupは、プランを解放しません。したがっ
2009-01-22T23:46:59+09:00
1232635619
-
Memory Allocation
https://w.atwiki.jp/amaeda/pages/53.html
[[FFTWマニュアル]] - [[FFTWリファレンス>FFTW Reference]] - [[データタイプとファイル>>Data Types and Files]] - [[メモリ確保>>Memory Allocation ]]
* メモリ確保 Memory Allocation
void *fftw_malloc( size_t n );
void fftw_free( void *p );
これらは、mallocやfreeとほとんど同じ働きを持ちます。唯一、返り値のポインタがFFTWのすべてのアルゴリズム(例えばSIMD高速化)に必要な制約を満たすこちだけがことなります。3.1節の[[データの並び>Data Alignment]]も参照のこと。
&color(red){fftw_mallocで確保されたメモリは、通常のfreeではなく、fftw_freeで解放しなければいけません}。
これらのルーチンは、ただ単にユーザーのOSのmallocを呼び出し、必要であればメモリ配置がそろった同等の関数を呼びます(memalignなど)。したがって、通常は時間や空間のオーバーヘッドが著しく生じる心配はありません。また、データを確保するのに&color(red){必ずしもこの関数を呼び出す必要はありません}が、この方法を強く推奨します。
記:C++では、通常のmallocと同様に、fftw_mallocの出力を確保する型にキャストする必要があります。
2009-01-22T22:27:06+09:00
1232630826
-
Precision
https://w.atwiki.jp/amaeda/pages/52.html
[[FFTWマニュアル]] - [[FFTWリファレンス>FFTW Reference]] - [[データタイプとファイル>>Data Types and Files]] - [[精度>>Precisions ]]
* 精度 Precision
単精度、4倍精度(long-double)バージョンのFFTWをインストールすることもできます。これはそれぞれ、通常のdouble型の所を、floatとlong doubleにそれぞれ置き換えるものです。(詳細は8章の[[インストールとカスタマイズ>>Installation and Customization]])をご覧ください。これらのインターフェースを使うには、以下のようにすればよい。
- 単精度/4倍精度のライブラリにリンクする。Unixでは、&color(red){-lfftw3f}や&color(red){-lfftw3l}を-lfftw3の代わりにつければよい。(同時に違う精度のライブラリにリンクすることもできる)
- &color(red){同じヘッダ<fftw3.h>}をインクルードする
- すべての小文字の'fftw_'インスタンスを'fftwf_'や'fftwl_'にそれぞれ置き換える(前者が単精度、後者が4倍精度)。たとえば、fftw_complexはfftwf_complex、fftw_executeはfftwf_executeといった具合である。
- 大文字の名前(たとえばFFTW_で始まるもの)は、同じ名前のままにする
- サブルーチンのパラメータを、doubleをfloatやlong doubleにする
ご利用のコンパイラやハードウェアによって、long doubleはdoubleより精度がよくない場合があります(もしくは、全くサポートされてないかもしれません。C99では標準となっています。)
2009-01-22T22:10:23+09:00
1232629823
-
Complex numbers
https://w.atwiki.jp/amaeda/pages/51.html
[[FFTWマニュアル]] - [[FFTWリファレンス>FFTW Reference]] - [[データタイプとファイル>>Data Types and Files]] - [[複素数>>Complex numbers]]
* 複素数の取扱 Complex numbers
FFTWのインターフェースは、すべての浮動小数点数に、double精度を用いており、複素数を保持するfftw_complex型を以下のように定義しています
typedef double fftw_complex[2];
ここで、[0]の要素は実部、[1]の要素は虚部をそれぞれ表しています。
代替手段として、(gccのような)ANSI C標準のC99をサポートするCコンパイラがあれば、C言語の新しいネイティブな複素数型(バイナリとしては、上の型と同じ)も使うことができます。すなわち、#include <complex.h>を<fftw3.h>の&color(red){前に}インクルードすれば、fftw_complexが、ネイティブの複素数型として定義され、通常の数学で扱うことができるようになります(たとえば、x = y * (3+4*I)のように。xとyはfftw_complexでIは単位虚数記号)。
<以下、作業中。細かい話なので後回しにする予定>
C++は、自身でcomplex<T>というテンプレートクラスを持っており、これは標準ヘッダである<complex>で定義されています。伝えられるところによれば、C++標準委員会は、最近
2008-11-24T23:52:23+09:00
1227538343