前回の解答
DFTの関数は以下のようになる.
void dft(double* in, Complex* out, int N) /*function of fft*/ { Complex tmp; int omega, k; for(omega=0; omega<N; omega++) { for(k=0; k<N; k++) { // 積分の中身の計算 tmp = Cexp( ToComplex(0.0 , 2.0 * pi * omega * k / N) ); tmp = Cmul( ToComplex(in[k], 0.0), tmp); // Sigmaの計算 out[omega].re += tmp.re; out[omega].im += tmp.im; } } } |
なお,以下のような関数を作ると処理が楽になる.
複素数の中身を初期化(実部,虚部ともゼロを代入)
void Cclear(Complex* a, int n) /*複素数初期化*/ { int i; for(i=0;i<n;i++){ a[i].re = 0; a[i].im = 0; } } |
複素数内のデータを表示する
void Cprint(double *a,int n) /*複素数表示*/ { int i; for(i=0;i<n;i++){ printf("%d %lf\n",i,a[i]); } printf("\n"); } |
DFTの結果の入った配列を読み込む.但し,パワースペクトルなので2乗する.
void Sprint(Complex *a, int n) /*スペクトル表示*/ { int i; for(i=0;i<n/2;i++){ printf("%d %lf\n",i,Cabs(a[i])*Cabs(a[i])); } printf("\n"); } |