打印

谁有傅里叶(FFT)变换的C代码呀??

[复制链接]
1879|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
scxjun2008|  楼主 | 2011-1-6 09:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
huangqi412| | 2011-1-6 09:33 | 只看该作者
倒,LZ不会去网上搜FFT下一个?

搜一下以前OO的。

使用特权

评论回复
板凳
冯冯冯冯| | 2011-1-6 09:39 | 只看该作者
pudn  上和CSDN都可以下载,
哎我给你贴上来吧
#include "stdio.h"
#include <math.h>       //調用源(頭)文件

struct compx           /*定義一個複數結構*/
{float real;float imag;
};
struct compx s[ 257 ];      //FFT輸入輸出均從是s[1]開始存入
struct compx EE(struct compx,struct compx); //定義複數相乘結構
void FFT(struct compx xin,int N);   /*定義FFT函數*/
struct compx EE(struct compx a1,struct compx b2) //兩複數相乘的程序
{struct compx b3;  //b3保存兩複數間的結果
b3.real=a1.real*b2.real-a1.imag*b2.imag; //兩複數間的運算
b3.imag=a1.real*b2.imag+a1.imag*b2.real;
return(b3);    /*返回結果*/
}

void FFT(struct compx xin,int N)   /*FFT函數體*/
{int f,m,nv2,nm1,i,k,j=1,l;   /*定義變量*/
struct compx v,w,t;    /*定義結構變量*/
nv2=N/2;           /*最高位值的權值*/
f=N;                  /*f為中間變量*/
for(m=1;(f=f/2)!=1;m++){;}            /*求級數m*/
nm1=N-1;                               /*nm1為數組長度*/
for(i=1;i<=nm1;i++)                   /*倒序*/
{if(i<j) {t=xin[ j ];xin[j]=xin[ i ];xin[ i ] =t;}         /*i<j則換位*/
k=nv2;                       /*k為倒序中相應位置的權值*/
while(k<j) {j=j-k;k=k/2;}            /*k<j時最高為變為0*/
j=j+k;                  /* j為數組中的位數,是一個十進制數*/
}
{int le,lei,ip;       //變量初始化,le為序列長度
  float pi;
  for(l=1;l<=m;l++)                /*l控制級數*/
   {le=pow(2,l);                  /*le等於2的l次方*/
    lei=le/2;                   /*蝶形兩節點間的距離*/
    pi=3.14159265;
    v.real=1.0;                    // 此次的v運於複數的初始化    v.imag=0.0;  
   w.real=cos(pi/lei);                  /*旋轉因子*/
    w.imag=-sin(pi/lei);
    for(j=1;j<=lei;j++)      //外循環控制蝶行運算的級數
     {for(i=j;i<=N;i=i+le)      //內循環控制每級間的運算次數
      {ip=i+lei;                 /*蝶形運算的下一個節點*/
       t=EE(xin[ ip ],v);             /*第一個旋轉因子*/
       xin[ ip ].real=xin[ i ].real-t.real;   /*蝶形計算*/
       xin[ ip ].imag=xin[ i ].imag-t.imag;
       xin[ i ].real=xin[ i ].real+t.real;
       xin[ i ].imag=xin[ i ].imag+t.imag;
      }
      v=EE(v,w); //調用EE複數相乘程序,結果給下次的循環   
      }     
   }
  }
}

main()                    /*定義主函數*/
{int N,i;     //變量初始化,N為總點數,i為每點數
printf("shu ru N de ge shu N=");  /*提示輸入*/
scanf("%d",&N);                   /*輸入N*/
for(i=1;i<=N;i++)              /*輸入*/
  {printf("di %d ge shu real=",i);
   getchar();  
   scanf("%f",&s[ i ].real);
   getchar();   
   printf("\n");
   printf("di %d ge shu imag=",i);
   scanf("%f",&s[ i ].imag);
   printf("\n");
  }  
  FFT(s,N);               /*調用FFt*/
  for(i=1;i<=N;i++)                 /*輸出*/
   {printf("%f",s[ i ].real);
   printf(" + ");
    printf("%f",s[ i ].imag);
    printf("j");
    printf("\n");
   }  
}

使用特权

评论回复
地板
scxjun| | 2011-1-7 09:47 | 只看该作者
这个程序我倒是下了个,就是不知道怎么用,信号是AD采集的音频信号,程序里的实部和虚部中如何输入??

使用特权

评论回复
5
sl_168| | 2011-1-7 14:50 | 只看该作者
回去好好再复习一下信号与系统去

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

2

帖子

1

粉丝