1、信号与系统matlab实验典型信号的表示和运算本练习利用MATLAB进行信号的表示和运算。主要内容包括离散时间信号的表示,连续时间信号的数值表示,连续时间信号的符号表示和信号的运算。1.1 离散时间信号的表示1.1.1 有限长序列一个时间序列可用一个序列数组和一个时间标号数组来表示。例1-1:利用MATLAB表示序列。% 序列数组(纵坐标)x=0 0 0 1 2 4 2 3 0 0 0; % 时间标号数组(横坐标)n=-5 -4 -3 -2 -1 0 1 2 3 4 5;% 绘制序列对应的波形stem(n,x); xlabel(n);ylabel(x);由stem绘制的波形图如图1-1所示。图
2、1-1 一个序列的波形图注意:命令的尾部用了分号,用以除掉MATLAB不必要的回响。1.1.2 单位样值序列单位样值序列可以表示为 (1-1)它可以用只有一个元素为1其余元素均为0的数组表示,如例1-3所示。例1-3:n=-5:5;x=zeros(1,5) 1 zeros(1,5);stem(n,x);xlabel(n);ylabel(x);单位样值序列波形图如图1-2所示。图1-2 单位样值序列波形图1.1.3 由已知序列得到另一个序列(1) 取长序列中的一部分例1-3:nx=0:10;x=nx;% 取序列nx的前5个值ny=nx(1:5);% 取序列x的前5个值y=x(1:5); subp
3、lot(2,1,1);stem(nx,x);xlabel(nx); ylabel(x);axis(0 10 0 10);subplot(2,1,2);stem(ny,y);xlabel(ny); ylabel(y); axis(0 10 0 5);MATLAB执行结果见图1-3。图1-3 例1-3结果图(2) 组合一个新序列例1-4:n=0:5; x=n;% 重复3次y=x x x;ny=0:(length(y)-1);% 序列间插0z=x 0 0 0 x 0 0 0 x 0 0 0; nz=0:(length(z)-1);subplot(2,1,1);stem(ny,y); axis(0 l
4、ength(z) 0 5.5);xlabel(n); ylabel(y);subplot(2,1,2);stem(nz,z,r); axis(0 length(z) 0 5.5);xlabel(n); ylabel(z);MATLAB执行结果见图1-4。图1-4 例1-4结果图1.1.4 幂级数序列 (1-2)幂指数序列可以利用power()函数来表示。例1-5:n=0:10;x1=power(1.1,n);subplot(2,2,1);stem(n,x1);legend(a=1.1);x2=power(-1.1,n);subplot(2,2,2);stem(n,x2);legend(a=-1
5、.1);x3=power(0.9,n);subplot(2,2,3);stem(n,x3);legend(a=0.9);x4=power(-0.9,n);subplot(2,2,4);stem(n,x4);legend(a=-0.9);1.1.5 正弦序列, (1-3) n=0:10;例1-6:产生离散正弦序列, ,并画出其波形图。n=0:10;x=sin(pi/4*n);stem(n,x);xlabel(n);ylabel(sin(pi/n*n);MATLAB执行结果见图1-5。图1-5 例1-6结果图例1-7:钢琴键盘上中音“1”对应的频率为262Hz。若抽样频率为8192Hz,请产生1秒
6、钟的此频率信号并播放。分析:信号的数字角频率为,其中为模拟信号的频率,为抽样频率。首先生成此频率的离散正弦信号,然后利用MATLAB的sound函数用来播放该数字音频信号。sound函数具体用法如下:n sound(y,fs) 在扬声器上以抽样频率fs来播放向量y中存储的音频信号,y值的取值范围假设为-1.0 = y = 1.0,超出这个范围将发生削波,当y为的矩阵时(N为整数),则播放立体声。n sound(y) 采用默认的8192Hz的抽样频率来播放音频信号。n sound(y,fs,bits) 如果硬件条件允许的话则使用bits比特/样值的量化参数来播放音频信号,大部分硬件平台支持bit
7、s=8或16。解:f=262;fs=8192;omega=2*pi*f/fs;n=0:fs-1;x=sin(n*omega);sound(x,fs);利用例1-7中方法,可以产生各音符对应的时域信号,将音符串接起来就可以生成乐曲了。下面给出了C大调各音符对应的频率值及其关系,其中=262Hz代表中音1的频率。例1-8:小蜜蜂的简谱如图1-6所示,抽样频率取8192Hz,请生成此乐曲对应的离散正弦序列信号,并播放。图1-6 小蜜蜂乐谱MATLAB代码如下:clc;close all;clear;% 中音1的频率f1=262;% 采样率fs=8192;% 中音2,3,4,5的频率f2=f1*pow
8、er(2,2/12);f3=f1*power(2,4/12);f4=f1*power(2,5/12);f5=f1*power(2,7/12);N_zeros=300;% 产生四分之一音符,1sn=0:(fs/2-N_zeros-1);x1=sin(n*2*pi*f1/fs) zeros(1,N_zeros); x2=sin(n*2*pi*f2/fs) zeros(1,N_zeros);x3=sin(n*2*pi*f3/fs) zeros(1,N_zeros);x4=sin(n*2*pi*f4/fs) zeros(1,N_zeros);x5=sin(n*2*pi*f5/fs) zeros(1,N
9、_zeros);% 产生八分之一音符,0.5sn=0:(fs/2-N_zeros-1);xh1=sin(n*2*pi*f1/fs) zeros(1,N_zeros); xh2=sin(n*2*pi*f2/fs) zeros(1,N_zeros);xh3=sin(n*2*pi*f3/fs) zeros(1,N_zeros);xh4=sin(n*2*pi*f4/fs) zeros(1,N_zeros);xh5=sin(n*2*pi*f5/fs) zeros(1,N_zeros);% 产生二分之一音符,2sn=0:(2*fs-N_zeros-1);x_1=sin(n*2*pi*f1/fs) zero
10、s(1,N_zeros); x_3=sin(n*2*pi*f3/fs) zeros(1,N_zeros);% 生成乐曲信号notes=xh5 xh3 x3 xh4 xh2 x2 xh1 xh2 xh3 xh4 xh5 xh5 x5;notes=notes xh5 xh3 x3 xh4 xh2 x2 xh1 xh3 xh5 xh5 x_3;notes=notes xh2 xh2 xh2 xh2 xh2 xh3 x4 xh3 xh3 xh3 xh3 xh3 xh4 x5;notes=notes xh5 xh3 x3 xh4 xh2 x2 xh1 xh3 xh5 xh5 x_1;% 播放乐曲soun
11、d(notes,fs);1.1.6 离散复指数序列例1-9:请产生离散复指数信号, 并绘制其波形图。MATLAB代码如下:n=0:32;w0=pi/8;x=exp(j*w0*n);subplot(2,2,1);stem(n,real(x);xlabel(n);ylabel(real(x);subplot(2,2,2);stem(n,imag(x);xlabel(n);ylabel(imag(x);subplot(2,2,3);stem(n,abs(x);xlabel(n);ylabel(abs(x);subplot(2,2,4);stem(n,angle(x);xlabel(n);ylabel
12、(angle(x);MATLAB执行结果如图1-7所示。图1-7 例1-9结果图1.1.7 单位阶跃序列 (1-4)下面的MATLAB程序step_function()用于生成单位阶跃序列。% step_function.mfunction n,x=step_function(n1,n2,ns,A)% n1 is the first location% n2 is the last location% ns is the step location% A is the gainn=n1:n2;x=A*zeros(1,(ns-n1) ones(1,(n2-ns+1);h=stem(n,x);se
13、t(h,LineWidth,2);title(step function);函数调用:n,x=step_function(-10,10,0,2)1.1.8 矩形脉冲序列 (1-5)例1-10:矩形脉冲可利用如下代码实现:RN_length=20;N=10;RN=ones(1,N),zeros(1,RN_length-N);1.2 连续时间信号的数值表示1.2.1 用数值方法表示连续时间信号本节讨论用MATLAB表示和分析连续时间信号。严格来说,只有用符号推理的方法才能分析连续时间信号与系统。用数值方法是不能表示连续信号的,因为它给出的是各个样本点的数据。只有当样本点取得很密时才可看成连续信号。
14、所谓密,是相对信号变化的快慢而言。以下均假定相对于采样点密度而言,信号变化足够慢。(1) 单位冲激信号 (1-6)单位冲激函数无法直接用MATLAB描述,可以把它看作是宽度为(程序中用dt),幅度为的矩形脉冲,即 (1-7)表示在处的冲激。例1-11:clear;t0=0;tf=5;dt=0.05;t1=1;t=t0:dt:tf;st=length(t);n1=floor(t1-t0)/dt);x1=zeros(1,st);x1(n1+1)=1/dt;stairs(t,x1);grid on;axis(0,5,0,25);xlabel(t);ylabel(delta(t-t_1);结果图形如图
15、1-8所示。图1-8 用MATLAB产生的单位冲激信号波形图在例1-11中使用了几个新函数,说明如下:n floor 向下取整n stairs 画阶梯状图形n grid on 显示网格线(2) 单位阶跃函数 (1-8)在跳变点处该函数值无定义或在处规定函数值。例1-12:clear;t0=0;tf=5;dt=0.05;t1=1;t=t0:dt:tf;st=length(t);n1=floor(t1-t0)/dt);x2=zeros(1,n1),ones(1,st-n1);stairs(t,x2);grid on;axis(0,5,0,1.5);xlabel(t);ylabel(u(t-t_1)
16、;结果图形如图1-9所示。图1-9 用MATLAB产生的单位阶跃信号波形图(3) 复指数信号 (1-9)例1-13:clear;t0=0;tf=5;dt=0.05;t=t0:dt:tf;alpha=-0.5;w=10;x=exp(alpha+j*w)*t);subplot(2,2,1);plot(t,real(x);grid on;xlabel(t);ylabel(real part);subplot(2,2,2);plot(t,imag(x);grid on;xlabel(t);ylabel(imaginary part);subplot(2,2,3);plot(t,abs(x);grid
17、on;xlabel(t);ylabel(abs);subplot(2,2,4);plot(t,angle(x);grid on;xlabel(t);ylabel(angle);结果图形如图1-10所示。图1-10 复指数信号波形图信号的相位为,这是关于的线性函数。但是图1-10绘制的相位曲线是分段线性的,被去掉了2的整倍数,图形分布在区间,这种现象称为卷绕。这和实际的预期不一样。相位图出现卷绕是因为求复数函数的相位时使用了反正切atan函数,它的值域为。相位卷绕就好像是一根长长的线绕到了一个线轴上,真正的相位函数需要将这些线从轴上绕下来,再拉直,这个过程称为解卷绕。MATLAB提供了解卷绕的函
18、数unwrap。例1-13中实现相位卷绕的代码如下:x_ang_unwrap=unwrap(angle(x);figure;plot(t,x_ang_unwrap);grid on;xlabel(t);ylabel(angle);解卷绕后的相位图如图1-11所示。图1-11 解卷绕后的相位图 (4) 抽样信号 (1-10)执行如下命令:t=linspace(-3,3,7);x=sin(t)./tMATLAB返回:x = 0.0470 0.4546 0.8415 NaN 0.8415 0.4546 0.0470注:NaN不是一个数。这是因为运算中出现了sin(0)/0,即0比0型。MATLAB返
19、回的结果中含有NaN不影响进一步的计算。可以利用MATLAB提供的sinc函数来生成抽样信号。例1-14:t=linspace(-10,10,101);x=sinc(t/pi);plot(t,x); xlabel(t);ylabel(Sa(t); grid on;MATLAB执行结果如图1-12所示。图 1-12 抽样信号的波形1.3 连续时间信号的符号表示这里我们将通过几个例子来说明连续时间信号的符号表示。例1-15:产生信号的符号表达式,并绘制时的波形图。解:syms t a wx=exp(-a*t)*cos(w*t)*heaviside(t);x1=subs(x,a,1);x2=subs
20、(x1,w,10);ezplot(x2,0,2*pi);axis(0 2*pi -1 1);MATLAB绘制的结果图如图1-13所示。图1-13 例1-15信号波形图例1-16:绘制下列各时间函数的波形图,注意它们的区别。(1) ;(2) ;(3) ;(4) ;解:syms tx1=t*(heaviside(t)-heaviside(t-1);x2=t*heaviside(t-1);x3=t*(heaviside(t)-heaviside(t-1)+heaviside(t-1);x4=(t-1)*heaviside(t-1);subplot(2,2,1);ezplot(x1,0 3);axis
21、(0 3 0 3);subplot(2,2,2);ezplot(x2,0 3);axis(0 3 0 3);subplot(2,2,3);ezplot(x3,0 3);axis(0 3 0 3);subplot(2,2,4);ezplot(x4,0 3);axis(0 3 0 3);MATLAB绘制的结果图如图1-14所示。图1-14 例1-16信号波形图例1-17:绘出信号的偶分量和奇分量。解:MATLAB代码如下:syms t;x=exp(-(t-2)*(heaviside(t-2)-heaviside(t-3);x_flip=subs(x,t,-t);x_even=(x+x_flip)/
22、2;x_odd=(x-x_flip)/2;subplot(2,2,1);ezplot(x,-4 4);axis(-4 4 -1.1 1.1);subplot(2,2,3);ezplot(x_flip,-4 4);axis(-4 4 -1.1 1.1);subplot(2,2,2);ezplot(x_even,-4 4);axis(-4 4 -1.1 1.1);subplot(2,2,4);ezplot(x_odd,-4 4);axis(-4 4 -1.1 1.1);MATLAB绘制的结果图如图1-15所示。图1-15 例1-17信号波形图1.4 信号的运算1.4.1 信号的基本运算MATLAB
23、可以对信号做加、减、乘、除、乘以标量以及对信号取幂等运算,要求代表这些信号的向量都有相同的时间原点和相同的元素个数。对于逐项地做乘(矩阵点乘)、除和取幂运算,必须要在该算符的前面放一个圆点,也就是要用.*符号来代替*来做逐项相乘。例1-18:产生矩阵A和B,进行相乘运算,请观察各种运算的执行结果。% exm5_18_product.mA=1 2 3;4 5 6;7 8 9;B=ones(3,3);A*B% 矩阵乘A.*B% 矩阵点乘A.*A% 矩阵点乘power(A,2)% 同A.*AA.2% 同A.*AA*A% 矩阵乘1.4.2 累加运算 (1-11)MATLAB提供了cumsum()函数用
24、于实现累加运算,可以用来近似表示连续信号的运动积分。例1-19:% exm5_19_cumsum.mx= 1:10;cumsum(x)MATLAB执行结果:ans = 1 3 6 10 15 21 28 36 45 551.4.3 信号的能量和平均功率离散信号的能量 (1-12)离散信号的平均功率 (1-13)例1-20:求信号的能量和平均功率。n=0:20;x=exp(j*pi/8*n);E=sum(x.*conj(x)% sum():求和函数P=E/length(x)MATLAB执行结果为:E = 21P = 11.5 小结本章练习了离散信号的数值表示、连续信号的数值和符号表示以及信号的运
25、算。用到的主要函数如表1-1所示。表1-1 本章MATLAB函数函数名称功能linspace 产生等间隔数据power产生幂指数函数sound 播放音频信号floor向下取整stairs画阶梯状图形grid on显示网格线unwrap解卷绕sinc产生sinc函数cumsum累加函数习题:1. 产生离散衰减正弦序列, ,并画出其波形图。2. 用MATLAB生成信号, 和都是实数,,画波形图。观察并分析和的变化对波形的影响。3. 某频率为的正弦波可表示为,对其进行等间隔抽样,得到的离散样值序列可表示为,其中称为抽样间隔,代表相邻样值间的时间间隔,表示抽样频率,即单位时间内抽取样值的个数。抽样频率
26、取,信号频率分别取5Hz, 10Hz, 20Hz和30Hz。请在同一张图中同时画出连续信号和序列的波形图,并观察和对比分析样值序列的变化。可能用到的函数为plot, stem, hold on。4. 用MATLAB产生音阶信号,并播放,抽样频率可设为8000 Hz。5. 利用MATLAB产生信号和,请画出信号和信号的波形图。参考文献:尹霄丽, 张健明. MATLAB在信号与系统中的应用. 清华大学出版社. 北京:2015.答案产生离散衰减正弦序列, ,并画出其波形图。n=0:10;x=sin(pi/4*n).*0.8.n;stem(n,x);xlabel( n );ylabel( x(n) )
27、;用MATLAB生成信号, 和都是实数,,画波形图。观察并分析和的变化对波形的影响。t=linspace(-4,7);a=1;t0=2;y=sinc(a*t-t0);plot(t,y);t=linspace(-4,7);a=2;t0=2;y=sinc(a*t-t0);plot(t,y);t=linspace(-4,7);a=1;t0=2;y=sinc(a*t-t0);plot(t,y);三组对比可得a越大最大值越小,t0越大图像对称轴越往右移某频率为的正弦波可表示为,对其进行等间隔抽样,得到的离散样值序列可表示为,其中称为抽样间隔,代表相邻样值间的时间间隔,表示抽样频率,即单位时间内抽取样值的
28、个数。抽样频率取,信号频率分别取5Hz, 10Hz, 20Hz和30Hz。请在同一张图中同时画出连续信号和序列的波形图,并观察和对比分析样值序列的变化。可能用到的函数为plot, stem, hold on。fs = 40;t = 0 : 1/fs : 1 ; % 5Hz,10Hz,20Hz,30Hzf1=5;xa = cos(2*pi*f1*t) ;subplot(1, 2, 1) ;plot(t, xa) ;axis(0, max(t), min(xa), max(xa) ;xlabel(t(s) ;ylabel(Xa(t) ;line(0, max(t),0,0) ;subplot(1,
29、 2, 2) ;stem(t, xa, .) ;line(0, max(t), 0, 0) ;axis(0, max(t), min(xa), max(xa) ;xlabel(n) ;ylabel(X(n) ; 频率越高,图像更加密集。用MATLAB产生音阶信号,并播放,抽样频率可设为8000 Hz。利用MATLAB产生信号和,请画出信号和信号的波形图。clc;close all;clear;f1=262;fs=8000;f2=293;f3=329;f4=349;f5=392;f6=440;f7=493;f8=523;N_zeros=300;n=0:(fs/2-N_zeros-1);x1=si
30、n(n*2*pi*f1/fs) zeros(1,N_zeros); x2=sin(n*2*pi*f2/fs) zeros(1,N_zeros);x3=sin(n*2*pi*f3/fs) zeros(1,N_zeros);x4=sin(n*2*pi*f4/fs) zeros(1,N_zeros);x5=sin(n*2*pi*f5/fs) zeros(1,N_zeros);x6=sin(n*2*pi*f6/fs) zeros(1,N_zeros);x7=sin(n*2*pi*f7/fs) zeros(1,N_zeros);x8=sin(n*2*pi*f8/fs) zeros(1,N_zeros);notes=x1 x2 x3 x4 x5 x6 x7 x8 ;sound(notes,fs);