// 特定の周波数成分を持つ空間領域のテキストファイル(Complex Text形式)のデータを作成するプログラム // プログラム名:make_cpx.cpp #include "eps-header.hh" #include "fft-header.hh" // 周波数成分の構造体 struct st_freq_element { int wave_no_line; // ライン方向の波数 int wave_no_pixel; // ピクセル方向の波数 double amp; // 振幅 double phase; // 位相 [rad] }; // 特定の周波数成分を持つ空間領域のテキストファイル(Complex Text形式)のデータを作成する関数 void make_cpx( int nr_lines, // ライン数 int nr_pixels, // ピクセル数 int nr_fe, // 周波数成分の数 struct st_freq_element * fe) // 周波数成分の配列へのポインタ { printf("\n特定の周波数成分を持つ空間領域のテキストファイル(Complex Text形式)のデータを作成します。\n"); class fourier data(nr_lines, nr_pixels); // 高速フーリエ変換クラスの宣言 // 複素数型の2次元配列のみを使用 // データはすべて0.0+0.0iとなっている。 // complex_typeは空間領域(SPACE) for (int n = 0; n < nr_fe; n ++) { printf("%4d番目の周波数成分(ライン方向波数:%4d, ピクセル方向波数:%4d, 振幅:%lf, 位相[deg]:%lf)を加えています。\n", n, fe[n].wave_no_line, fe[n].wave_no_pixel, fe[n].amp, fe[n].phase); double phase = fe[n].phase * PI / 180.0; for (int iy = 0; iy < nr_lines; iy ++) { for (int ix = 0; ix < nr_pixels; ix ++) { data.p[iy][ix] += fe[n].amp * exp(creal8(0.0, + 2.0 * PI * iy * (double)fe[n].wave_no_line / (double)nr_lines + 2.0 * PI * ix * (double)fe[n].wave_no_pixel / (double)nr_pixels + phase)); } } } data.cpx_save(); // 空間領域のテキストファイル(Complex Text形式)にデータを出力 } // プログラムの開始位置 int main() { // 実数部のみのデータを作成する場合は,波数と位相の符号を逆にした周波数成分を組にする。 struct st_freq_element fe[] = { // ライン方向の波数,ピクセル方向の波数,振幅,位相[deg] { 1, 0, 1.0, 0.0}, { -1, 0, 1.0, 0.0} }; int nr_fe = sizeof(fe) / sizeof(struct st_freq_element); // 周波数成分の数 int nr_lines = 16; // 画像のライン数 int nr_pixels = 32; // 画像のピクセル数 // 特定の周波数成分を持つ空間領域のテキストファイル(Complex Text形式)のデータを作成する関数 make_cpx( nr_lines, // ライン数 nr_pixels, // ピクセル数 nr_fe, // 周波数成分の数 fe); // 周波数成分の配列へのポインタ }