快速傅立叶变换FFT的计算机实现.doc
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《快速傅立叶变换FFT的计算机实现.doc》由会员分享,可在线阅读,更多相关《快速傅立叶变换FFT的计算机实现.doc(12页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、【精品文档】如有侵权,请联系网站删除,仅供学习与交流快速傅立叶变换FFT的计算机实现.精品文档.信号与系统课程设计FFT的计算机实现快速傅里叶变换(FFT)的计算机实现赖智鹏华中科技大学电气与电子工程学院0809班U200811806Email: 592425891摘要:本文是信号与系统课程的课程设计,旨在熟悉FFT的计算过程,结合DFT物理意义和实验结果加深对傅立叶变换的理解。文章首先用MATLAB对一个简单信号进行FFT仿真,得出频谱图;其次完成了FFT的C语言实现,结合MATLAB作图及数据处理功能得出了C实现下的FFT结果;最后,讨论分析实验结果。关键词:DFT、基-2按时间抽取FFT
2、算法、MATLAB、C、频谱、物理意义1. 算法描述1) DFT的运算量2) 减少运算的方法:v 化长序列为短序列。如将长度为N的序列分解为两个长度为N/2的序列v 利用的性质(注:本文中的C程序未用到此性质)3) C程序采用基-2按时间抽取的FFT算法设输入序列长度为 (M为正整数),将该序列按时间顺序的奇偶分解为越来越短的子序列,称为基2按时间抽取的FFT算法,也称为Coolkey-Tukey算法。若N不满足条件,则人为地加上若干零值,使。2. 实验设计与步骤为简单起见,同时不失一般性,本实验采用三个余弦成分和一个支流偏置成分叠加所得的信号作为信号源。3. MATLAB的FFT仿真和C的F
3、FT实现1) 关于频谱的理论分析:2) MATLAB的FFT仿真v MATLAB程序代码function output_args = FFT2( x0,x1,f1,w1,x2,f2,w2,x3,f3,w3,fs )%这是一个自定义函数,输入被采样的信号的参数和采样频率,然后输出原信号波形、采样信号序列、采样序列幅度谱和相位谱。函数规定信号由一个直流成分(大小为x0),三个余弦成分(各自频率分别为f1,f2,f3,幅值为x1,x2,x3,初相位为w1,w2,w3),采样频率为fs,采样时间为1秒。x0,x1,f1,w1,x2,f2,w2,x3,f3,w3,fs作为参数输入t=0:1/fs:1-1
4、/fs;%定义采样时刻N=length(t);%采样序列长度s=x0+x1*cos(2*pi*f1*t+pi/180*w1)+x2*cos(2*pi*f2*t+pi/180*w2)+x3*cos(2*pi*f3*t+pi/180*w3);%采样信号y=fft(s);%快速傅立叶变换tt=0:1/10000:1;%原信号描点ss=x0+x1*cos(2*pi*f1*tt+pi/180*w1)+x2*cos(2*pi*f2*tt+pi/180*w2)+x3*cos(2*pi*f3*tt+pi/180*w3);%原信号figure;plot(tt,ss);grid;title(原始信号);%原信号波
5、形figure;subplot(3,1,1);plot(0:N-1,s(1:N),-o);xlim(0 N-1);grid;title(采样信号);subplot(3,1,2);plot(0:N-1,abs(y(1:N),-o);xlim(0 N-1);grid;xlabel(k);ylabel(幅度);title(理想采样信号的幅度谱);subplot(3,1,3);plot(0:N-1,angle(y(1:N),-o);grid;xlabel(k);ylabel(相位);axis(0 N-1 -pi pi);title(理想采样信号的相位谱);end;v 改变采样频率 依次键入:%其中FF
6、T2()是自定义函数,对信号在1秒内以频率fs进行采样FFT2(1,1,1,90,2,2,180,3,3,180,32)FFT2(1,1,1,90,2,2,180,3,3,180,16)FFT2(1,1,1,90,2,2,180,3,3,180,8)FFT2(1,1,1,90,2,2,180,3,3,180,4)原始信号如图:图1图2、fs =32Hz图3、fs =16Hz图4、fs =8Hz图5、fs =4Hz注意到:1、幅度谱,除却k=0外,图形呈轴对称分布;2、相位谱,N为偶数时除却k=0和N/2外(N为奇数时,除却k=0外),图形呈中心对称分布。理论上,由于复指数的周期性,长度为N(假
7、设N为偶数,N为奇数时类似)的的DFT频谱分析,可把k=N/2,N/2+1,N-1看作是负频率-N/2,-N/2+1,-N/2+2,-2,-1,特别的,对于实序列而言,正负频率成分的幅值必须相等,而初相位必须相反。下面取fs=8Hz和4Hz部分计算结果分析,其他情况可类似处理。可看到:fs=8Hz时,由频谱结合物理意义计算的得到的余弦成分的幅值和初相位与原信号一致;fs=4Hz时,由频谱结合物理意义计算的得到的余弦成分的幅值和初相位与原信号不同。对此,可根据抽样定理解释。因为f1=1Hz,f2=2Hz, f3=3Hz,所以连续时间信号的截至频率fm=f3=3Hz,所以抽样频率fs=4Hz时,f
8、s %改变信号的直流成分(由1变为2),原信号和频谱如下FFT2(2,1,1,90,2,2,180,3,3,180,32)图9 图10 fs=32Hz变化趋势:幅度谱中k=0对应的幅度变为2N=64(原为32),其余处无明显变化,相位谱中,k=0,1,2,3对应的相位值都不变。 键入: %改变第三个余弦成分的幅值(由3改为4),原信号图和频谱图如下FFT2(2,1,1,90,2,2,180,4,3,180,32)图11 图12 fs=32Hz变化趋势:幅度谱中k=3对应的幅度变为64(4*32/2=64,原来这个值为3*32/2=48),其余处无明显变化,相位谱中k=0,1,2,3对应的相位值
9、都未发生变化。 键入: %改变第三个余弦成分的频率(由3Hz改为4Hz),原信号图和频谱如下FFT2(2,1,1,90,2,2,180,4,4,180,32)图13 图14 fs=32Hz变化趋势:幅度谱中,k=4处幅度为N/2*4=64,k=3处幅度变为0,k=0,1,2处幅度不变;相位谱中,k=4处相位变为180,k=0,1,2,3处相位值不变。 键入:%改变第三个余弦成分的初相位(由180改为270),原信号和频谱如下图FFT2(2,1,1,90,2,2,180,4,4,270,32)图15 图16 fs=32Hz变化趋势:幅度谱波形无明显变化;相位谱中,k=4处相位值变为-90度,即2
10、70度。由此可见,改变信号的波幅、频率和相位,幅度谱和相位谱将发生相应的变化,即恰合频谱的物理意义。3) C语言实现FFTv C代码/*此代码用于fft计算,采用基-2按时间抽取的FFT算法Decimation-in-Time(DIT)(Coolkey-Tukey)。为方便起见,同时不失一般性,把含有一个直流成分和三个正弦成分的信号作为被采样信号,信号的输入由函数input()完成,若想改变信号波形只需改变input()函数代码。代码分别定义了复数结构体、复数运算和码位倒读函数。计算结果分别在命令窗口和文件e:keshe.txt中输出,keshe.txt文件数据可用于matlab作图分析*/#
11、include#include/*圆周率*/double pi=3.141592653589793;int M,N;/*定义复数*/struct Complex_double real;double img;*a,*b;/*定义2的幂计算*/int x_2(int a)int i,r;r=1;for(i=0;i=0;j-)ii+=(int)(i/x_2(j)*x_2(M-1-j);/*先把i用二进制表示,然后码位倒读*/i-=(int)(i/x_2(j)*x_2(j);return(ii);/*定义复数乘法*/struct Complex_ Multi(struct Complex_ a,st
12、ruct Complex_ b)struct Complex_ c;c.real=a.real*b.real-a.img*b.img;c.img=a.real*b.img+a.img*b.real;return(c);/*定义复数幂运算*/struct Complex_ W_K(struct Complex_ W,int k)int i;struct Complex_ x,y;x=W;if(k=0)x.real=1;x.img=0;return(x);elsefor(i=1;ik;i+)y=Multi(x,W);x=y;return(x);/*定义复数加法*/struct Complex_ A
13、dd(struct Complex_ a,struct Complex_ b)struct Complex_ c;c.real=a.real+b.real;c.img=a.img+b.img;return(c);/*离散序列的输入*/void input()int NN,i;float f1,f2,f3,a0,a1,a2,a3,w1,w2,w3;M=0;/*在一秒钟内,采点数*/printf(采点数:);scanf(%d,&NN);printf(n);/*信号的直流成分*/printf(信号的直流成分:n);scanf(%f,&a0);/*信号有三个余弦成分*/*余弦成分1*/printf(第
14、1个正弦成分的频率:n);scanf(%f,&f1);printf(幅值:n);scanf(%f,&a1);printf(初相位:n);scanf(%f,&w1);/*余弦成分2*/printf(第2个正弦成分的频率:n);scanf(%f,&f2);printf(幅值:n);scanf(%f,&a2);printf(初相位:n);scanf(%f,&w2);/*余弦成分3*/printf(第3个正弦成分的频率:n);scanf(%f,&f3);printf(幅值:n);scanf(%f,&a3);printf(初相位:n);scanf(%f,&w3);for(i=0;x_2(i)NN;i+)
15、M=i+1;N=x_2(M);/*N为不小于NN的最小的2的幂*/a=(struct Complex_*)calloc(N,sizeof(struct Complex_);/*动态开辟N个单位*/b=(struct Complex_*)calloc(N,sizeof(struct Complex_);/*动态开辟N个单位*/*把采样信号用码位倒读的方法存入计算机中*/for(i=0;iNN;i+)areverse(i).real=a0+a1*cos(2*pi*f1*i/N+w1/180*pi)+a2*cos(2*pi*f2*i/N+w2/180*pi)+a3*cos(2*pi*f3*i/N+w
16、3/180*pi);/*其中reverse()为码位倒读函数*/areverse(i).img=0;/*动态空间空闲处,补零*/for(i=NN;iN;i+)areverse(i).real=0;areverse(i).img=0;/*主函数*/void main()int i,j,k,m,n,q,r;FILE *fp;/*文件指针,指向存储fft结果的文件*/struct Complex_ d,W,Wk,x,y;j=0;input();m=1;n=N;for(i=0;iM;i+)/*M级运算*/n=n/2;m=m*2;q=x_2(i+1);/*q=2(i+1)*/W.real=cos(-2*
17、pi/q);/*旋转因子实部*/W.img=sin(-2*pi/q);/*旋转因子虚部*/ for(j=0;jn;j+)/*n群运算*/ for(k=0;km/2;k+)Wk=W_K(W,k); bj*m+k=Add(aj*m+k,Multi(Wk,aj*m+k+m/2);/*Add()为复数相加函数,Multi()为复数相乘函数*/for(k=m/2;km;k+) Wk=W_K(W,k); bj*m+k=Add(aj*m+k-m/2,Multi(Wk,aj*m+k); /*Add()为复数相加函数,Multi()为复数相乘函数*/for(r=0;rN;r+) ar=br;/*将结果写入文件e
18、:keshe.txt*/if(fp=fopen(e:keshe.txt,w+)=NULL)printf(Cannot open file strike any key exit!);getch();exit(1);for(n=0;nN;n+)fprintf(fp,%16.14f %16.14fn,an.real,an.img);for(n=0;nN;n+)printf(%16.14f+%16.14fin,an.real,an.img);free(a);/*释放内存空间*/free(b);/*释放内存空间*/v 改变采样频率实验数据将由keshe.txt调入到MATLAB中,做出频谱图。 参数设
19、置1图17 fs=32Hz(C实现)图18 fs=32Hz(MATLAB仿真)注意到两图的幅度谱图,很相似,而相位谱却相差很大。用C实现的FFT得到的相位谱也似乎没有什么对称性,但可以看到两个相位谱在k=0,1,2,3和31,30,29处的相位值是基本一致的,而其他点处,相位值差异则很大。(表1,列出了具体的数值计算结果)表1kFFT(C)FFT(MATLAB)FFT结果相位值FFT结果相位值032.0000000000000 + 0.00000000000000i032.0000000000000 + 0.00000000000000i010.00000000000000 + 16.0000
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 快速 傅立叶 变换 FFT 计算机 实现
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内