FFT算法C语言程序代码
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
n2>>=1;ia=0;
for(j=0;j<ie;j++) //loop b
{
c=w[2*j];
s=w[2*j+1];
for(i=0;i<n2;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;
}
}
intiRev,jRev,kRev,halfLen;
halfLen=revLen>>1;jRev=0;
for(iRev=0;iRev<(revLen-1);iRev++)
{
If(iRev<jRev)
{
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算法所需要的级数。
}
}
2、在运行FFT之前,对输入序列进行倒序变换,代码如下:
//bitRevData——指向位变换序列的指针
//revLen——FFT长度
Void bit_rev(struct complexData *bitRevData,int revLen)
{
struct complexData tempRev;
{
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)
DIT-基2FFT的浮点C语言程序:
1、生成旋转因子,复数结构,旋转因子Wn=exp(-j*2*pi/N)
//twiFactor——指向旋转因子矩阵的指针
//wLen——FFT的长度
Struct complexData{ //定义一个复数结构
float re;
t im;
};
Void gen_w_r2(struct complexData *twiFactor,int wLen)
//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<ie;j++) //loop b
{
c=w[2*j];
s=w[2*j+1];
for(i=0;i<n2;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;
}
}
intiRev,jRev,kRev,halfLen;
halfLen=revLen>>1;jRev=0;
for(iRev=0;iRev<(revLen-1);iRev++)
{
If(iRev<jRev)
{
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算法所需要的级数。
}
}
2、在运行FFT之前,对输入序列进行倒序变换,代码如下:
//bitRevData——指向位变换序列的指针
//revLen——FFT长度
Void bit_rev(struct complexData *bitRevData,int revLen)
{
struct complexData tempRev;
{
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)
DIT-基2FFT的浮点C语言程序:
1、生成旋转因子,复数结构,旋转因子Wn=exp(-j*2*pi/N)
//twiFactor——指向旋转因子矩阵的指针
//wLen——FFT的长度
Struct complexData{ //定义一个复数结构
float re;
t im;
};
Void gen_w_r2(struct complexData *twiFactor,int wLen)
//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