《数字信号处理》 一实验指导 数字信号处理课程组 信息学院 班级: 姓名: 学号: 实验序号 2 3 4 5 成绩 综合评定: 成绩: 指导教师签字:
《数字信号处理》 —实验指导 数字信号处理课程组 信息学院 班级: 姓名: 学号: 实验序号 1 2 3 4 5 成绩 综合评定: 成绩: 指导教师签字:
实验一典型离散信号及其MATLAB实现 一、实验目的 I.掌握MATLAB语言的基本操作,学习基本的编程功能。 2.掌握MATLAB产生常用离散时间信号的编程方法。 3.掌握MATLAB计算卷积的方法。 二、实验原理 (一)MATLAB常用离散时间信号 [1n=0 1. 单位抽样序列:6(n)= 0n≠0 x=zeros(1,N); 在MATLAB中可以利用zeros(O函数实现。 x(I)=1 1 n=k 如果6(n)在时间轴上延迟了k个单位,得到8(n-k)即:6n-k)= 0n≠0 1 n≥0 2.单位阶跃序列:(n 0n<0 在MATLAB中可以利用ones()函数实现。x=Ones(L,N); 3.正弦序列:x(n)=Asin(2gin/Fs+p) n=0:N-1 在MATLAB中: x=A*sin(2*pi*f n/Fs+fai) 4.复正弦序列:x(n)=ejom n=0:N-1 在MATLAB中: x exp(j*w*n) 5.指数序列:x(n)=a” n=0:N-1 在MATLAB中: x=a.n 6.y=f1iplr(x)一一信号的翻转 y=square(x)一一产生方波信号
2 实验一 典型离散信号及其 MATLAB 实现 一、实验目的 1. 掌握 MATLAB 语言的基本操作,学习基本的编程功能。 2. 掌握 MATLAB 产生常用离散时间信号的编程方法。 3. 掌握 MATLAB 计算卷积的方法。 二、实验原理 (一)MATLAB 常用离散时间信号 1. 单位抽样序列: = 0 1 (n) 0 0 = n n 在 MATLAB 中可以利用 zeros()函数实现。 (1) 1; (1, ); = = x x zeros N 如果 (n) 在时间轴上延迟了 k 个单位,得到 (n − k) 即: − = 0 1 (n k) 0 = n n k 2.单位阶跃序列: 0 1 u(n) 0 0 n n 在 MATLAB 中可以利用 ones()函数实现。 x = ones(1, N); 3.正弦序列: x(n) = Asin( 2fn/ Fs +) 在 MATLAB 中: *sin( 2* * * / ) 0 : 1 x A pi f n Fs fai n N = + = − 4.复正弦序列: j n x n e ( ) = 在 MATLAB 中: exp( * * ) 0 : 1 x j w n n N = = − 5.指数序列: n x(n) = a 在 MATLAB 中: x a n n N .^ 0 : 1 = = − 6.y=fliplr(x)——信号的翻转; y=square(x)——产生方波信号
y=sawtooth(x)一一产生锯齿波信号: y=sinc(x)一一产生sinc函数信号。 (二)离散时间信号的卷积 由于系统的零状态响应是激励与系统的单位取样响应的卷积,因此卷积运算在离散时间 信号处理领域被广泛应用。离散时间信号的卷积定义为 m)=xm)*m)=∑x(m)hn-m) =-0 可见,离散时间信号的卷积运算是求和运算,因而常称为“卷积和”。 MATLAB求离散时间信号卷积和的命令为conv,其语句格式为 y=conv(x,h) 其中,X与h表示离散时间信号值的向量:y为卷积结果。用MATLAB进行卷积和运算时, 无法实现无限的累加,只能计算时限信号的卷积。 三、实验内容 (一)离散信号的产生 离散信号的图形显示使用stem指令。 1.编写MATLAB程序,产生下列典型脉冲序列。 (1)单位脉冲序列:起点n0,终点nf,在ns处有一单位脉冲。 (2)单位阶跃序列:起点n0,终点nf,在ns前为0,在ns处及以后均为 1(n0=0]: %单位阶跃序列 n3=n0:nf;x3=(0.75).^n3: %实指数序列 n4=n0:nf:x4=exp((-0.2+0.7j)*n4); %复指数序列 subplot(2,2,1),stem(nl,x1); subplot(2,2,2),stem(n2,x2);
3 y=sawtooth(x)——产生锯齿波信号; y=sinc(x)——产生 sinc 函数信号。 (二)离散时间信号的卷积 由于系统的零状态响应是激励与系统的单位取样响应的卷积,因此卷积运算在离散时间 信号处理领域被广泛应用。离散时间信号的卷积定义为 =− = = − m y(n) x(n) * h(n) x(m)h(n m) 可见,离散时间信号的卷积运算是求和运算,因而常称为“卷积和”。 MATLAB 求离散时间信号卷积和的命令为 conv,其语句格式为 y=conv(x,h) 其中,x 与 h 表示离散时间信号值的向量;y 为卷积结果。用 MATLAB 进行卷积和运算时, 无法实现无限的累加,只能计算时限信号的卷积。 三、实验内容 (一) 离散信号的产生 离散信号的图形显示使用 stem 指令。 1. 编写 MATLAB 程序,产生下列典型脉冲序列。 (1)单位脉冲序列:起点 n0,终点 nf,在 ns 处有一单位脉冲。 (2)单位阶跃序列:起点 n0,终点 nf,在 ns 前为 0,在 ns 处及以后均为 1(n0=0]; %单位阶跃序列 n3=n0:nf;x3=(0.75).^n3; %实指数序列 n4=n0:nf;x4=exp((-0.2+0.7j)*n4); %复指数序列 subplot(2,2,1),stem(n1,x1); subplot(2,2,2),stem(n2,x2);
subplot(2,2,3),stem(n3,x3); figure subplot(2,2,1),stem(n4,real(x4)); subplot(2,2,2),stem(n4,imag(x4)); subplot(2,2,3),stem(n4,abs(x4)); subplot(2,2,4),stem(n4,angle(x4)); (二)离散时间信号的卷积 用MATLAB编写卷积运算函数。 function [y,ny]=conv_improve(x,nx,h,nh) %[x,nx]为第一个信号 %[h,nh]为第二个信号 %conv(x,h)可以实现两个有限长度序列的卷积 nyl=nx(1)+nh(1); ny2=nx(length(x))+nh(length(h)): ny=[ny1:ny2] y=conv (x,h) 在命令窗口调用卷积函数。x=[340-2235]:nx=[-3:3]:h=[145601];nh=[N:N+5]; N是你的学号最后两位,带入后求结果。 结果为: 四、实验分析 观察实验结果,掌握、分析典型的离散时间信号,分析卷积运算。 五、实验总结 总结实验认识、过程、效果、问题、收获、体会、意见和建议
4 subplot(2,2,3),stem(n3,x3); figure subplot(2,2,1),stem(n4,real(x4)); subplot(2,2,2),stem(n4,imag(x4)); subplot(2,2,3),stem(n4,abs(x4)); subplot(2,2,4),stem(n4,angle(x4)); (二)离散时间信号的卷积 用 MATLAB 编写卷积运算函数。 function [y,ny]=conv_improve(x,nx,h,nh) %[x,nx]为第一个信号 %[h,nh]为第二个信号 %conv(x,h)可以实现两个有限长度序列的卷积 ny1=nx(1)+nh(1); ny2=nx(length(x))+nh(length(h)); ny=[ny1:ny2]; y=conv(x,h); 在命令窗口调用卷积函数。x=[3 4 0 -2 2 3 5]; nx=[-3:3]; h=[1 4 5 6 0 1]; nh=[N:N+5]; N 是你的学号最后两位,带入后求结果。 结果为: 四、实验分析 观察实验结果,掌握、分析典型的离散时间信号,分析卷积运算。 五、实验总结 总结实验认识、过程、效果、问题、收获、体会、意见和建议
实验二离散时间信号和离散时间系统 一、实验目的 1.掌握计算线性时不变系统的冲激响应的方法。 2.理解时域采样的概念及方法。 3.掌握离散时间信号的z变换和z逆变换分析 4.了解离散时间傅里叶变换(DTFT) 二、实验原理 (一)信号采样 采样就是利用周期性抽样脉冲序列P(t),从连续信号X(t)中抽取一系列的离散值,得 到抽样信号(或称抽样数据信号)即离散时间信号。 (二)线性时不变离散时间系统 线性系统:满足线性叠加原理的系统。若y,(n)和yz(n)分别是输入序列x(n)和xz(n) 的响应,则输入x(n)=a(n)+bx2(n)的输出响应为y(n)=ay1(n)+by2(n)。 时不变系统:即系统参数不随时间变化的系统,亦即系统对于输入信号的响应与信号加 于系统的时间无关。即满足:若y(n)是x(n)的响应,则y(n-m)是输入x(n-m)的响应,其中 m是任意整数。 数字滤波器对单位样本序列6n)的响应称为冲激响应,用h()表示。线性时不变离散 系统对输入信号x)的响应y)可用h()来表示:ym)=∑h(k)x(n-k)。 (三)z变换和逆z变换 序列x(n)的z变换定义为: x()=x() 其中,z是复变量。相应地,单边z变换定义为: X)=2” 刀=0 MATLAB提供了计算离散时间信号单边z变换的函数ztrans和z反变换函数iztrans: Z=ztrans((x),x=iztrans(z)。上式中的x和Z分别为时域表达式和z域表达式的符号表示,可
5 实验二 离散时间信号和离散时间系统 一、实验目的 1.掌握计算线性时不变系统的冲激响应的方法。 2.理解时域采样的概念及方法。 3.掌握离散时间信号的 z 变换和 z 逆变换分析 4.了解离散时间傅里叶变换(DTFT) 二、实验原理 (一)信号采样 采样就是利用周期性抽样脉冲序列 pT(t),从连续信号 xa(t)中抽取一系列的离散值,得 到抽样信号(或称抽样数据信号)即离散时间信号。 (二)线性时不变离散时间系统 线性系统:满足线性叠加原理的系统。若 y1(n)和 y2(n)分别是输入序列 x1(n)和 x2(n) 的响应,则输入 x(n)=ax1(n)+bx2(n)的输出响应为 y(n)=ay1(n)+by2(n)。 时不变系统:即系统参数不随时间变化的系统,亦即系统对于输入信号的响应与信号加 于系统的时间无关。即满足 :若 y(n)是 x(n)的响应,则 y(n-m)是输入 x(n-m)的响应,其中 m 是任意整数。 数字滤波器对单位样本序列 (n) 的响应称为冲激响应,用 h(n)表示。线性时不变离散 系统对输入信号 x(n)的响应 y(n)可用 h(n)来表示: =− = − k y(n) h(k)x(n k) 。 (三)z 变换和逆 z 变换 序列 x(n) 的 z 变换定义为: ( ) ( ) =− − = n n X z x n z 其中,z 是复变量。相应地,单边 z 变换定义为: ( ) ( ) = − = n 0 n X z x n z MATLAB 提供了计算离散时间信号单边 z 变换的函数 ztrans 和 z 反变换函数 iztrans: Z=ztrans(x),x=iztrans(z)。上式中的 x 和 Z 分别为时域表达式和 z 域表达式的符号表示,可
通过sym函数来定义。 如果信号的z域表示式X(z)是有理函数,进行z反变换的另一个方法是对X(z)进行 部分分式展开,然后求各简单分式的z反变换。设X(z)的有理分式表示为 X()= b。+bz1+b222+…+bn2m_B(z) (4-3) 1+az+az-2+...+a=-m A(z) MATLAB信号处理工具箱提供了一个对X(z)进行部分分式展开的函数residuez,其语句格 式为 [R,P,K]=residuez(B,A) 其中,B,A分别表示X(z)的分子与分母多项式的系数向量;R为部分分式的系数向量;P 为极点向量:K为多项式的系数。若X(z)为有理真分式,则K为零。 (四)离散时间傅里叶变换(DTFT) 1.序列x[n]的离散 时间傅里叶变换定义为: X(e)=xnle-m 月=-0 X(e°)是变量o的连续函数。 X(eo)并可写为实部和虚部相加的形式:X(eo)=X,e(e)+jXm(eo) X(eo)也可以表示为:X(eo)X(e)川eo)。其中,f(o)=arg{X(eo)}。 |X()川称为幅度函数,(o)称为相位函数,又分别称为幅度谱和相位谱,都是o的 实函数。 2.X(eo)的离散时间傅里叶逆变换为: Xda 3.由于X()是连续函数,而在MATLAB中数据只能以向量的形式存在,所以 X(°)只能在一个给定L个离散频率点的离散频率集合中计算,需要尽可能大地选取L的 值以表示连续函数X(eo) 6
6 通过 sym 函数来定义。 如果信号的 z 域表示式 X (z) 是有理函数,进行 z 反变换的另一个方法是对 X (z) 进行 部分分式展开,然后求各简单分式的 z 反变换。设 X (z) 的有理分式表示为 ( ) ( ) 1 ( ) 2 2 1 1 2 2 1 0 1 A z B z a z a z a z b b z b z b z X z n n m m = + + + + + + + + = − − − − − − (4-3) MATLAB 信号处理工具箱提供了一个对 X (z) 进行部分分式展开的函数 residuez,其语句格 式为 [R,P,K]=residuez(B,A) 其中,B,A 分别表示 X(z)的分子与分母多项式的系数向量;R 为部分分式的系数向量;P 为极点向量;K 为多项式的系数。若 X(z)为有理真分式,则 K 为零。 (四) 离散时间傅里叶变换(DTFT) 1.序列 x[n]的离散 时间傅里叶变换定义为: =− − = n j j n X e x n e ( ) [ ] ( ) j X e 是变量 的连续函数。 ( ) j X e 并可写为实部和虚部相加的形式: ( ) ( ) ( ) j im j re j X e = X e + jX e ( ) j X e 也可以表示为: ( ) ( ) | ( ) | j j j X e = X e e 。其中, ( ) arg{ ( )} j = X e 。 | ( )| j X e 称为幅度函数, () 称为相位函数,又分别称为幅度谱和相位谱,都是 的 实函数。 2. ( ) j X e 的离散时间傅里叶逆变换为: x n X e e d j j n − = ( ) 2 1 [ ] 3.由于 ( ) j X e 是连续函数,而在 MATLAB 中数据只能以向量的形式存在,所以 ( ) j X e 只能在一个给定 L 个离散频率点的离散频率集合中计算,需要尽可能大地选取 L 的 值以表示连续函数 ( ) j X e
三、实验内容 (一)线性时不变系统的冲激响应的计算 设系统为y(n)-0.5y(n-1)+0.75y(n-2)=2.5x(n)+2.5x(n-1)+2x(n-2),计算上述系统的 冲激响应。 参考程序如下: N=40: num=[2.52.52]: den=[1-0.50.75]: y=impz (num,den,N) %画出冲激响应 stem(y); xlabel('时间序号n');ylabel('振幅): title(冲激响应);grid; (二)时域采样 对连续正弦时间信号x(t)=cos(2πft)进行采样,其中f=13。 t=0:0.0005:1: f=13: xa=cos(2*pi*f*t) subplot(2,1,1) plot (t,xa);grid xlabel('时间,msec'):ylabel('振幅): title(连续时间信号'): axis([01-1.21.2]) subplot(2,1,2); T=0.1: n=0:T:1: xs=c0s(2*pi*f知): k=0:length(n)-1; stem(k,xs);grid
7 三、实验内容 (一)线性时不变系统的冲激响应的计算 设系统为 y(n)-0.5y(n-1)+0.75y(n-2)=2.5x(n)+2.5x(n-1)+2x(n-2),计算上述系统的 冲激响应。 参考程序如下: N=40; num=[2.5 2.5 2]; den=[1 -0.5 0.75]; y=impz(num,den,N); %画出冲激响应 stem(y); xlabel('时间序号 n'); ylabel('振幅'); title('冲激响应'); grid; (二)时域采样 对连续正弦时间信号 x(t)=cos(2πft)进行采样,其中 f=13。 t=0:0.0005:1; f=13; xa=cos(2*pi*f*t); subplot(2,1,1) plot(t,xa);grid xlabel('时间,msec'); ylabel('振幅'); title('连续时间信号'); axis([0 1 -1.2 1.2]) subplot(2,1,2); T=0.1; n=0:T:1; xs=cos(2*pi*f*n); k=0:length(n)-1; stem(k,xs);grid
xlabel('时间序号n');ylabel('振幅); title(C离散时间信号'): axis(01 ength(n)-1-1.21.2]) (三)z变换和z反变换 1.用ztrans函数求函数x(n)=a”cos(m)u(n)的z变换。 MATLAB参考程序如下: x=sym('a n*cos(pi*n)); Zl=ztrans(x); Z=simplify(Z1); 2用as函数求函数X)=三2:-E+12的2反变换。 (z-10(z-2)3 MATLAB参考程序如下: Z=ym(z*(2*z2-11*z+12)/(z-1)/(z-2)3), x=iztrans(Z); simplify(x) 3.用MATLAB命令对函数X(z)= 18 18+3z-42-2-23 进行部分分式展开,并求出 其z反变换。 MATLAB参考程序如下: B=18]: A=[183,-4,-1]: [R,P.K]=residuez(B,A) (四)序列的离散时间傅里叶变换(DTFT) 求序列x(n)=(-0.8)",-10≤n≤10的离散时间傅里叶变换,并画出它的实部、虚部、幅 度和相位。 n=-10:10: x=(-0.8).^n k=-200:200: w=(pi/100)*k; X=x*(exp(-jpi/100).^(n'k):
8 xlabel('时间序号 n'); ylabel('振幅'); title('离散时间信号'); axis([0 length(n)-1 -1.2 1.2]) (三)z 变换和 z 反变换 1.用 ztrans 函数求函数 x(n) a cos( n)u(n) n = 的 z 变换。 MATLAB 参考程序如下: x=sym('a^n*cos(pi*n)'); Z1=ztrans(x); Z=simplify(Z1); 2.用 iztrans 函数求函数 3 2 ( 1)( 2) (2 11 12) ( ) − − − + = z z z z z X z 的 z 反变换。 MATLAB 参考程序如下: Z=sym('z*(2*z^2-11*z+12)/(z-1)/(z-2)^3'); x=iztrans(Z); simplify(x) 3.用 MATLAB 命令对函数 1 2 3 18 3 4 18 ( ) − − − + − − = z z z X z 进行部分分式展开,并求出 其 z 反变换。 MATLAB 参考程序如下: B=[18]; A=[18,3,-4,-1]; [R,P,K]=residuez(B,A) (四)序列的离散时间傅里叶变换(DTFT) 求序列 x(n)=(-0.8)n, −10 n 10 的离散时间傅里叶变换,并画出它的实部、虚部、幅 度和相位。 n=-10:10; x=(-0.8).^n; k=-200:200; w=(pi/100)*k; X=x*(exp(-j*pi/100)).^(n'*k);
subplot(4,1,1) plot (w/pi,real(X));grid; title'X(e^{j\omega})实部') xlabel('\omega/\pi'); ylabel('振幅) subplot(4,1,2) plot (w/pi,imag(X));grid title(X(e^{j八omega})虚部') xlabel('\omega/\pi'); ylabel('振幅); subplot(4,1,3) plot(w/pi,abs(X));grid title(CX(e^{j八omega})幅度谱') xlabel('\omega/\pi'); ylabel('振幅'): subplot(4,1,4) plot (w/pi,angle(X));grid title('相位谱arg[X(e{j八omega})]') xlabel('\omega/\pi'); ylabel('以弧度为单位的相位'): 四、实验分析 1.观察实验结果,分析系统的线性、时不变性,求出系统的冲激响应。 2.对正弦信号进行采样。 3.求出程序(三)中的(三)z变换和z反变换表达式。 4.观察程序(四)离散时间信号的傅里叶变换的结果并分析。 五、实验总结 总结实验认识、过程、效果、问题、收获、体会、意见和建议。 9
9 subplot(4,1,1) plot(w/pi, real(X)); grid; title('X(e^{j\omega})实部') xlabel('\omega/\pi'); ylabel('振幅'); subplot(4,1,2) plot(w/pi, imag(X));grid title('X(e^{j\omega})虚部') xlabel('\omega/\pi'); ylabel('振幅'); subplot(4,1,3) plot(w/pi, abs(X));grid title('X(e^{j\omega})幅度谱') xlabel('\omega/\pi'); ylabel('振幅'); subplot(4,1,4) plot(w/pi, angle(X));grid title('相位谱 arg[X(e^{j\omega})]') xlabel('\omega/\pi'); ylabel('以弧度为单位的相位'); 四、实验分析 1.观察实验结果,分析系统的线性、时不变性,求出系统的冲激响应。 2.对正弦信号进行采样。 3.求出程序(三)中的(三)z 变换和 z 反变换表达式。 4.观察程序(四)离散时间信号的傅里叶变换的结果并分析。 五、实验总结 总结实验认识、过程、效果、问题、收获、体会、意见和建议
实验三离散傅里叶变换(DFT)及其快速算法(FFT) 一、实验目的 1.理解DFT算法,并能用MATLAB实现DFT。 2.加深对FFT的理解,体会DFT和FFT之间的关系。 3.熟悉应用F℉T实现两个序列的线性卷积的方法。 二、实验原理 N点序列x(n)的DFT和IDFT定义: x0的-发w空网,=e 1 x(n)N X(丽x 若将DT变换的定义写成矩阵形式,则得到 X=A·x,其中DFT变换矩阵A为 1 1 WN A= WN- 1 W- WAN-D 可以用函数U=fft(u,N)和u=ifft(U,N)计算N点序列的DFT正、反变换。 三、实验内容 (一)离散傅里叶变换(DFT) 1.用MATLAB求N=l6的有限序列x(n)=sin(nπ/8)+sin(nπ/4)的DFT结果,并画出结 果图。 参考程序如下: N=16; n=0:1:N-1; %时域采样 xn=sin (n*pi/8)+sin(n*pi/4) k=0:1:N-1; %频域采样 10
10 实验三 离散傅里叶变换(DFT)及其快速算法(FFT) 一、实验目的 1.理解 DFT 算法,并能用 MATLAB 实现 DFT。 2. 加深对 FFT 的理解,体会 DFT 和 FFT 之间的关系。 3.熟悉应用 FFT 实现两个序列的线性卷积的方法。 二、实验原理 N 点序列 x(n) 的 DFT 和 IDFT 定义: 若将 DFT 变换的定义写成矩阵形式,则得到 X=A﹒x,其中 DFT 变换矩阵 A 为 = − − − 2 1 ( 1) 1 1 1 ... ... ... ... ... 1 ... 1 1 ... 1 N N N N N N N W W W W A 可以用函数 U=fft(u,N)和 u=ifft(U,N)计算 N 点序列的 DFT 正、反变换。 三、实验内容 (一)离散傅里叶变换(DFT) 1.用 MATLAB 求 N=16 的有限序列 x(n) = sin( n /8) + sin( n / 4) 的 DFT 结果,并画出结 果图。 参考程序如下: N=16; n=0:1:N-1; %时域采样 xn=sin(n*pi/8)+sin(n*pi/4); k=0:1:N-1; %频域采样