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);
//W[n]=exp(j*2*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; } } } 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 { c=w[2*j]; s=w[2*j+1]; for(i=0;i { 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; } }