正文

FFT4 C程序2007-05-15 11:44:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/vfdff/25910.html

分享到:

/* 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;
 }
}

阅读(4608) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册