1、实验 12 离散傅里叶变换(DFT)(完美格式版,本人自己完成,所有语句正确,不排除极个别错误,特别适用于山大,勿用冰点等工具下载,否则下载之后的 word 格式会让很多部分格式错误,谢谢 )XXXX 学号姓名处 XXXX一、实验目的(1)加深对离散傅里叶变换(DFT) 基本概念的理解。(2)了解有限长序列傅里叶变换(DFT) 与周期序列傅里叶级数 (DFS)、离散时间傅里叶变换(DTFT)的联系。(3)掌握用 MATLAB 语言进行离散傅里叶变换和逆变换的方法。二、实验内容1.有限长序列的傅里叶变换(DFT)和逆变换(IDFT)2.有限长序列 DFT 与周期序列 DFS 的联系3.有限长序列
2、 DFT 与离散时间傅里叶变换 DTFT 的联系三、实验环境MATLAB7.0 四、实验原理1.有限长序列的傅里叶变换(DFT)和逆变换(IDFT)在实际中常常使用有限长序列。如果有限长序列信号为 x(n),则该序列的离散傅里叶变换对可以表示为(12-1)1N,0k,Wx(n)DFT()X(k)1N0 (12-2),n,X()I()x(n)10kkN从离散傅里叶变换定义式可以看出,有限长序列在时域上是离散的,在频域上也是离散的。式中, 即仅在单位圆上 N 个等间距的点上取值,这为使用计算机进N2jeW行处理带来了方便。由有限长序列的傅里叶变换和逆变换定义可知,DFT 和 DFS 的公式非常相似
3、,因此在程序编写上也基本一致。例 12-1 已知 x(n)0,1, 2,3,4,5,6,7 ,求 x(n)的 DFT 和 IDFT。要求:(1)画出序列傅里叶变换对应的|X(k)|和 argX(k)图形。(2)画出原信号与傅里叶逆变换 IDFTX(k) 图形进行比较。解 MATLAB 程序如下: xn=0,1,2,3,4,5,6,7; %建立信号序列 N=length(xn); n=0:(N-1);k=0:(N-1); Xk=xn*exp(-j*2*pi/N).(n*k); %离散傅里叶变换 x=(Xk*exp(j*2*pi/N).(n*k)/N;% %离散傅里叶逆变换 subplot(2,2
4、,1),stem(n,xn); %显示原信号序列 title(x(n); subplot(2,2,2),stem(n,abs(x); %显示逆变换结果 title(IDFT|X(k)|); subplot(2,2,3),stem(k,abs(Xk); %显示|X(k)| title(|X(k)|); subplot(2,2,4),stem(k,angle(Xk); %显示 arg|X(k)| title(arg|X(k)|);运行结果如图 12-1 所示。0 2 4 6 802468 x(n)0 2 4 6 802468 IDFT|X(k)|0 2 4 6 80102030 |X(k)|0 2
5、 4 6 8-4-2024 arg|X(k)|图 12-1 例 12-1 有限长序列的傅里叶变换和逆变换结果从得到的结果可见,与周期序列不同的是,有限长序列本身是仅有 N 点的离散序列,相当于周期序列的主值部分。因此,其频谱也对应序列的主值部分,是含 N 点的离散序列。2.有限长序列 DFT 与周期序列 DFS 的联系将周期序列的傅里叶级数变换对(式(11-1)和式(11-2) 与有限长序列离散傅里叶变换对(式(12-1)和式(12-2)进行比较,可以看出两者的区别仅仅是将周期序列换成了有限长序列。例 12-2 已知周期序列的主值 x(n)0,1,2,3,4,5,6,7 ,求 x(n)周期重复
6、次数为 4 次时的 DFS。要求:(1)画出原主值和信号周期序列信号。(2)画出序列傅里叶变换对应的 和 的图形。(k)X()arg解 MATLAB 程序如下: xn=0,1,2,3,4,5,6,7; N=length(xn); n=0:4*N-1;k=0:4*N-1; xn1=xn(mod(n,N)+1); %即 xn1=xn,xn,xn,xn Xk=xn1*exp(-j*2*pi/N).(n*k); %离散傅里叶变换 subplot(2,2,1),stem(xn); %显示序列主值 title(原主值信号 x(n); subplot(2,2,2),stem(n,xn1); %显示周期序列
7、title(周期序列信号 ); subplot(2,2,3),stem(k,abs(Xk); %显示序列的幅度谱 title(|X(k)|); subplot(2,2,4),stem(k,angle(Xk); %显示序列的相位谱 title(arg|X(k)|);运行结果如图 12-2 所示。0 2 4 6 802468 主主主主主x(n)0 10 20 30 4002468 主主主主主主0 10 20 30 40050100150 |X(k)|0 10 20 30 40-4-2024 arg|X(k)|图 12-2 例 12-2 周期序列的傅里叶级数(DFS)结果由这个周期序列的实验我们可以
8、看出,与例 12-1 相比,有限长序列 x(n)可以看成是周期序列 的一个周期;反之,周期序列 可以看成是有限长序列 x(n)以 N 为周期的(n)x (n)x周期延拓。频域上的情况也是相同的。从这个意义上说,周期序列只有有限个序列值有意义。3.有限长序列 DFT 与离散时间傅里叶变换 DTFT 的联系离散时间傅里叶变换(DTFT)是指信号在时域上为离散的,而在频域上则是连续的。如果离散时间非周期信号为 x(n),则它的离散傅里叶变换对 (DTFT)表示为njjex()X(eDTFx(n)de)X(21x(n)IDTFX(e jjj其中 X(ejw)称为信号序列的频谱。将频谱表示为 .|X(e
9、jw)|)(jje)()(e称为序列的幅度谱, 称为序列的相位谱。)(earg)(j从离散时间傅里叶变换的定义可以看出,信号在时域上是离散的、非周期的,而在频域上则是连续的、周期性的。与有限长序列相比,X(ejw)仅在单位圆上取值,X(k)是在单位圆上 N 个等间距的点上取值。因此,连续谱 X(ejw)可以由离散谱 X(k)经插值后得到。为了进一步理解有限长序列的傅里叶变换(DFT)与离散时间傅里叶变换 (DTFT)的联系,我们举例说明离散时间傅里叶变换的使用方法和结果。例 12-3 求 x(n)0,1,2,3,4,5,6,7 ,0n7 的 DTFT,将(2p,2p) 区间分成 500 份。要
10、求:(1)画出原信号。(2)画出由离散时间傅里叶变换求得的幅度谱 X(ejw)和相位谱 argX(ejw) 图形。解 MATLAB 程序如下: xn=0,1,2,3,4,5,6,7; N=length(xn); n=0:N-1; w=linspace(-2*pi,2*pi,500); %将-2p,2p 频率区间分割为 500 份 X=xn*exp(-j*n*w); %离散时间傅里叶变换 subplot(3,1,1),stem(n,xn,k); ylabel(x(n); subplot(3,1,2),plot(w,abs(X),k); %显示序列的幅度谱 axis(-2*pi,2*pi,1.1*
11、min(abs(X),1.1*max(abs(X); ylabel(幅度谱); subplot(3,1,3),plot(w,angle(X),k); %显示序列的相位谱 axis(-2*pi,2*pi,1.1*min(angle(X),1.1*max(angle(X); ylabel(相位谱);运行结果如图 12-3 所示。0 1 2 3 4 5 6 70510x(n)-6 -4 -2 0 2 4 6102030主主主-6 -4 -2 0 2 4 6-202主主主图 12-3 例 12-3 离散时间傅里叶变换(DTFT) 的结果由图 12-3 与 DFT 的结果图 12-1 相比可以看出,两者
12、有一定的差别。主要原因在于,该例进行 DTFT 时,X(ejw)在单位圆上取 250 个点进行分割;而图 12-1 进行 DFT 时,X(k)是在单位圆上 N8 的等间距点上取值, X(k)的序列长度与 X(ejw)相比不够长。例 12-4 仍然用 x(n)0,1 ,2,3,4,5,6,7 ,将 x(n)的有限长序列后面补足至N100,求其 DFT,并与例 12-3 进行比较。解 将例 12-1 程序的前 2 行改为N100;xn0,1,2,3,4,5,6,7,zeros(1,N8) ;则|X(k)|和 argX(k)的图形接近由离散时间傅里叶变换求得的幅度谱 X(ejw)和相位谱 arg X
13、(ejw)的图形,如图 12-4 所示。注意,此图对应0,2p区间。MATLAB 程序如下: N=100; xn=0,1,2,3,4,5,6,7,zeros(1,N-8); %建立信号序列 n=0:(N-1);k=0:(N-1); Xk=xn*exp(-j*2*pi/N).(n*k); %离散傅里叶变换 x=(Xk*exp(j*2*pi/N).(n*k)/N; %离散傅里叶逆变换 subplot(2,1,1),stem(k,abs(Xk); %显示|X(k)| title(|X(k)|); subplot(2,1,2),stem(k,angle(Xk); %显示arg|X(k)| title(
14、arg|X(k)|);运行结果如图 12-4 所示。0 10 20 30 40 50 60 70 80 90 1000102030 |X(k)|0 10 20 30 40 50 60 70 80 90 100-4-2024 arg|X(k)|图 12-4 增长有限长序列的长度得到|X(k)|和 argX(k)五、实验过程2.已知有限长序列 x(n)7,6,5,4,3,2 ,求 x(n)的 DFT 和 IDFT。要求:画出序列傅里叶变换对应的|X(k)|和 argX(k)的图形。画出原信号与傅里叶逆变换 IDFTX(k)的图形进行比较。解 MATLAB 程序如下: xn=7,6,5,4,3,2,
15、; %建立信号序列 N=length(xn); n=0:(N-1);k=0:(N-1); Xk=xn*exp(-j*2*pi/N).(n*k); %离散傅里叶变换 x=(Xk*exp(j*2*pi/N).(n*k)/N; %离散傅里叶逆变换 subplot(2,2,1),stem(n,xn); %显示原信号序列 title(x(n); subplot(2,2,2),stem(n,abs(x); %显示逆变换结果 title(IDFT|X(k)|); subplot(2,2,3),stem(k,abs(Xk); %显示|X(k)| title(|X(k)|); subplot(2,2,4),st
16、em(k,angle(Xk); %显示 arg|X(k)| title(arg|X(k)|);运行结果如图 12-5 所示。0 2 4 602468 x(n)0 2 4 602468 IDFT|X(k)|0 2 4 60102030 |X(k)|0 2 4 6-2-1012 arg|X(k)|图 12-53.已知周期序列的主值 x(n)7,6,5,4,3,2 ,求 x(n)周期重复次数为 3 次时的DFS 和 IDFS。要求:画出原信号序列的主值和周期序列的图形。画出序列傅里叶变换对应的 和 的图形。(k)X()arg解 MATLAB 程序如下: xn=7,6,5,4,3,2,1; N=len
17、gth(xn); n=0:3*N-1;k=0:3*N-1; xn1=xn(mod(n,N)+1); %即 xn1=xn,xn,xn,xn Xk=xn1*exp(-j*2*pi/N).(n*k); %离散傅里叶变换 subplot(2,2,1),stem(xn); %显示序列主值 title(原主值信号 x(n); subplot(2,2,2),stem(n,xn1); %显示周期序列 title(周期序列信号 ); subplot(2,2,3),stem(k,abs(Xk); %显示序列的幅度谱 title(|X(k)|); subplot(2,2,4),stem(k,angle(Xk); %
18、显示序列的相位谱 title(arg|X(k)|);运行结果如图 12-6 所示。0 2 4 6 802468 主主主主主x(n)0 5 10 15 2002468 主主主主主主0 5 10 15 20050100 |X(k)|0 5 10 15 20-2-1012 arg|X(k)|图 12-64.求 x(n)7,6,5,4,3,2 ,0n5 的 DTFT,将 (2p,2p)区间分成 500 份。要求: 出原信号。画出由离散时间傅里叶变换求得的幅度谱 X(ejw)和相位谱 argX(ejw)的图形。求有限长序列 x(n)7,6,5,4,3,2 ,N 100 时的 DFT,并与 DTFT 的结
19、果进行比较。解 MATLAB 程序如下: xn=7,6,5,4,3,2; N=length(xn); n=0:N-1; w=linspace(-2*pi,2*pi,500); %将-2p,2p 频率区间分割为 500 份 X=xn*exp(-j*n*w); %离散时间傅里叶变换 subplot(3,1,1),stem(n,xn,k); ylabel(x(n); subplot(3,1,2),plot(w,abs(X),k); %显示序列的幅度谱 axis(-2*pi,2*pi,1.1*min(abs(X),1.1*max(abs(X); ylabel(幅度谱); subplot(3,1,3),
20、plot(w,angle(X),k); %显示序列的相位谱 axis(-2*pi,2*pi,1.1*min(angle(X),1.1*max(angle(X); ylabel(相位谱);运行结果如图 12-7 所示。0 0.5 1 1.5 2 2.5 3 3.5 4 4.5 50510x(n)-6 -4 -2 0 2 4 6510152025主主主-6 -4 -2 0 2 4 6-101主主主图 12-7 MATLAB 程序如下: N=100; xn=7,6,5,4,3,2,zeros(1,N-6); %建立信号序列 n=0:(N-1);k=0:(N-1); Xk=xn*exp(-j*2*pi
21、/N).(n*k); %离散傅里叶变换 x=(Xk*exp(j*2*pi/N).(n*k)/N; %离散傅里叶逆变换 subplot(2,1,1),stem(k,abs(Xk); %显示|X(k)| title(|X(k)|); subplot(2,1,2),stem(k,angle(Xk); %显示 arg|X(k)| title(arg|X(k)|);运行结果如图 12-8 所示。0 10 20 30 40 50 60 70 80 90 1000102030 |X(k)|0 10 20 30 40 50 60 70 80 90 100-2-1012 arg|X(k)|图 12-8六、实验感想通过此次实验中练习使用 matlab 语言进行离散傅里叶级数变换和逆变换的方法,更为熟悉的掌握了 matlab 的功能,在实验过程中也遇到很多小问题,并通过仔细检查和查阅相关书籍解决此类问题,让我深刻认识到,细节的重要性。在使用 help 过程中,深切体会到良好的英语基础和充实的课堂知识的重要性。