#include<math.h>
#include<iostream.h>
#include<iomanip.h>
#define swap(a,b) {float T; T=(a);(a)=b;(b)=T;}
void fft(float A[],float B[],unsigned M) //蝶形运算程序,A存实部,B存虚部,M是级数
{unsigned long N,I,J,K,L,LE,LE1,P,Q,R;
float Wr,Wi,Wlr,Wli,WTr,WTi,theta,Tr,Ti;
N=1<<M;//N=1<<M表示N=2^M
J=0;
for (I=0;I<N-1;I++)//for循环负责码位倒置存储
{if(J<I)
{swap(A[I],A[J]);swap(B[I],B[J]);}
K=N>>1;// K=N>>1表示K=N/2
while (K>=2&&J>=K)//while循环表示须向次高位进一位
{J-=K;K>>=1;//K>>=1表示K=K/2}
J+=K;}
for(L=1;L<=M;L++)
//for循环为M级FFT运算,外层循环由级数L控制,执行M次
{LE=1<<L;// LE=1<<L表示2^L,是群间隔
LE1=LE/2; //每个群的系数W数目
Wr=1.0;
Wi=0.0;
theta=(-1)*3.1415926536/LE1;
Wlr=cos(theta);
Wli=sin(theta);
for(R=0;R<LE1;R++)//中层循环由群系数控制
{for(P=R;P<N-1;P+=LE)
//R是群系数的编号,P、Q是基本蝶形运算两个输入数据在数组中的编号,循环每次完成同一个系数 的蝶形运算
{Q=P+LE1;
Tr=Wr*A[Q]-Wi*B[Q];Ti=Wr*B[Q]+Wi*A[Q];
A[Q]=A[P]-Tr;
B[Q]=B[P]-Ti;
A[P]+=Tr;
B[P]+=Ti;}
WTr=Wr;
WTi=Wi;
Wr=WTr*Wlr-WTi*Wli;
Wi=WTr*Wli+WTi*Wlr;}}
return;}
}
void main()//主程序
{int i,M,N,lb;
cout<<"请输入转换类别(若为FFT,请输入1;若为IFFT,请输入0)"<<endl;//确定转换类别
cin>>lb;
cout<<"请输入序列长度N"<<endl;
cin>>N;
float *A= new float[N];
float *B= new float[N];
M=log(N)/log(2);
cout<<"请输入序列的实部"<<endl;//输入序列实部
for(i=0;i<N;i++)
{cin>>A[i];}
cout<<"请输入序列的虚部"<<endl;//输入序列虚部
for(i=0;i<N;i++)
{cin>>B[i];}
cout << setiosflags(ios::fixed);//输出格式控制
cout<<"您输入的序列为"<<endl;
cout << setiosflags(ios::fixed);
for(i=0;i<N;i++)
cout<<A[i]<<"+j"<<B[i]<<endl;
cout<<endl;
if(lb==0)
{for(i=0;i<N;i++)
{B[i]=B[i]*(-1);}
fft(A,B,M);for(i=0;i<N;i++)
{B[i]=B[i]*(-1);}
for(i=0;i<N;i++)
{A[i]=A[i]/N;B[i]=B[i]/N;}}
if(lb==1)fft(A,B,M);
cout<<"转换后的序列为"<<endl;//输出序列
for(i=0;i<N;i++)
cout<<A[i]<<"+j("<<B[i]<<")"<<endl;
cout<<endl;
delete []A;
delete []B;}
fft.rar_visual c
版权申诉
26 浏览量
2022-09-19
20:53:06
上传
评论
收藏 1KB RAR 举报
朱moyimi
- 粉丝: 65
- 资源: 1万+
评论0