高速フーリエ変換のテスト(係数の定義範囲の変更)

高速フーリエ変換のテスト(矩形関数)」では、 0\leq n \leq N-1の範囲の整数で定義しましたが、 対象とする系によっては-N/2\leq n \leq N/2 - 1の範囲で定義するほうが理解しやすいこともあります。 そこで、nの正負の関係を調べるために 前項で示した展開係数c_nのnに-nを代入すると >

c_{-n} = c_n^*

という結果になります。「*」は複素共役を表す記号です。つまり、展開係数の実部と虚部は

a_{-n} = a_n
b_{-n} = -b_n

という関係があるわけです。 このことから前項の高速フーリエ変換の結果から、展開係数の範囲を -N/2\leq n \leq N/2 - 1に直接変換することができます。 次のグラフは前項と同じ矩形関数のフーリへ変換の結果を変換した結果です。

//フーリへ変換の実行
FFT( an, bn, N );

//-N/2 から N/2-1 の展開係数を格納する配列(an_, bn_)	
for( var n = 0; n < N; n++ ){
	var nn;

	if( n <= N/2 ) nn = N/2 - n;
	else nn = N + N/2 - n; 

	an_[ n ] = an[ nn ];
	bn_[ n ] = bn[ nn ];
}

展開係数

逆フーリエ変換

-N/2\leq n \leq N/2 - 1で定義された展開係数を 0\leq n \leq N-1に変換後、逆フーリエ変換を実行した結果です 意図通り結果が得られていることが確認できました。

//-N/2 から N/2-1 の展開係数を格納する配列(an_, bn_)	から元の範囲の展開係数へ変換
for( var n = 0; n < N; n++ ){

	var nn;
	if( n < N/2 ) nn = N/2 + n;
	else nn = n-N/2; 

	_an[ n ] = an_[ nn ];
	_bn[ n ] = bn_[ nn ];

}
//逆フーリエ変換の実行
FFT( _an, _bn, N, true);