数字信号处理实验指导书.docx
- 文档编号:6750316
- 上传时间:2023-05-10
- 格式:DOCX
- 页数:52
- 大小:679.78KB
数字信号处理实验指导书.docx
《数字信号处理实验指导书.docx》由会员分享,可在线阅读,更多相关《数字信号处理实验指导书.docx(52页珍藏版)》请在冰点文库上搜索。
数字信号处理实验指导书
数字信号处理
实验指导书
武汉理工大学教材中心
2010年7月
实验一时域离散信号的产生
一、实验目的
1、了解常用时域离散信号及其特点;
2、掌握MATLAB程序的编程方法;
3、熟悉MATLAB函数的调用方法。
二、实验原理
在时间轴上的离散点取值的信号,称为离散时间信号。
离散时间信号只在某些离散的瞬时给出函数值,而在其他时刻无定义。
它是时间上不连续按一定先后次序排列的一组数的集合,称为时间序列,用x(n)表示,n取整数代表时间的离散时刻。
在MATLAB中用向量来表示一个有限长度的序列。
常用离散信号:
1、单位抽样序列
2、单位阶跃序列
3、实指数序列
4、复指数序列
5、正(余)弦序列
6、随机序列
在利用计算机进行系统的研究时,经常需要产生随机信号,MATLAB提供一个工具函数rand来产生随机信号。
7、周期序列
三、实验用函数
1、stem
功能:
绘制二维图形。
调用格式:
stem(n,x);n为横轴,x为纵轴的线性图形。
2、length
功能:
计算某一变量的长度或采样点数。
调用格式:
N=length(t);计算时间向量t的个数并赋给变量N。
3、axis
功能:
限定图形坐标的范围。
调用格式:
axis([x1,x2,y1,y2]);横坐标从x1—x2,纵坐标从y1—y2。
4、zeros
功能:
产生一个全0序列。
调用格式:
x=zeros(1,n);产生n个0的序列。
5、ones
功能:
产生一个全1序列。
调用格式:
y=ones(1,n);产生n个1的序列。
四、参考实例
例1.1用Matlab产生单位抽样序列。
%先建立函数impseq(n1,n2,n0)
function[x,n]=impseq(n1,n2,n0)
n=[n1:
n2];
x=[(n-n0)==0];
%编写主程序调用该函数
[x,n]=impseq(-2,8,2);
stem(n,x)
程序运行结果如图1-1所示:
图1-1单位抽样序列
例1.2实数指数序列(运算符“.^”)
Matlab程序如下:
n=[0:
10];
x=0.9.^n;
stem(n,x)
程序运行结果如图1-2所示
图1-2实数指数序列
例1.3复数指数序列(
)
Matlab程序如下:
n=[-10:
10];alpha=-0.1+0.3*j;x=exp(alpha*n);
real_x=real(x);image_x=imag(x);
mag_x=abs(x);phase_x=angle(x);
subplot(2,2,1);stem(n,real_x)
subplot(2,2,2);stem(n,image_x)
subplot(2,2,3);stem(n,mag_x)
subplot(2,2,4);stem(n,phase_x)
程序运行结果如图1-3所示
图1-3复数指数序列
例1.4正、余弦序列(
)
Matlab程序如下:
n=[0:
10];
x=3*cos(0.1*pi*n+pi/3);
stem(n,x)
程序运行结果如图1-4所示
图1-4正、余弦序列
例1.5随机序列
rand(1,N)产生其元素在[0,1]之间均匀分布长度为N的随机序列
randn(1,N)产生均值为0,方差为1,长度为N的高斯随机序列
例1.6周期序列
如何生成周期序列
1、将一个周期复制p次;
2、借助矩阵运算、matlab下标能力。
先生成一个包含p列x(n)值的矩阵,然后用结构(:
)来把p列串接成一个长周期序列。
因为这个结构只能用于列向,最后还需要做矩阵转置获得所需序列。
Matlab程序如下:
x=[1,2,3];%一个x(n)
xn=x'*ones(1,3)%生成p列x(n)
xn=xn(:
)'%将p列串接成长列序列并转置
stem(xn)
程序运行的结果如图1-5所示
图1-5周期序列
五、实验任务
1、调试部分例题程序,掌握Matlab基本操作方法。
2、编写程序,完成下列函数波形:
1)利用zeros函数生成单位抽样序列;
2)利用zeros函数和ones函数生成单位阶跃序列;
六、实验报告
1、简述实验目的、原理。
2、写出上机调试通过的实验任务的程序并描述其图形曲线。
实验二离散序列的基本运算
一、实验目的
1、加强MATLAB运用。
2、了解离散时间序列在时域中的基本运算。
3、熟悉相关函数的使用方法,掌握离散序列运算程序的编写方法。
二、实验原理
离散序列的时域运算包括信号的相加、相乘,信号的时域变换包括信号的移位、反折、倒相及尺度变换等。
在MATLAB中,序列的相加和相乘运算是两个向量之间的运算,因此参加运算的两个序列必须具有相同的长度,否则不能直接进行运算,需要进行相应的处理后再进行运算。
三、实验用函数
1、find
功能:
寻找非零元素的索引号。
调用格式:
find((n>=min(n1))&(n<=max(n1))):
在符号关系运算条件的范围内寻找非零元素的索引号。
2、fliplr
功能:
对矩阵行元素进行左右翻转。
调用格式:
x1=fliplr(x):
将x的行元素进行左右翻转,赋给变量x1。
四、实例
1、信号的时域变换
1)序列移位
将一个离散序列进行移位,形成新的序列:
x1(n)=x(n-m)。
当m>0时,原序列向右移m位,当m<0时,原序列向左移。
%建立移位函数(sigshift(x,m,n0))
function[y,n]=sigshift(x,m,n0)
n=m+n0;
y=x;
2)序列反折
在这个运算中,x(n)以n=0为基准点,以纵轴为对称轴反折得到一个新的序列。
y(n)=|x(-n)|
在MATLAB中提供了fliplr函数实现序列反折。
%建立反折函数(sigfold(x,n))
function[y,n]=sigfold(x,n)
y=fliplr(x);
n=-fliplr(n);
3)序列倒相
是求一个与原序列的向量值相反,对应的时间向量不变的新序列。
4)序列的尺度变换
通过对时间轴的放大或压缩形成新的序列。
2、序列的算术运算
1)序列相加
序列相加是指两个序列中相同序号的序列值逐项对应相加,形成新的序列。
参加运算的两个序列的维数不同时
%建立通用函数
function[y,n]=sigadd(x1,n1,x2,n2)
n=min(min(n1),min(n2)):
max(max(n1),max(n2));
y1=zeros(1,length(n));
y2=y1;
y1(find((n>=min(n1))&(n<=max(n1))==1))=x1;
y2(find((n>=min(n2))&(n<=max(n2))==1))=x2;
y=y1+y2;
1)序列相乘
序列相加是指两个序列中相同序号的序列值逐项对应相乘,形成新的序列。
参加运算的两个序列的维数不同时处理方法与序列相加相同。
五、实验任务
1、理解序列运算的性质,了解函数语句的意义。
2、利用例题函数完成下列序列运算
1)已知x1(n)=u(n+1)(-3 x2(n)=u(n-3)(-4 求: x(n)=x1(n)+x2(n) 2)已知x1(n)=3e-0.25n(-2 x2(n)=u(n+1)(-3 求: x(n)=x1(n)*x2(n) 六、实验报告 1、简述实验目的和原理。 2、列写上机调试通过的程序,并描绘其波形曲线。 实验三离散卷积的原理及应用 一、实验目的 1、通过实验进一步理解卷积定理,了解卷积过程; 2、掌握应用线性卷积求解离散时间系统响应的基本方法。 二、实验原理 对于线性移不变离散系统,任意的输入信号x(n)可以用 及其位移的线性组合来表示,即 当输入为 时,系统的输出y(n)=h(n),由系统的线性移不变性质可以得到系统对x(n)的响应y(n)为 称为离散系统的线性卷积,简写为 y(n)=x(n)*h(n) 也就是说,如果已知系统的冲激响应,将输入信号与系统的冲激响应进行卷积运算,即可求得系统的响应。 三、实验用函数 1、卷积函数conv 功能: 进行两个序列的卷积运算。 调用格式: y=conv(x,h);用于求解两有限长序列的卷积。 2、sum 功能: 求各元素之和。 调用格式: y=sum(x);求序列x中各元素之和。 3、hold 功能: 控制当前图形窗口是否刷新的双向切换开关。 调用格式: holdon: 使当前图形窗口中的图形保持且不被刷新,准备接受绘制新的图形。 holdoff: 使当前图形窗口中的图形不具备不被刷新的性质。 4、impz 功能: 求解数字系统的冲激响应。 调用格式: [h,t]=impz(b,a);求解数字系统的冲激响应h,取样点数为缺省值。 [h,t]=impz(b,a,n);求解数字系统的冲激响应h,取样点数由n确定。 impz(b,a);在当前窗口用stem(t,h)函数绘制图形。 5、dstep 功能: 求解数字系统的阶跃响应。 调用格式: [h,t]=dstep(b,a);求解数字系统的冲激响应h,取样点数为缺省值。 [h,t]=dstep(b,a,n);求解数字系统的冲激响应h,取样点数由n确定。 dstep(b,a);在当前窗口用stairs(t,h)函数绘制图形。 四、参考实例 在利用Matlab提供的卷积函数进行卷积运算时,主要是确定卷积结果的时间区间。 conv函数默认两信号的时间序列从n=0开始,卷积结果对应的时间序列也从n=0开始。 如果信号不是从0开始,则编程时必须用两个数组确定一个信号,其中,一个数组是信号波形的幅度样值,另一个数组是其对应的时间向量。 %建立一个适用于信号从任意时间开始的通用函数 function[y,ny]=sconv(x,h,nx,nh,p) y=conv(x,h); n1=nx (1)+nh (1);%计算y的非零样值的起点位置 n2=nx(length(x))+nh(length(h));%计算y的非零样值的宽度 ny=n1: p: n2;%确定y的非零样值的时间向量 五、实验任务 已知一个IIR数字低通滤波器的系统函数公式为 输入一个矩形信号序列x=square(n/5)(-2 ),求该系统的响应。 六、实验报告 1、简述实验目的、原理。 2、写出上机调试通过的实验任务的程序并描述其图形曲线。 实验四离散系统变换域分析—Z变换 一、实验目的 1、通过实验进一步加深对Z变换的理解; 2、掌握进行Z变换的基本方法,学会利用部分分式法在Z变换中的应用。 3、掌握MATLAB提供的子函数。 二、实验原理 在离散时间信号与系统中,变换域分析法是Z变换法和傅立叶变换法。 Z变换在离散时间系统中的作用就如同拉普拉斯变换在连续时间系统中的作用一样,它把描述离散系统的差分方程转化为简单的代数方程,使其求解大大简化。 1、序列x(n)的Z变换定义如下: Z变换存在的充要条件是上面的级数收敛。 Z变换的收敛域: 使序列x(n)的z变换X(z)收敛的所有z值的集合称作X(z)的收敛域。 X(z)收敛的充要条件是绝对可和。 几类序列的收敛域: 有限长序列: 右边序列: 左边序列: 双边序列: 2、离散时间系统的z域分析 系统函数 H(z)称作线性移不变系统的系统函数,而且在单位圆 上的系统函数就是系统的频率响应。 利用系统函数的极点分布确定系统因果性与稳定性 线性移不变系统稳定的充要条件是h(n)必须满足绝对可和: Σ|h(n)|<∞。 z变换H(z)的收敛域由满足Σ|h(n)z-n|<∞的那些z值确定。 如单位圆上收敛,此时则有Σ|h(n)|<∞,即系统稳定;也就是说,收敛域包括单位圆的系统是稳定的。 因果系统的单位抽样响应为因果序列,其收敛域为R+<|z|≤∞;而因果稳定系统的系统函数收敛域为1≤|z|≤∞,也就是说,其全部极点必须在单位圆内。 三、实验用函数 1、ztrans 功能: 求无限长序列的z变换。 调用格式: X=ztrans(x);用于求解无限长序列的z变换。 2、iztrans 功能: 求函数X(z)的z反变换。 调用格式: x=iztrans(X) 3、syms 功能: 定义符号对象。 调用格式: sysmt,i,x: 将变量t,i,x声明为符号变量。 4、residuez 功能: 有理多项式的部分分式展开。 调用格式 [r,p,c]=residuez(b,a);求解以系数向量b,a表示的系统函数的部分分式展开。 5、zplane 功能: 绘制零极点分布图。 调用格式 zplane(z,p): 绘制由列向量z确定的零点、列向量p确定的极点构成的零极点分布图。 zplane(b,a): 绘制由行向量b,a构成的系统函数确定的零极点分布图。 [hz,hp,ht]=zplane(z,p): 获得三个句柄向量: hz为零点线句柄;hp为极点线句柄;ht为坐标轴、单位圆及文本对象的句柄。 四、参考实例 1、求序列 的z变换 MATLAB程序 symsn x=(n*(n-1))/2; X=ztrans(x) 程序执行结果: X=1/2*z*(z+1)/(z-1)^3-1/2*z/(z-1)^2 2、求函数 的z反变换 MATLAB程序 symsz X=z/(z-1)^3; x=iztrans(X) 程序执行结果: x=-1/2*n+1/2*n^2 3、用部分分式法求 (|z|>1)z反变换 将表达式整理为: MATLAB程序 b=[1]; a=[1,-1.5,0.5]; [r,p,c]=residuez(b,a) 程序执行结果: r= 2 -1 p= 1.0000 0.5000 c= [] 多项式分解后为: X(z)的反变换: 4、已知一个离散系统的函数 ,输入序列 ,求系统在变换域的响应Y(z)及时间域的响应y(n)。 MATLAB程序 symsz; X=z./(z-1); H=z.^2./(z.^2-1.5*z+0.5); Y=X.*H y=iztrans(Y) 程序执行结果 Y=z^3/(z-1)/(z^2-3/2*z+1/2) y=(1/2)^n+2*n 5、用部分分式法求系统函数的z反变换,并用图形与impz求得的结果相比较。 已知系统函数: MATLAB程序: b=[0.1321,0,-0.3963,0,0.3962]; a=[1,0,0.34319,0,0.60439]; [r,p,c]=residuez(b,a); N=40;n=0: N-1; h=r (1)*p (1).^n+r (2)*p (2).^n+r(3)*p(3).^n+r(4)*p(4).^n+c (1).*[n==0]; subplot(1,2,1);stem(n,real(h)) subplot(1,2,2);impz(b,a,n) 程序运行结果如图4-1所示。 图4-1 从图像上可以看出,用部分分式法求系统函数的z反变换也是一种求解系统的冲激响应的有效方法。 6、系统极点的位置对系统响应的影响 1)研究z右半平面的实数极点对系统响应的影响。 已知系统的零-极点增益模型分别为: MATLAB程序: z1=[0]';p1=[0.85]';k=1; [b1,a1]=zp2tf(z1,p1,k); subplot(2,1,1);zplane(b1,a1); subplot(2,1,2);impz(b1,a1,20); ylabel('极点在单位圆内') 程序运行结果如图4-2所示 图4-2 2)研究z右半平面的复数极点对系统响应的影响 已知系统函数: 求这些系统的零极点分布图以及系统的冲激响应,并判断系统的稳定性。 MATLAB程序: z1=[0,0.3]' p1=[0.5+0.7j,0.5-0.7j]'; k=1; [b1,a1]=zp2tf(z1,p1,k); subplot(2,1,1);zplane(b1,a1); subplot(2,1,2);impz(b1,a1); ylabel('极点在单位圆内') 程序执行结果如图4-3所示 图4-3 五、实验任务 1、输入并运行例题程序。 2、用部分分式法求解下列系统函数: 的z变换,写出x(n)的表达式,并用图形与impz求得的结果相比较。 3、已知离散时间系统函数分别为: 求以上系统的零极点及零极点分布图以及系统冲激响应,并判断系统的因果稳定性。 六、实验报告 1、简述实验目的、原理。 2、写出上机调试通过的实验任务的程序并描述其图形曲线。 实验五离散傅立叶级数 一、实验目的 1、加深对离散周期序列傅里叶级数基本概念的理解。 2、掌握MATLAB求解周期序列傅里叶级数变换和逆变换的方法。 3、观察离散周期序列的重复周期数对频谱特性的影响。 二、实验原理 离散时间序列x(n)满足x(n)=x(n+rN),称为离散周期序列,其中N为周期,x(n)为主值序列。 周期序列可用离散傅里叶级数表示成 n=0,1,…,N-1 其中, 是周期序列离散傅里叶级数第K次谐波分量的系数,也称为周期序列的频谱,可表示为 k=0,1,…,N-1 上面两式是周期序列的一对傅里叶级数变换对。 令 ,以上两式可简写为: 三、实验用函数 1、mod 功能: 模除求余。 调用格式: mod(x,m): x整除m取正余数。 2、floor 功能: 向- 舍入为整数。 调用格式: floor(x): 将x向- 舍入为整数。 四、实例 1、周期序列的傅里叶变换和逆变换 依据变换公式编写通用函数 1)离散傅里叶级数正变换通用函数 functionxk=dfs(xn,N) n=[0: 1: N-1];%n的行向量 k=n;%k的行向量 WN=exp(-j*2*pi/N);%WN因子 nk=n'*k;%产生一个含nk值的N乘N维矩阵 WNnk=WN.^nk;%DFS矩阵 xk=xn*WNnk;%DFS系数行向量 2)离散傅里叶级数逆变换通用函数 functionxn=idfs(xk,N) n=[0: 1: N-1];%n的行向量 k=n;%k的行向量 WN=exp(-j*2*pi/N);%WN因子 nk=n'*k;%产生一个含nk值的N乘N维矩阵 WNnk=WN.^(-nk);%DFS矩阵 xn=xk*WNnk/N;%DFS系数行向量 例: 已知一个周期性矩形序列的脉冲宽度占整个周期的1/4,一个周期的采样点为16点。 用傅里叶级数求信号的幅度和相位频谱;求傅里叶级数逆变换的图形,与原信号图形进行比较。 MATLAB程序 N=16; xn=[ones(1,N/4),zeros(1,3*N/4)]; n=0: N-1; xk=dfs(xn,N); xn1=idfs(xk,N); subplot(2,2,1);stem(n,xn);title('x(n)'); subplot(2,2,2);stem(n,abs(xn1));title('idfs(|X(k)|)'); subplot(2,2,3);stem(n,abs(xk));title('|X(k)|'); subplot(2,2,4);stem(n,angle(xk));title('arg|X(k)|'); 程序运行结果如图4-1 图4-1 2、周期重复次数对序列频谱的影响 理论上讲,周期序列不满足绝对可积条件,要对周期序列进行分析,可以先取K个周期进行处理,然后让K无限增大,研究其极限情况。 这样可以观察信号序列由非周期到周期变换时,频谱由连续谱逐渐向离散谱过渡的过程。 例: 已知一个矩形序列的脉冲宽度占整个周期的1/2,一个周期的采样点数为10,用傅立叶级数变换求信号的重复周期数分别为1、4、7、10时的幅度频谱。 MATLAB程序: xn=[ones(1,5),zeros(1,5)]; Nx=length(xn); Nw=1000;dw=2*pi/Nw; k=floor((-Nw/2+0.5): (Nw/2+0.5)); forr=0: 3; K=3*r+1; nx=0: (K*Nx-1); x=xn(mod(nx,Nx)+1); Xk=x*(exp(-j*dw*nx'*k))/K; subplot(4,2,2*r+1);stem(nx,x) axis([0,K*Nx-1,0,1.1]);ylabel('x(n)'); subplot(4,2,2*r+2);plot(k*dw,abs(Xk)) axis([-4,4,0,1.1*max(abs(Xk))]);ylabel('X(k)'); end 程序运行结果如图4-2 图4-2 从上图可以看出,信号序列的周期数越多,则频谱越是向几个频点集中,当信号周期数趋于无穷大时,频谱转化为离散谱。 五、实验任务 1、输入并运行例题程序,熟悉基本指令的使用。 2、已知一个信号序列的主值为x(n)=[0,1,2,3,2,1,0],显示两个周期的信号序列波形。 求解: 用傅里叶级数求信号的幅度和相位频谱;求傅里叶级数逆变换的图形,与原信号图形进行比较。 六、实验报告 1、简述实验目的、原理。 2、写出上机调试通过的实验任务的程序并描述其图形曲线。 实验六离散傅里叶变换 一、实验目的 1、加深对离散傅里叶变换基本概念的理解。 2、了解有限长序列傅里叶变换与周期序列傅里叶级数的联系。 3、熟悉相关函数的使用方法。 二、实验原理 有限长序列的傅里叶变换和逆变换 对于非周期序列,在实际中常常使用有限长序列。 有限长序列x(n)表示为 x(n)是非周期序列,但可以理解为某一周期序列的主值序列。 由离散傅立叶级数DFS和IDFS引出有限长序列的离散傅立叶正、逆变换关系式。 DFT与DFS的关系 比较两者的变换对,可以看出两者的区别仅仅是将周期序列换成了有限长序列。 有限长序列x(n)可以看作是周期序列 的一个周期;反之周期序列 可以看作是有限长序列x(n)以N为周期的周期延拓。 由于公式非常相似,在程序编写上也基本一致。 三、实例 1、已知有限长序列x(n)为: x(n)=[0,1,2,3,4,5,6,7,8,9],求x(n)的DFT和IDFT。 要求 1)画出序列傅里叶变换对应的|X(k)|和arg[X(k)]图形。 2)画出原信号与傅里叶逆变换IDFT[X(k)]图形进行比较。 MATLAB程序: xn=[0,1,2,3,4,5,6,7,8,9];N=length(xn); n=0: N-1;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字信号 处理 实验 指导书