USER
次のC99のプログラムを解析し、説明をしてください。 また、改善点があればあわせて指摘してください。 #include <stdlib.h> #include <stddef.h> #include <math.h> #include <omp.h> // gcc -fopenmp -O3 ( -O3: Strongly recommendation ) #include <complex.h> #define INT register int #define DOUBLE register double #define Rotor(a) (double _Complex)( cos(a) + I*sin(a) ) enum { FFT=DFT, IFFT=IDFT }; void FFT_TwoDimensionalC99( DOUBLE _Complex **d, INT elements, INT flag ) { INT x, y, lx=elements, ly=elements; DOUBLE unit = (flag==IFFT) ? 2*M_PI/elements : -2*M_PI/elements; double _Complex rotor[elements]; for(x=0;x<elements;rotor[x]=Rotor(unit*x),x++); //// If the flag is FFT, unit=-2*M_PI/elements, if IFFT, unit=2*M_PI/elements. #pragma omp parallel for for( y=0; y<ly; y++ ) { INT i, j, k, m, mh, ir; // ir: irev DOUBLE _Complex W, temp; // W: Rotation factor for( i=0, j=1; j<elements-1; j++ ) {// scrambler, for initial placement for( k=elements>>1; k>(i^=k); k>>=1 ); if( j<i ){ temp=d[y][j], d[y][j]=d[y][i], d[y][i]=temp; }// exchange } for( mh=1; (m=mh<<1)<=elements; mh=m ) { // Operations for( ir=0, i=0; i<elements; i+=m ) { // ir=0: Rotation angle is 0rad. for( W=rotor[ir], k=elements>>2; k>(ir^=k); k>>=1 ); for( j=i; j<mh+i; j++ ) { INT a = j, b = j + mh; temp = d[y][a] - d[y][b]; // For butterfly operation d[y][a] = d[y][a] + d[y][b]; // a ->- (a + b) ->- a d[y][b] = temp * W; // b ->- (a-b)*W ->- b } } } DOUBLE reciprocal=1./elements; if(flag==IFFT)for( i=0; i<elements; d[y][i++]*=reciprocal); } #pragma omp parallel for for( x=0; x<lx; x++ ) { INT i, j, k, m, mh, ir; // ir: irev DOUBLE _Complex W, temp; // W: Rotation factor for( i=0, j=1; j<elements-1; j++ ) {// scrambler, for initial placement for( k=elements>>1; k>(i^=k); k>>=1 ); if( j<i ){ temp=d[j][x], d[j][x]=d[i][x], d[i][x]=temp; }// exchange } for( mh=1; (m=mh<<1)<=elements; mh=m ) { // Operations for( ir=0, i=0; i<elements; i+=m ) { // ir=0: Rotation angle is 0rad. for( W=rotor[ir], k=elements>>2; k>(ir^=k); k>>=1 ); for( j=i; j<mh+i; j++ ) { INT a = j, b = j + mh; temp = d[a][x] - d[b][x]; // For butterfly operation d[a][x] = d[a][x] + d[b][x]; // a ->- (a + b) ->- a d[b][x] = temp * W; // b ->- (a-b)*W ->- b } } } DOUBLE reciprocal=1./elements; if(flag==IFFT)for( i=0; i<elements; d[i++][x]*=reciprocal); } }