FFT算法C语言程序代码

FFT算法C语言程序代码
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;

}

}

相关主题
相关文档
最新文档