【GSLで数値計算6】
高速フーリエ変換(複素データ)の動作チェック
本稿では、GSL(GNU科学技術計算ライブラリ)を用いてフーリエ変換の計算を行うサンプルプログラムを示します。→ GNU科学技術計算ライブラリのインストール(Windows, VisualStudio2017)はこちら
////////////////////////////////////////// // 高速フーリエ変換(複素データ)の動作チェック ////////////////////////////////////////// #include#include #include #include #include #include #include #define REAL(z,i) ((z)[2*(i)]) #define IMAG(z,i) ((z)[2*(i)+1]) const int N = 128; double data[2 * N]; int main(void){ std::cout << "矩形分布(元の関数)" << std::endl; for (int i = 0; i < N; i++) { if (N / 4 <= i && i <= 3 * N / 4) { REAL(data, i) = 1.0; } else { REAL(data, i) = 0.0; } IMAG(data, i) = 0.0; std::cout << i << " " << REAL(data, i) << " " << IMAG(data, i) << std::endl; } //フーリエ変換(逆変換) gsl_fft_complex_radix2_backward(data, 1, N); std::cout << std::endl << std::endl << "変換後の分布" << std::endl; for (int i = 0; i < N; i++) { std::cout << i << " " << REAL(data, i) / sqrt(N) << " " << IMAG(data, i) / sqrt(N) << std::endl; } //フーリエ変換(順変換) gsl_fft_complex_radix2_forward(data, 1, N); std::cout << std::endl << std::endl << "再変換後の分布(元と同じ)" << std::endl; for (int i = 0; i < N; i++) { std::cout << i << " " << REAL(data, i) / N << " " << IMAG(data, i) / N << std::endl; } std::string s; std::cin >> s; return 0; }
参考ページ:矩形関数のフーリエ変換