工学系のための複素数の話 第6巻 「複素数とフーリエ変換」プログラム集 6.1 フーリエ変換 【リスト6-1】関数系の直交を確認するためのプログラム #include "stdio.h" #include "Complex.h" Complex g(int N, int n, int k){return expJ(2.0*PI*n*k/N);} int main(void){ int k1, k2,N=10; while(scanf("%d,%d",&k1,&k2)!=EOF){ Complex T=Complex();Complex Z; for(int i=0;i>=1 )jx=(jx<<1)|(jp & 1); if(j=1;ne>>=1, NH<<=1) for(NH2=NH/2,jp=0;jp>=1) for(NH2=NH*2,jp=0;jp>=1 )jx=(jx<<1)|(jp & 1); if(j>=1) for(k=0;k>=1) for(NH2=NH<<1, k=0; k(num/4) && i<(3*num/4))&& (j>(num/4) && j<(3*num/4))) X[i][j]=Complex(1,0); else X[i][j]=Complex(0,0); } int CSVFlag = true; void printDT(Complex DT[][GHDFT+1], int num, int image){ for(int i=0;i<(num+1);i++){ printf("\n %4d", i); for(int j=0;j<(num+1);j++){ double D=DT[i][j].r; if(image) D=DT[i][j].i; printf(", %lf",D); } } } void fprintDT(FILE *fn, Complex DT[][GHDFT+1], int num, int image){ for(int i=0;i<(num+1);i++){ fprintf(fn,"\n %4d", i); for(int j=0;j<(num+1);j++){ double D=DT[i][j].r; if(image) D=DT[i][j].i; fprintf(fn,", %lf",D); } } } void DFT(Complex beforDFT[][GHDFT+1], Complex afterDFT[][GHDFT+1]){ double ARG=-2.0*PI/GHDFT; for(int k=0;k<=GWDFT;k++)for(int N=0;N<=GWDFT;N++){//中央への移動 double DD=((k+N)%2)!=0 ? -1.0: 1.0; afterDFT[k][N]=beforDFT[k][N]*DD; } for(int i=0;iGWDFT) x2= x2-GWDFT; if(y2>GHDFT) y2= y2-GHDFT; TM[x2][y2]=DT[x][y]; } } 【リスト6-10】 2次元高速逆フーリエ変換(GWDFT=64, GHDFT=64) void rev_fft_2d(Complex afterDFT[][GHDFT+1], Complex reverceDFT[][GHDFT+1], int n_fft){ int num=labs(n_fft); fft_2d(afterDFT,reverceDFT, -num); for(int k=0;k<=num;k++)for(int N=0, N2=num-1;N