/* VC 下运行通过 2007。4。26 把radix4中某些层for->while等效 14:51*//*****************fft programe*********************/void rad4(double x[],double y[],double TAB[],int i,int n2,int adr1,int adr2,int adr3){ int i1,i2,i3; double co1,co2,co3,si1,si2,si3; double r1,r2,r3,r4,s1,s2,s3,s4; i1=i+n2;i2=i1+n2;i3=i2+n2; /* 数据位置 */ co1=TAB[2*adr1];co2=TAB[2*adr2];co3=TAB[2*adr3]; /* 旋转因子 */ si1=TAB[2*adr1+1];si2=TAB[2*adr2+1];si3=TAB[2*adr3+1]; r1=x[i]+x[i2];r3=x[i]-x[i2]; s1=y[i]+y[i2];s3=y[i]-y[i2]; r2=x[i1]+x[i3];r4=x[i1]-x[i3]; s2=y[i1]+y[i3];s4=y[i1]-y[i3]; x[i]=r1+r2; y[i]=s1+s2; r2=r1-r2; r1=r3-s4;r3=r3+s4; s2=s1-s2; s1=s3+r4;s3=s3-r4; x[i1]=co1*r3+si1*s3;y[i1]=co1*s3-si1*r3; x[i2]=co2*r2+si2*s2;y[i2]=co2*s2-si2*r2; x[i3]=co3*r1+si3*s1;y[i3]=co3*s1-si3*r1;} void switchadr(double x[],double y[],int n) // 变换后,如果想顺序输出就调用这个{ double tempx,tempy; int i,j,k; for(i=0,j=0;i<=n-1;i++) { if(i<j) { tempx=x[j]; tempy=y[j]; x[j]=x[i];y[j]=y[i]; x[i]=tempx; y[i]=tempy; } k=n/4; while(3*k<(j+1)&&(j>0) ) { j=j-3*k; k=k/4; } j=j+k; }} void radix4(double x[],double y[],double TAB[],int n) // 核心变换代码{ int k,e,n1,n2; int a,b,c; n2=n; e=1; /* 1 -- n 有效 */ k=n; while(k>1) /*内部循环没有使用K值,只是用来控制循环次数而已,log4\n次*/ { int j; n1=n2; n2=n2/4; for(j=1;j<=n2;j++) { int i; a=(j-1)*e;b=a+a; c=a+b; a &= (n-1); b &= (n-1); c &= (n-1); /* 旋转因子周期 N */ i = (j-1); do { rad4(x,y,TAB,i,n2,a,b,c); i+=n1; }while(i<n); } e <<= 2; k >>= 2; }}

评论