成绩
数字信号处理 实验报告
实验名称: FFT算法的应用 实验班级: 姓 名: 学号(后两位): 指导教师: 实验日期:
实验3 FFT算法的应用
一、实验目的
1、加深对离散信号的DFT的理解;
2、在MATLAB中实现FFT算法。
二、实验原理
N点序列的DFT和IDFT变换定义式如下:
,
,
利用旋转因子具有周期性,可以得到快速算法(FFT)。
在MATLAB中,可以用函数x=fft(x,N)和x=ifft(x,N)计算N点序列的DFT正、反变换。
三、预习要求
1、在MATLAB中,熟悉函数fft、ifft的使用;
2、阅读扩展练习中的实例,学习在MATLAB中的实现FFT算法的实现;
3、利用MATLAB编程完成计算,绘出相应图形。并与理论计算相比较,说明实验结果的原因。
例:对连续的单一频率周期信号 按采样频率和N =16,观察其DFT结果的幅度谱。 解:此时离散序列
,即k=8。用MATLAB计算并采样,截取长度N分别选N =20
作图,函数fft用于计算离散傅里叶变换DFT,程序如下: k=8;
n1=[0:1:19];
xa1=sin(2*pi*n1/k); subplot(2,2,1) plot(n1,xa1)
xlabel('t/T');ylabel('x(n)'); xk1=fft(xa1);xk1=abs(xk1); subplot(2,2,2) stem(n1,xk1)
xlabel('k');ylabel('X(k)'); n2=[0:1:15];
1
xa2=sin(2*pi*n2/k); subplot(2,2,3) plot(n2,xa2)
xlabel('t/T');ylabel('x(n)'); xk2=fft(xa2);xk2=abs(xk2); subplot(2,2,4) stem(n2,xk2)
xlabel('k');ylabel('X(k)');
图1 不同的截取长度的正弦信号及其DFT结果
计算结果示于图1,(a)和(b)分别是N=20时的截取信号和DFT结果,由于截取了两个半周期,频谱出现泄漏;(c) 和(d) 分别是N=16时的截取信号和DFT结果,由于截取了两个整周期,得到单一谱线的频谱。上述频谱的误差主要是由于时域中对信号的非整周期截断产生的频谱泄漏。
四、实验内容 1、2N点实数序列
2
N=64。用一个64点的复数FFT程序,一次算出,并绘出 图形。(按照基于2的蝶型结构的递推公式编程) 编程如下:
N=64;n=[0:1:N-1];
n1=2*n;n2=2*n+1;k=[0:1:N-1];
xn1=cos(2*pi/N*7*n1)+1/2*cos(2*pi/N*19*n1); xn2=cos(2*pi/N*7*n2)+1/2*cos(2*pi/N*19*n2); XK1=fft(xn1);XK2=fft(xn2); X1=XK1+exp(-j*pi*k/N).*XK2; X2=XK1-exp(-j*pi*k/N).*XK2;
X1=[X1 zeros(1,N)];X2=[zeros(1,N) X2]; XK=X1+X2;
k=[0:1:2*N-1];
XK=abs(XK); stem(k,XK);
xlabel('k');ylabel('|X(k)|'); title('X(k)=DFT[x(n)]2N')
2、已知某序列
在单位圆上的N=64等分样点的Z变换为:
。
的
3