HOME > natural science Laboratory > コンピュータ・シミュレーション講座 > 計算物理学

【GSLで数値計算6】
高速フーリエ変換(複素データ)の動作チェック

文責:遠藤 理平 (2018年7月 3日) カテゴリ:計算物理学(164)

本稿では、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;
}

参考ページ:矩形関数のフーリエ変換



▲このページのトップNPO法人 natural science トップ

▲このページのトップNPO法人 natural science トップ