FFT算法

傅里叶变换是一种将信号从时域变换到频域的变换形式。

一般用蝶形运算
X1(k)、X 2(k)表示 X(k)的运算是一种特殊的运算-碟形运算


void MYFFT(struct Complex *xin,int N)

{
   int L=0; // 级间运算层
   int J=0; // 级内运算层
   int K=0,KB=0; // 蝶形运算层
   int M=1,Nn=0;// N=2^M
   float B=0; // 蝶形运算两输入数据间隔
   /* 以下是为倒序新建的局部变量*/
   int LH=0,J2=0,N1=0,I,K2=0;
   struct Complex T;
   /*以下是倒序*/
   LH=N/2; // LH=N/2
   J2=LH;
   N1=N-2;
   for(I=1;I<=N1;I++)
    {
     if(I<J2)
{
       T=xin[I];
       xin[I]=xin[J2];
       xin[J2]=T;
}
K2=LH;
while(J2>=K2)
 {
        J2-=K2;
        K2=K2/2;// K2=K2/2
 }
 J2+=K2;
    }    
   /* 以下为计算出M */
   Nn=N;
   while(Nn!=2)// 计算出N的以2为底数的幂M
   {
     M++;
Nn=Nn/2;
   }


   /* 蝶形运算 */
   for(L=1;L<=M;L++)  // 级间
{
 B=pow(2,(L-1));
      Vn.real=1;
 Vn.imag=0;
      Wn.real=cos(pi/B);
      Wn.imag=-sin(pi/B);
 for(J=0;J<B;J++)   // 级内
  {        
for(K=J;K<N;K+=2*B)  // 蝶形因子运算
 {
            KB=K+B;
            T=MUL(xin[KB],Vn);
            xin[KB].real=xin[K].real-T.real;
            xin[KB].imag=xin[K].imag-T.imag;
             xin[K].real=xin[K].real+T.real;
             xin[K].imag=xin[K].imag+T.imag;      
 }
 Vn=MUL(Wn,Vn);// 旋转因子做复乘相当于指数相加,得到的结果
 // 和J*2^(M-L)是一样的,因为在蝶形因子运算
// 层中M与L都是不变的,唯一变x化的是级内的J
// 而且J是以1为步长的,如J*W等效于W+W+W...J个W相加
}
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值