FFTW
をテンプレートにして作成
[
トップ
|
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
]
開始行:
*[[FFTW:http://www.fftw.org/]] [#t3f818a1]
----
#contents
----
**Visual C++ でのインストール [#xe2296d0]
#include(build_fftw,notitle)
**実数データの多次元DFT [#a33d8ce3]
実数データの多次元DFTには以下のプランナを用いる.
fftw_plan fftw_plan_dft_r2c_2d(int n0, int n1, double *i...
fftw_plan fftw_plan_dft_r2c_3d(int n0, int n1, int n2, d...
fftw_plan fftw_plan_dft_r2c(int rank, const int *n, doub...
r2cはreal to complexのことであり,complex to real の場合...
2次元の場合,入力inにはn0×n1の2次元データがrow-major orde...
出力outにはn0×(n1/2+1)の大きさのfftw_complex型の配列のア...
プランナに渡すflagについては,[[Planner Flags:http://www....
出力のサイズが異なるのは,DFT変換後のデータがエルミート冗...
out[i]がout[n-i]の共役になっており,メモリの節約のために...
描画などでフルデータが必要ならば
#code(c){{
for(int i = 0; i < w; ++i){
for(int j = 0; j < h; ++j){
double re, im;
if(j >= h/2+1){
int j0 = h-j-1;
re = out[j0+i*h1][0];
im = -out[j0+i*h1][1];
}
else{
re = out[j+i*h1][0];
im = out[j+i*h1][1];
}
}
}
}}
のように変換する.
2次元の画像データからの変換例として,
#code(C){{
void FFTW_c2r(Array2 &reImg, Array2 &imImg, int w, int h)
{
fftw_complex *in;
double *out;
fftw_plan p;
in = (fftw_complex*)fftw_malloc(sizeof(fftw_complex)*w*(...
out = (double*)fftw_malloc(sizeof(double)*w*h);
// プランナ設定
p = fftw_plan_dft_c2r_2d(w, h, in, out, FFTW_ESTIMATE);
//
for(int i = 0; i < w; ++i){
for(int j = 0; j < h/2+1; ++j){
in[j+(h/2+1)*i][0] = reImg[i][j];
in[j+(h/2+1)*i][1] = imImg[i][j];
}
}
fftw_execute(p);
for(int i = 0; i < w; ++i){
for(int j = 0; j < h; ++j){
reImg[i][j] = out[j+h*i];
imImg[i][j] = 0.0;
}
}
fftw_free(in);
fftw_free(out);
fftw_destroy_plan(p);
}
}}
2D FFTで得られたデータは四隅が低い周波数,中心が高い周波...
一般的な中心が低い周波数の状態にしたい場合は,第一象限と...
**TIPS [#ladfc11f]
-逆フーリエ変換したデータはスケーリングされていないので,...
reImg[i][j]/(w*h);
-Planner Flagの FFTW_PRESERVE_INPUT は入力データの保存を...
多次元c2r変換でについてはこれは実装されておらず,これが指...
終了行:
*[[FFTW:http://www.fftw.org/]] [#t3f818a1]
----
#contents
----
**Visual C++ でのインストール [#xe2296d0]
#include(build_fftw,notitle)
**実数データの多次元DFT [#a33d8ce3]
実数データの多次元DFTには以下のプランナを用いる.
fftw_plan fftw_plan_dft_r2c_2d(int n0, int n1, double *i...
fftw_plan fftw_plan_dft_r2c_3d(int n0, int n1, int n2, d...
fftw_plan fftw_plan_dft_r2c(int rank, const int *n, doub...
r2cはreal to complexのことであり,complex to real の場合...
2次元の場合,入力inにはn0×n1の2次元データがrow-major orde...
出力outにはn0×(n1/2+1)の大きさのfftw_complex型の配列のア...
プランナに渡すflagについては,[[Planner Flags:http://www....
出力のサイズが異なるのは,DFT変換後のデータがエルミート冗...
out[i]がout[n-i]の共役になっており,メモリの節約のために...
描画などでフルデータが必要ならば
#code(c){{
for(int i = 0; i < w; ++i){
for(int j = 0; j < h; ++j){
double re, im;
if(j >= h/2+1){
int j0 = h-j-1;
re = out[j0+i*h1][0];
im = -out[j0+i*h1][1];
}
else{
re = out[j+i*h1][0];
im = out[j+i*h1][1];
}
}
}
}}
のように変換する.
2次元の画像データからの変換例として,
#code(C){{
void FFTW_c2r(Array2 &reImg, Array2 &imImg, int w, int h)
{
fftw_complex *in;
double *out;
fftw_plan p;
in = (fftw_complex*)fftw_malloc(sizeof(fftw_complex)*w*(...
out = (double*)fftw_malloc(sizeof(double)*w*h);
// プランナ設定
p = fftw_plan_dft_c2r_2d(w, h, in, out, FFTW_ESTIMATE);
//
for(int i = 0; i < w; ++i){
for(int j = 0; j < h/2+1; ++j){
in[j+(h/2+1)*i][0] = reImg[i][j];
in[j+(h/2+1)*i][1] = imImg[i][j];
}
}
fftw_execute(p);
for(int i = 0; i < w; ++i){
for(int j = 0; j < h; ++j){
reImg[i][j] = out[j+h*i];
imImg[i][j] = 0.0;
}
}
fftw_free(in);
fftw_free(out);
fftw_destroy_plan(p);
}
}}
2D FFTで得られたデータは四隅が低い周波数,中心が高い周波...
一般的な中心が低い周波数の状態にしたい場合は,第一象限と...
**TIPS [#ladfc11f]
-逆フーリエ変換したデータはスケーリングされていないので,...
reImg[i][j]/(w*h);
-Planner Flagの FFTW_PRESERVE_INPUT は入力データの保存を...
多次元c2r変換でについてはこれは実装されておらず,これが指...
ページ名: