// 周波数/空間領域のテキストファイルComplex Text形式)を読み込み高速フーリエ逆変換/フーリエ変換して,グレイスケール画像を作成するプログラム // プログラム名:fft_cpx2bmp.cpp #include "eps-header.hh" #include "fft-header.hh" // 周波数/空間領域のテキストファイルComplex Text形式)を読み込み高速フーリエ逆変換/フーリエ変換して,処理済画像(dst)をに出力する関数 void fft_cpx2bmp( class image& dst) // 処理済画像クラス(出力) { printf("\n周波数/空間領域のテキストファイルComplex Text形式)を読み込み高速フーリエ逆変換/フーリエ変換して,グレイスケール画像を作成します。\n"); class fourier data; // 高速フーリエ変換クラスの宣言 data.cpx_load(); // テキストファイル(Complex Text形式)からデータを入力 int nr_lines = data.get_nr_lines(); int nr_pixels = data.get_nr_pixels(); if (data.get_complex_type() == COMPLEX_SPACE) { printf("テキストファイル(Complex Text形式)は,空間領域のデータです。\n"); printf("フーリエ変換し,周波数領域に変換します。\n"); data.Forward_FFT(); // フーリエ変換 } else { printf("テキストファイル(Complex Text形式)は,周波数領域のデータです。\n"); printf("フーリエ逆変換し,空間領域に変換します。\n"); data.Backward_FFT(); // フーリエ逆変換 double d = (double)nr_lines * (double)nr_pixels; for (int iy = 0; iy < nr_lines; iy ++) { for (int ix = 0; ix < nr_pixels; ix ++) { data.p[iy][ix] /= d; } } } dst.gmake(nr_lines, nr_pixels); // 出力画像の配列を確保 int input_num = 0; int output_switch = OUTPUT_REAL; printf("\n出力するデータ (0: 実数部,1: 虚数部,2: 振幅,3: パワー値,4: デシベル値,5: 位相) "); char linebuf[MAX_FILENAME_LEN]; fgets(linebuf, MAX_FILENAME_LEN - 1, esp_in); sscanf(linebuf, "%d", &input_num); switch (input_num) { case 0: output_switch = OUTPUT_REAL; break; case 1: output_switch = OUTPUT_IMAGE; break; case 2: output_switch = OUTPUT_AMP; break; case 3: output_switch = OUTPUT_POWER; break; case 4: output_switch = OUTPUT_DB; break; case 5: output_switch = OUTPUT_PHASE; break; defalut: printf("選択数値以外が入力されました。0とします。\n"); output_switch = OUTPUT_REAL; break; } int scaling_switch = OUTPUT_SCALE_OFF; printf("\n出力データの画像化処理 (0: スケーリングしない, 1: スケーリングする) "); fgets(linebuf, MAX_FILENAME_LEN - 1, esp_in); sscanf(linebuf, "%d", &input_num); switch (input_num) { case 0: scaling_switch = OUTPUT_SCALE_OFF; break; case 1: scaling_switch = OUTPUT_SCALE_ON; break; default: printf("選択数値以外が入力されました。0とします。\n"); scaling_switch = OUTPUT_SCALE_OFF; break; } int shuffling_switch = FREQ_SPACE_SHUFFLING_OFF; printf("\n画像のシャフリング (0: しない,1: する) "); fgets(linebuf, MAX_FILENAME_LEN - 1, esp_in); sscanf(linebuf, "%d", &input_num); switch (input_num) { case 0: shuffling_switch = FREQ_SPACE_SHUFFLING_OFF; break; case 1: shuffling_switch = FREQ_SPACE_SHUFFLING_ON; break; default: printf("選択数値以外が入力されました。0とします。\n"); shuffling_switch = FREQ_SPACE_SHUFFLING_OFF; break; } data.MakeImage( // 出力画像を作成 output_switch, shuffling_switch, scaling_switch, dst.p); } // プログラムの開始位置 int main() { class image dst; // 処理済画像クラスを宣言 // 周波数/空間領域のテキストファイルComplex Text形式)を読み込み高速フーリエ逆変換/フーリエ変換して,処理済画像(dst)をに出力する。 fft_cpx2bmp( dst); // 処理済画像クラス(出力) printf("\n処理済画像を出力します。\n"); dst.gsave(); // 処理済画像をBMPファイルに書き出す。 // BMPファイルを指定したい場合は, // dst.gsave("パス付きBMPファイル名"); // とする。 }