/*--------------------------------------------------------------------------------
離散フーリエ変換と逆離散フーリエ変換
discrete Fourier transform and inverse discrete Fourier transform
calc_fourier.c
*--------------------------------------------------------------------------------*/
#include "WKT_CC.h"
// 離散フーリエ変換
// データxを入力し、位相Fを出力
// discrete Fourier transform
// input the data x, output the phase F
void fourier( int num, complex *x, complex *F )
{
int k, n;
double angle;
double real_temp;
double imag_temp;
for( k = 0; k < num; k++ ){
real_temp = 0.0;
imag_temp = 0.0;
for( n = 0; n < num; n++ ){
angle = (2.0 * M_PI * n * k)/(double)num;
// 実部の計算
// calculation of the real part
real_temp += ( x[n].real * cos(angle) + x[n].imag * sin(angle) );
// 虚部の計算
// calculation of the imaginaryl part
imag_temp += ( -x[n].real * sin(angle) + x[n].imag * cos(angle) );
}
F[k].real = real_temp;
F[k].imag = imag_temp;
}
}
/*----------------------------------------------------------------------*/
// 逆離散フーリエ変換
// 位相Fを入力し、データxを出力
// inverse discrete Fourier transform
// input the phase F, and output the data x
void inv_fourier( int num, complex *x, complex *F )
{
int k, n;
double angle;
double real_temp;
double imag_temp;
for( n = 0; n < num; n++ ){
real_temp = 0.0;
imag_temp = 0.0;
for( k = 0; k < num; k++ ){
angle = (2.0 * M_PI * n * k)/(double)num;
// 実部の計算
// calculation of the real part
real_temp += ( F[k].real * cos(angle) - F[k].imag * sin(angle) );
// 虚部の計算
// calculation of the imaginaryl part
imag_temp += ( F[k].real * sin(angle) + F[k].imag * cos(angle) );
}
x[n].real = real_temp/(double)num;
x[n].imag = imag_temp/(double)num;
}
}