FFT算法C语言程序代码
说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。
DIT-基2FFT的浮点C语言程序: 1、 生成旋转因子,复数结构,旋转因子Wn=exp(—j*2*pi/N) //twiFactor——指向旋转因子矩阵的指针 //wLen——FFT的长度 Struct complexData{ //定义一个复数结构 float re; float im; }; Void gen_w_r2(struct complexData *twiFactor,int wLen) { int iFactor; float stepFactor; stepFactor=2.0*pi/wLen; for(iFactor=0;iFactor〈(wLen>〉1);iFactor++) { twiFactor[iFactor]。re=cos(stepFactor*iFactor); twiFactor[iFactor].im=sin(stepFactor*iFactor); pi*n/N),n=0,1,…,(N/2—1) } } 2、在运行FFT之前,对输入序列进行倒序变换,代码如下: //bitRevData——指向位变换序列的指针 //revLen—-FFT长度 Void bit_rev(struct complexData *bitRevData,int revLen) { struct complexData tempRev; int iRev,jRev,kRev,halfLen; halfLen=revLen>〉1;jRev=0; for(iRev=0;iRev〈(revLen—1);iRev++) { If(iRev) {
tempRev=bitRevData[jRev];
bitRevData[jRev]=bitRevData[iRev]; bitRevData[iRev]= tempRev; }
kRev=halfLen;
while(kRev〈=jRev) {
jRev=jRev—kRev; kRev=kRev>>1; } } }
//W[n]=exp(j*2*
3、FFT计算.有3个循环体,分别为a内循环,b中间循环,c外循环,内循环实现蝶形结计算,循环a和b完成所有的蝶形结运算,而循环c则表示完成FFT算法所需要的级数。 //x-—输入数据的指针 //w——旋转因子指针 //n-—FFT的长度
void sp_cfftr2_dit(float *x,float *w,short n) {
short n2,ie,ia,i,j,k,m; float rtemp,itemp,c,s;
n2=n; ie=1;
for(k=n;k〉1;k〉>=1) //loop c {
n2〉〉=1;ia=0;
for(j=0;j //loop b {
c=w[2*j]; s=w[2*j+1];
for(i=0;i;i++) //loop a {
m=ia+n2;
rtemp=c*x[2*m]+s*x[2*m+1]; itemp= c*x[2*m+1]-s*x[2*m]; x[2*m]=x[2*ia]—rtemp; x[2*m+1]=x[2*ia+1]-itemp; x[2*ia]=x[2*ia]+rtemp; x[2*ia+1]=x[2*ia+1]+itemp; ia++; } ia+=n2; }
ie〈<=1; } }
本文来源:https://www.wddqw.com/doc/7c609bdd7c192279168884868762caaedd33bad1.html