background image

输入参数:*xin 复数结构体组的首地址指针,struct 型
*****************************************************************/
void FFT(struct compx *xin)
{
  int f,m,nv2,nm1,i,k,l,j=0;
  struct compx u,w,t;
   
   nv2=FFT_N/2;                  //变址运算,即把自然顺序变成倒位序,采用雷德算法
   nm1=FFT_N-1;  
   for(i=0;i<nm1;i++)        
   {
    if(i<j)                    //如果 i<j,即进行变址
     {
      t=xin[j];           
      xin[j]=xin[i];
      xin[i]=t;
     }
    k=nv2;                    //求 j 的下一个倒位序
    while(k<=j)               //如果 k<=j,表示 j 的最高位为 1   
     {           
      j=j-k;                 //把最高位变成 0
      k=k/2;                 //k/2,比较次高位,依次类推,逐个比较,直到某个位为 0
     }
   j=j+k;                   //把 0 改为 1
  }
                         
  {
   int le,lei,ip;                            //FFT 运算核,使用蝶形运算完成 FFT 运算
    f=FFT_N;
   for(l=1;(f=f/2)!=1;l++)                  //计算 l 的值,即计算蝶形级数
           ;
  for(m=1;m<=l;m++)                         // 控制蝶形结级数
   {                                        //m 表示第 m 级蝶形,l 为蝶形级总数 l=log(2)N
    le=2<<(m-1);                            //le 蝶形结距离,即第 m 级蝶形的蝶形结相距 le 点
    lei=le/2;                               //同一蝶形结中参加运算的两点的距离
    u.real=1.0;                             //u 为蝶形结运算系数,初始值为 1
    u.imag=0.0;
    w.real=cos(PI/lei);                     //w 为系数商,即当前系数与前一个系数的商
    w.imag=-sin(PI/lei);
    for(j=0;j<=lei-1;j++)                   //控制计算不同种蝶形结,即计算系数不同的蝶形结
     {
      for(i=j;i<=FFT_N-1;i=i+le)            //控制同一蝶形结运算,即计算系数相同蝶形结
       {
        ip=i+lei;                           //i,ip 分别表示参加蝶形运算的两个节点