资源描述:
《华中科技大学信号与系统课程设计》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、《信号与系统》课程设计报告题目:快速傅立叶变换(FFT)的计算机实现学号姓名专业电气工程及其自动化班级指导教师黄劲院(系、所)电气与电子工程学院华中科技大学教务处制快速傅立叶变换(FFT)的计算机实现一、基本要求1.用C语言编程实现FFT计算.2.用MATLAB进行FFT频谱分析,绘制信号的频谱特性曲线.3.分析改变序列的长度?(采样点数)或改变波形的谐波含量对计算结果产生的影响.二、设计原理2??−1??−?DFT:?(?)=∑?=1?(?)??0≤?≤?−1(??=ⅇ?,以下同)?−1−??IDFT:?(?)=∑?(?)?
2、?0≤?≤?−1?=0???(?−?)−????∗??的对称性:??=??=(??)???的周期性:???=??(?+?)=?(?+?)?????FFT是利用DFT中系数???的对称性和周期性来实现高速率频谱分析的方法,?可把长序列的DFT分解成更小点数的DFT.这里采用按时间抽取的基-2FFT算法,即要求点数?=2?(?为正整数),在抽取过程中对时间进行奇偶分,对频率进行前后分,具体如下:?将?(?)按奇偶分成两个长为的序列2??1(?)=?(2?)0≤?≤−12??2(?)=?(2?+1)0≤?≤−12设?∕2−1(?)=
3、∑?(?)???(?)]?11?=???[?12?=0?∕2−1(?)=∑?(?)???(?)]?22?=???[?22?=0?∕2−1?∕2−12??(2?+1)??则?(?)=∑?=0?(2?)??+∑?(2?+1)??=?1(?)+???2(?)?=0????(?+2)=?1(?)−???2(?)(?=0,1,⋯,2−1)??这样就将?点DFT分解成两个点的DFT的计算,按同样的方法点DFT还可22??以再分解为四个点的DFT,最后达到个2点的DFT,一共有?级.在?级的迭代42?运算中,每级由个蝶形运算组成,一般的运算
4、方程如下:21快速傅立叶变换(FFT)的计算机实现??+1(?)=??(?)+?????(?)??+1(?)=??(?)−?????(?)完成一个蝶形运算需要一次复乘法和两次复加法,完成?点的DFT计算,需要??log2?级迭代运算,每级有个蝶形,共有蝶形数为log2?,故完成?点的时间抽22??取FFT计算的计算量为:复乘次数??=log2?=?,复加次数??=2⋅22?2log2?=??.而直接计算DFT需要复乘次数为??=?,复加次数??=2?(?−1).对比可知,FFT的计算量远比DFT小,其效率要高得多.三、设计内容
5、1.用MATLAB进行仿真设计.对连续时间信号?(?)=2sin16??+5cos50??+8sin80??进行FFT频谱分析.信号最大频率??=40??,根据奈奎斯特采样定理,当采样频率??≥2??=80??方能避免频域的混叠失真,采样后才能不失真地恢复出原信号,因此取采样频率1为??==200??.?1)令采样点数?分别为16、32、64、128,利用FFT对信号分别进行16点、32点、64点、128点的DFT计算,并对其频谱特性进行比较分析.MATLAB的仿真实现程序如下:%MATLABProgramofFFTAnaly
6、sis%16点DFTfs=200;T=1/fs;N=16;n=0:N-1;t=n*T;x1=2*sin(2*pi*8*t)+5*cos(2*pi*25*t)+8*sin(2*pi*40*t);y1=fft(x1,N);X1=abs(y1);f=fs*(0:N-1)/N;subplot(221);plot(f(1:N/2),X1(1:N/2),'o');xlabel('Frequency(Hz)');ylabel('Magnitude');title('16pointsDFT');gridon;%32点DFTfs=200;T=1
7、/fs;N=32;n=0:N-1;t=n*T;x2=2*sin(2*pi*8*t)+5*cos(2*pi*25*t)+8*sin(2*pi*40*t);y2=fft(x2,N);X2=abs(y2);f=fs*(0:N-1)/N;subplot(222);plot(f(1:N/2),X2(1:N/2),'o');xlabel('Frequency(Hz)');ylabel('Magnitude');title('32pointsDFT');gridon;2快速傅立叶变换(FFT)的计算机实现%64点DFTfs=200;T=1/
8、fs;N=64;n=0:N-1;t=n*T;x3=2*sin(2*pi*8*t)+5*cos(2*pi*25*t)+8*sin(2*pi*40*t);y3=fft(x3,N);X3=abs(y3);f=fs*(0:N-1)/N;subplot(223);plot(f(1:N/