这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » FPGA » 程序:离散傅里叶变换

共3条 1/1 1 跳转至

程序:离散傅里叶变换

专家
2010-07-05 17:16:08     打赏

/**
函数名:void fft(x,y,n,sign)
Funtion:离散傅里叶变换
IntPut: x     : 双精度实型一组数据,长度为n,开始时存放要变换数据的实部,最后存放变换结果的实部
         y     :双精度实型一维数据,长度为n,开始时存放要变换数据的虚部,最后存放变换结果的虚部
         a     :双精度实型一维数据,长度为n,存放
         n     :整型变量,数据长度,必须是2的证书次幂,n=2m
         sign  :整型变量。当sign=1时,子函数fft()计算离散傅里叶正变换(DFT);
                           当sign=-1时,  子函数fft()计算离散傅里叶正变换(IDFT);?
**/

void fft(double x[],double y[],int n,int sign)
{
    int i,j,k,l,m,n1,n2;
    double c,c1,e,s,s1,t,tr,ti;

    for(j=1,i=1; i<16; i++)
      {
      m=i;
      j=2*j;
      if(j==n) break;
      }
    n1=n-1;

    for(j=0,i=0; i<n1; i++)
      {
       if(i<j)
         {
         tr=x[j];
         ti=y[j];
         x[j]=x[i];
         y[j]=y[i];
         x[i]=tr;
         y[i]=ti;
         }
       k=n/2;
       while(k<(j+1))
         {
         j=j-k;
         k=k/2;
         }
       j=j+k;
      }

    n1=1;
    for(l=1; l<=m; l++)
      {
      n1=2*n1;
      n2=n1/2;
      e=3.14159265359/n2;
      c=1.0;
      s=0.0;
      c1=cos(e);
      s1=-sign*sin(e);
      for(j=0; j<n2; j++)
        {
        for(i=j; i<n; i++)
          {
          k=i+n2;
          tr=c*x[k]-s*y[k];
          ti=c*y[k]+s*x[k];
          x[k]=x[i]-tr;
          y[k]=y[i]-ti;
          x[i]=x[i]+tr;
          y[i]=y[i]+ti;
          }
        t=c;
        c=c*c1-s*s1;
        s=t*s1+s*c1;
        }
      }

    if(sign==-1)
      {
       for(i=0;i<n; i++)
         {
         x[i]/=n;
         y[i]/=n;
         }
      }

}




关键词: 程序     离散     傅里叶     变换    

菜鸟
2010-08-03 17:33:35     打赏
2楼
Symbian OS 机器比较老了

菜鸟
2012-10-01 09:09:02     打赏
3楼
好东西,谢谢提供

共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]