信号与系统MATLAB实验(教师版) 下载本文

信号与系统实验指导书及

班级:

姓名:

学号:

实验一、

实验二、 实验报告册

目 录

基本信号在MATLAB中的表示和运算 离散信号与系统的时域分析

1

实验三、 连续时间LTI系统的时域分析

实验四、 傅里叶变换、系统的频域分析

实验五、 信号抽样与恢复

实验六、 信号与系统复频域分析

实验一 基本信号在MATLAB中的表示和运算

一、实验目的

1. 学会用MATLAB表示常用连续信号的方法; 2. 学会用MATLAB进行信号基本运算的方法; 二、实验原理

1. 连续信号的MATLAB表示

MATLAB提供了大量的生成基本信号的函数,例如指数信号、正余弦信号。

表示连续时间信号有两种方法,一是数值法,二是符号法。数值法是定义某一时间

2

范围和取样时间间隔,然后调用该函数计算这些点的函数值,得到两组数值矢量,可用绘图语句画出其波形;符号法是利用MATLAB的符号运算功能,需定义符号变量和符号函数,运算结果是符号表达的解析式,也可用绘图语句画出其波形图。

例1-1指数信号 指数信号在MATLAB中用exp函数表示。

如f(t)?Aeat,调用格式为 ft=A*exp(a*t) 程序是

A=1; a=-0.4;

t=0:0.01:10; %定义时间点

ft=A*exp(a*t); %计算这些点的函数值

plot(t,ft); %画图命令,用直线段连接函数值表示曲线 grid on; %在图上画方格

例1-2 正弦信号 正弦信号在MATLAB中用 sin 函数表示。

调用格式为 ft=A*sin(w*t+phi) A=1; w=2*pi; phi=pi/6;

t=0:0.01:8; %定义时间点

ft=A*sin(w*t+phi); %计算这些点的函数值 plot(t,ft); %画图命令 grid on; %在图上画方格

例1-3 抽样信号 抽样信号Sa(t)=sin(t)/t在MATLAB中用 sinc 函数表示。

定义为 Sa(t)?sinc(t/?)

t=-3*pi:pi/100:3*pi; ft=sinc(t/pi); plot(t,ft); grid on;

axis([-10,10,-0.5,1.2]); %定义画图范围,横轴,纵轴 title('抽样信号') %定义图的标题名字

例1-4 三角信号 三角信号在MATLAB中用 tripuls 函数表示。

调用格式为 ft=tripuls(t,width,skew),产生幅度为1,宽度为width,且以0为中心左右各展开width/2大小,斜度为skew的三角波。width的默认值是1,skew的取值范围是-1~+1之间。一般最大幅度1出现在t=(width/2)*skew的横坐标位置。 t=-3:0.01:3;

ft=tripuls(t,4,0.5); plot(t,ft); grid on; axis([-3,3,-0.5,1.5]);

例1-5 虚指数信号 调用格式是f=exp((j*w)*t) t=0:0.01:15;

w=pi/4;

X=exp(j*w*t);

3

Xr=real(X); %取实部 Xi=imag(X); %取虚部 Xa=abs(X); %取模 Xn=angle(X); %取相位

subplot(2,2,1),plot(t,Xr),axis([0,15,-(max(Xa)+0.5),max(Xa)+0.5]), title('实部');

subplot(2,2,3),plot(t,Xi),axis([0,15,-(max(Xa)+0.5),max(Xa)+0.5]), title('虚部');

subplot(2,2,2), plot(t,Xa),axis([0,15,0,max(Xa)+1]),title('模');

subplot(2,2,4),plot(t,Xn),axis([0,15,-(max(Xn)+1),max(Xn)+1]),title('相角'); %subplot(m,n,i) 命令是建立m行n列画图窗口,并指定画图位置i 例1-6 复指数信号 调用格式是f=exp((a+j*b)*t) t=0:0.01:3;

a=-1;b=10;

f=exp((a+j*b)*t);

subplot(2,2,1),plot(t,real(f)),title('实部') subplot(2,2,3),plot(t,imag(f)),title('虚部') subplot(2,2,2),plot(t,abs(f)),title('模') subplot(2,2,4),plot(t,angle(f)),title('相角')

例1-7 矩形脉冲信号 矩形脉冲信号可用rectpuls函数产生,

调用格式为y=rectpuls(t,width),幅度是1,宽度是width,以t=0为对称中心。 t=-2:0.01:2; width=1;

ft=2*rectpuls(t,width); plot(t,ft) grid on;

例1-8 单位阶跃信号 单位阶跃信号u(t)用“t>=0”产生,调用格式为ft=(t>=0) t=-1:0.01:5; ft=(t>=0);

plot(t,ft); grid on; axis([-1,5,-0.5,1.5]); 例1-9 正弦信号符号算法

syms t %定义符号变量t y=sin(pi/4*t) %符号函数表达式 ezplot(y,[-16,16]) %符号函数画图命令 或者

f=sym('sin(pi/4*t)') %定义符号函数表达式 ezplot(f,[-16,16])

例1-10 单位阶跃信号 MATTLAB符号数学函数Heaviside表示阶跃信号,但要画图需在工

作目录创建Heaviside的M文件 function f=Heaviside(t)

4

f=(t>0);

保存,文件名是Heaviside ,调用该函数即可画图,例 t=-1:0.01:3; f=heaviside(t); plot(t,f)

axis([-1,3,-0.2,1.2]) 或者

y=sym('Heaviside(t)'); ezplot(y,[-1,5]);grid on

2. 信号基本运算的MATLAB实现

信号基本运算是乘法、加法、尺度、反转、平移、微分、积分,实现方法有数值法和符号法

例1-11 以f(t)为三角信号为例,求f(2t) , f(2-2t)

t=-3:0.001:3;

ft=tripuls(t,4,0.5);

subplot(3,1,1); plot(t,ft); grid on; title ('f(t)');

ft1= tripuls(2*t,4,0.5);

subplot(3,1,2); plot(t,ft1); grid on; title ('f(2t)');

ft2= tripuls(2-2*t,4,0.5);

subplot(3,1,3); plot(t,ft2); grid on; title ('f(2-2t)');

例1-12 已知f1(t)=sinwt , f2(t)=sin8wt , w=2pi , 求f1(t)+f2(t)和f1(t)f2(t) 的波形图 w=2*pi;

t=0:0.01:3; f1=sin(w*t); f2=sin(8*w*t); subplot(211)

plot(t,f1+1,':',t,f1-1,':',t,f1+f2) grid on,title('f1(t)+f2(t))') subplot(212)

plot(t,f1,':',t,-f1,':',t,f1.*f2) grid on,title('f1(t)*f2(t)')

符号算法也可实现上述运算,以信号的微积分运算为例说明符号算法应用 微分的调用格式为 diff(function,’variable’,n) 积分的调用格式为 int(function,’variable’,a,b)

5

式中function表示要微分或积分的函数,variable表示运算变量,n表示求导阶数,默认值是求一阶导数,a是积分下限,b是积分上限,a b默认是求不定积分。 例1-13 求一阶导数的例题,已知y1?sin(ax2),y2?xsinxlnx clear

syms a x y1 y2 %定义符号变量a, x ,y1, y2 y1=sin(a*x^2); %符号函数y1 y2=x*sin(x)*log(x); %符号函数y2

dy1=diff(y1,’x’) %无分号直接显示结果 dy2=diff(y2) %无分号直接显示结果

1xxex例1-14 求积分的例题,?(x?ax?)dx,?dx 202(1?x)5 clear

syms a x y3 y4

y3=x^5-a*x^2+sqrt(x)/2; y4=(x*exp(x))/(1+x)^2; iy3=int(y3,'x') iy4=int(y4,0,1) 三、上机实验内容 1. 验证实验原理中程序 2. 画出信号波形

(1)f(t)?(2?e解: t=0:0.001:15; f1=(2-exp(-2*t)); f2=(t>=0); f3=f1.*f2; plot(t,f3)

?2t)u(t)

6

(2)f(t)?(1?cos?t)[u(t)?u(t?2)] 解: t=-2:0.01:5; f1=1+cos(pi*t); f2=(t>=0)-(t>=2); ft=f1.*f2; plot(t,ft);

7

3.信号f(t)?(2?e?2t)u(t),求f(2t)、f(2?t)波形

3解:

syms t;

ft=heaviside(t); f1=(2-exp(-2*t))*ft; subplot(3,1,1);

ezplot(f1,[-2*pi,2*pi]); grid on; title ('f(t)'); f2=subs(f1,t,2*t); subplot(3,1,2);

ezplot(f2,[-2*pi,2*pi]); grid on;

title ('f(2t)'); f3=subs(f1,t,2-t);

8

subplot(3,1,3);

ezplot(f3,[-2*pi,2*pi]); grid on;

title('f(2-t)');

9

实验二 离散信号与系统的时域分析

一、实验目的

1.学会用MATLAB表示常用离散信号的方法; 2.学会用MATLAB实现离散信号卷积的方法; 3. 学会用MATLAB求解离散系统的单位响应; 4. 学会用MATLAB求解离散系统的零状态响应; 二、实验原理

1.离散信号的MATLAB表示

表示离散时间信号f(k)需要两个行向量,一个是表示序号k=[ ],一个是表示相应函数值f=[ ],画图命令是stem。 例2-1正弦序列信号 正弦序列信号可直接调用MATLAB函数cos,例cos(?k??),当

2?/?是整数或分数时,才是周期信号。画cos(k?/8??),cos(2k)波形程序是:

k=0:40;

subplot(2,1,1)

stem(k,cos(k*pi/8),'filled') title('cos(k*pi/8)') subplot(2,1,2)

stem(k,cos(2*k),'filled') title('cos(2*k)')

?1k?0例2-2 单位序列信号 ?(k)??

0k?0?本题先建立一个画单位序列?(k?k0)的M函数文件,画图时调用。M文件建立方法:file / new / m-file 在文件编辑窗输入程序,保存文件名用函数名。

function dwxulie(k1,k2,k0) % k1 , k2 是画图时间范围,k0是脉冲位置 k=k1:k2; n=length(k); f=zeros(1,n);

f(1,-k0-k1+1)=1; stem(k,f,'filled') axis([k1,k2,0,1.5]) title('单位序列δ(k)') 保存文件名dwxulie.m

画图时在命令窗口调用,例:dwxulie(-5,5,0) 例2-3 单位阶跃序列信号

?(k)???1k?0

?0k?010

本题也可先建立一个画单位阶跃序列?(k?k0)的M函数文件,画图时调用。 function jyxulie(k1,k2,k0) k=k1:-k0-1; kk=-k0:k2; n=length(k); nn=length(kk) u=zeros(1,n);

uu=ones(1,nn); stem(kk,uu,'filled') hold on

stem(k,u,'filled') hold off

title('单位阶跃序列') axis([k1 k2 0 1.5]) 保存文件名jyxulie.m

画图时在命令窗口调用,例:jyxulie(-3,8,0)

例2-4 实指数序列信号 f(k)?cak ,c、 a是实数。 建立一个画实指数序列的M函数文件,画图时调用。 function dszsu(c,a,k1,k2) %c:指数序列的幅度 %a:指数序列的底数

%k1:绘制序列的起始序号 %k2:绘制序列的终止序号 k=k1:k2; x=c*(a.^k); stem(k,x,'filled') hold on

plot([k1,k2],[0,0]) hold off

调用该函数画信号:f5k3k1(k)?(4)?(k) ,f2(k)?(?4)?(k)波形。 dszsu(1,5/4,0,40) dszsu(1,-3/4,0,40)

2 .离散信号的卷积和

两个有限长序列f1,f2卷积可调用MATLAB函数conv,调用格式是f=conv(f1,f2), 是卷积结果,但不显示时间序号,可自编一个函数dconv给出f和k,并画图。 function [f,k]=dconv(f1,f2,k1,k2) %The function of compute f=f1*f2

% f: 卷积和序列f(k)对应的非零样值向量

11

f

% k: 序列f(k)的对应序号向量 % f1: 序列f1(k)非零样值向量 % f2: 序列f2(k)的非零样值向量 % k1: 序列f1(k)的对应序号向量 % k2: 序列f2(k)的对应序号向量 f=conv(f1,f2) %计算序列f1与f2的卷积和f k0=k1(1)+k2(1); %计算序列f非零样值的起点位置 k3=length(f1)+length(f2)-2; %计算卷积和f的非零样值的宽度

k=k0:k0+k3 %确定卷积和f非零样值的序号向量 subplot(2,2,1) stem(k1,f1) %在子图1绘序列f1(k)时域波形图 title('f1(k)') xlabel('k') ylabel('f1(k)') subplot(2,2,2) stem(k2,f2) %在图2绘序列f2(k)时波形图 title('f1(k)') xlabel('k') ylabel('f2(k)') subplot(2,2,3) stem(k,f); %在子图3绘序列f(k)的波形图 title('f(k)f1(k)与f2(k)的卷积和f(k)') xlabel('k') ylabel('f(k)')

h=get(gca,'position'); h(3)=2.5*h(3);

set(gca,'position',h) %将第三个子图的横坐标范围扩为原来的2.5倍 例2-5求卷积和,

f1(k)??(k?1)?2?(k)??(k?1)f2(k)??(k?2)??(k?1)??(k)??(k?1)??(k?2)

f1=[1 2 1];

k1=[-1 0 1]; f2=ones(1,5); k2=-2:2;

[f, k]=dconv(f1,f2,k1,k2)

由运行结果知,f的长度等于f1和f2长度之和减一, f的起点是f1和f2的起点之和,f的终点是f1和f2的终点之和。 3. 离散系统的单位响应

MATLAB提供画系统单位响应函数impz,调用格式是 impz(b,a) 式中b和a是表示离散系统的行向量;

impz(b,a,n) 式中b和a是表示离散系统的行向量,时间范围是0~n;

impz(b,a,n1,n2) 时间范围是n1~n2 ;y=impz(b,a,n1,n2) 由y给出数值序列;

12

例2-6已知 y(k)?y(k?1)?0.9y(k?2))?f(k) 求单位响应。

a=[1,-1,0.9]; b=[1]; impz(b,a) impz(b,a,60) impz(b,a,-10:40)

4. 离散系统的零状态响应

MATLAB提供求离散系统零状态响应数值解函数filter,调用格式为filter(b,a,x),式中b和a是表示离散系统的向量,x是输入序列非零样值点行向量,输出向量序号同x一样。 例2-7 已知 y(k)?0.25y(k?1)?0.5y(k?2))?f(k)?f(k?1), f(k)?()?(k) 求零状态响应, 范围0~20。 a=[1 -0.25 0.5]; b=[1 1]; t=0:20; x=(1/2).^t; y=filter(b,a,x) subplot(2,1,1) stem(t,x)

title('输入序列') subplot(2,1,2) stem(t,y)

title('响应序列') 三、上机实验内容 1.验证实验原理中程序

2.已知2y(k)?2y(k?1)?y(k?2)?f(k)?3f(k?1)?2f(k?2),画单位响应波形。 3.已知y(k)?y(k?1)?0.25y(k?2)?f(k),输入f(t)??(k),画输出波形,范围0~15。

12k

13

实验三 连续时间LTI系统的时域分析

一、实验目的

1.学会用MATLAB求解连续系统的零状态响应; 2. 学会用MATLAB求解冲激响应及阶跃响应; 3.学会用MATLAB实现连续信号卷积的方法; 二、实验原理

1.连续时间系统零状态响应的数值计算

我们知道,LTI连续系统可用如下所示的线性常系数微分方程来描述,

?ayii?0N(i)(t)??bjf(j)(t)

j?0M在MATLAB中,控制系统工具箱提供了一个用于求解零初始条件微分方程数值解的函数lsim。其调用格式

y=lsim(sys,f,t)

式中,t表示计算系统响应的抽样点向量,f是系统输入信号向量,sys是LTI系统模型,用来表示微分方程,差分方程或状态方程。其调用格式

sys=tf(b,a)

式中,b和a分别是微分方程的右端和左端系数向量。例如,对于以下方程:

a3y'''(t)?a2y''(t)?a1y'(t)?a0y(t)?b3f'''(t)?b2f''(t)?b1f'(t)?b0f(t)

可用a?[a3,a2,a1,a0];b?[b3,b2,b1,b0]; sys?tf(b,a) 获得其LTI模型。

注意,如果微分方程的左端或右端表达式中有缺项,则其向量a或b中的对应元素应为零,不能省略不写,否则出错。

例3-1 已知某LTI系统的微分方程为 y’’(t)+ 2y’(t)+100y(t)=f(t)

其中,y(0)?y(0)?0,f(t)?10sin(2?t),求系统的输出y(t).

解:显然,这是一个求系统零状态响应的问题。其MATLAB计算程序如下: ts=0;te=5;dt=0.01; sys=tf([1],[1,2,100]); t=ts:dt:te;

f=10*sin(2*pi*t); y=lsim(sys,f,t); plot(t,y);

xlabel('Time(sec)'); ylabel('y(t)');

2.连续时间系统冲激响应和阶跃响应的求解 在MATLAB中,对于连续LTI系统的冲激响应和阶跃响应,可分别用控制系统工具箱提供的函数impluse和step来求解。其调用格式为

'14

y=impluse(sys,t) y=step(sys,t)

式中,t表示计算系统响应的抽样点向量,sys是LTI系统模型。

例3-2已知某LTI系统的微分方程为 y’’(t)+ 2y’(t)+100y(t)=10f(t)

求系统的冲激响应和阶跃响应的波形. 解:ts=0;te=5;dt=0.01; sys=tf([10],[1,2,100]);

t=ts:dt:te;

h=impulse(sys,t); figure; plot(t,h);

xlabel('Time(sec)'); ylabel('h(t)');

g=step(sys,t); figure; plot(t,g);

xlabel('Time(sec)');

ylabel('g(t)');

3. 用MATLAB实现连续时间信号的卷积

信号的卷积运算有符号算法和数值算法,此处采用数值计算法,需调用MATLAB 的conv( )函数近似计算信号的卷积积分。连续信号的卷积积分定义是 f(t)?f1(t)?f2(t)?????f1(?)f2(t??)d?

如果对连续信号f1(t)和f2(t)进行等时间间隔?均匀抽样,则f1(t)和f2(t)分别变为离散时间信号f1(m?)和f2(m?)。其中,m为整数。当?足够小时,f1(m?)和f2(m?)既为连续时间信号f1(t)和f2(t)。因此连续时间信号卷积积分可表示为

f(t)?f1(t)?f2(t)??f1(?)f2(t??)d?????lim??0m????f(m?)?f1?

2(t?m?)??采用数值计算时,只求当t?n?时卷积积分f(t)的值f(n?),其中,n为整数,既

f(n?)?

m?????f(m?)?f1m????2(n??m?)??

???f1(m?)?f2[(n?m)?]其中,

m????f(m?)?f1?2[(n?m)?]实际就是离散序列f1(m?)和f2(m?)的卷积和。当?足

15

够小时,序列f(n?)就是连续信号f(t)的数值近似,既 f(t)?f(n?)??[f1(n)?f2(n)]

上式表明,连续信号f1(t)和f2(t)的卷积,可用各自抽样后的离散时间序列的卷积再乘以抽样间隔?。抽样间隔?越小,误差越小。

例3-3用数值计算法求f1(t)?u(t)?u(t?2)与f2(t)?e?3tu(t)的卷积积分。

解:因为f2(t)?e?3tu(t)是一个持续时间无限长的信号,而计算机数值计算不可能计算真正的无限长信号,所以在进行f2(t)的抽样离散化时,所取的时间范围让f2(t)衰减到足够小就可以了,本例取t?2.5。程序是 dt=0.01; t=-1:dt:2.5;

f1=Heaviside(t)-Heaviside(t-2); f2=exp(-3*t).*Heaviside(t);

f=conv(f1,f2)*dt; n=length(f); tt=(0:n-1)*dt-2; subplot(221), plot(t,f1), grid on;

axis([-1,2.5,-0.2,1.2]); title('f1(t)'); xlabel('t') subplot(222), plot(t,f2), grid on;

axis([-1,2.5,-0.2,1.2]); title('f2(t)'); xlabel('t') subplot(212), plot(tt,f), grid on; title('f(t)=f1(t)*f2(t)'); xlabel('t')

由于f1(t)和f2(t)的时间范围都是从t=-1开始,所以卷积结果的时间范围从 t=-2开始,增量还是取样间隔?,这就是语句tt=(0:n-1)*dt-2的由来。 三、上机实验内容

1. 验证实验原理中所述的相关程序

2. 已知描述系统的微分方程和激励信号f(t)如下,试用解析法求系统的零状态响应y(t),并用MATLAB绘出系统零状态响应的时域仿真波形,验证结果是否相同 y’’(t)+ 4y’(t)+4y(t)=f’(t)+3f(t) f(t)= exp(-t)u(t)

3.已知描述系统的微分方程如下,试用MATLAB求系统在0~10秒范围内冲激响应和阶跃响应的数值解,并用绘出系统冲激响应和阶跃响应的时域波形

y’’(t)+3y’(t)+2y(t)=f(t)

y’’(t)+ 2y’(t)+2y(t)=f’(t)

4.画出信号卷积积分f1(t)?f2(t)的波形,f1(t)?f2(t)?u(t)?u(t?1)

16

实验四 傅里叶变换、系统的频域分析

一、 实验目的

1、学会用MATLAB实现连续时间信号傅里叶变换 2、学会用MATLAB分析LTI系统的频域特性 3、学会用MATLAB分析LTI系统的输出响应 二、实验原理

1.傅里叶变换的MATLAB求解

MATLAB的symbolic Math Toolbox 提供了直接求解傅里叶变换及逆变换的函数fourier()及ifourier()两者的调用格式如下。 Fourier 变换的调用格式

F=fourier(f):它是符号函数f的fourier变换默认返回是关于w的函数。

F=fourier(f,v):它返回函数F是关于符号对象v的函数,而不是默认的w,即

F(v)??????f(x)e?jvxdx

Fourier逆变换的调用格式

f=ifourier(F):它是符号函数F的fourier逆变换,默认的独立变量为w,默认返回是

关于x的函数。

f=ifourier(f,u):它的返回函数f是u的函数,而不是默认的x.

注意:在调用函数fourier()及ifourier()之前,要用syms命令对所用到的变量(如t,u,v,w)进行说明,即将这些变量说明成符号变量。 例4-1 求f(t)?e?2t的傅立叶变换

解: 可用MATLAB解决上述问题: syms t

Fw=fourier(exp(-2*abs(t)))

例4-2 求F(jw)?1的逆变换f(t) 21??解: 可用MATLAB解决上述问题 syms t w

ft=ifourier(1/(1+w^2),t)

2.连续时间信号的频谱图

例4-3 求调制信号f(t)?AG?(t)cos?0t的频谱,式中

A?4,?0?12?,??1??,G?(t)?u(t?)?u(t?) 222解:MATLAB程序如下所示

ft=sym('4*cos(2*pi*6*t)*(Heaviside(t+1/4)-Heaviside(t-1/4))'); Fw=simplify(fourier(ft))

17

subplot(121)

ezplot(ft,[-0.5 0.5]),grid on subplot(122)

ezplot(abs(Fw),[-24*pi 24*pi]),grid

用MATLAB符号算法求傅里叶变换有一定局限,当信号不能用解析式表达时,会提示出错,这时用MATLAB的数值计算也可以求连续信号的傅里叶变换,计算原理是

F(j?)??f(t)e????j?tdt?lim?f(n?)e?j?n??

??0n????当?足够小时,近似计算可满足要求。若信号是时限的,或当时间大于某个给定值时,信号已衰减的很厉害,可以近似地看成时限信号时,n的取值就是有限的,设为N,有

F(k)??f(n?)e?j?kn??n?0N?1,0?k?N,?k?2?k 是频率取样点 N?时间信号取样间隔?应小于奈奎斯特取样时间间隔,若不是带限信号可根据计算精度要求确定一个频率 W0为信号的带宽。

例4-4 用数值计算法求信号f(t)?u(t?1)?u(t?1)的傅里叶变换

解,信号频谱是F(j?)?2Sa(?),第一个过零点是?,一般将此频率视为信号的带宽,若将精度提高到该值的50倍,既W0=50?,据此确定取样间隔,??R=0.02;t=-2:R:2;

f=Heaviside(t+1)-Heaviside(t-1); W1=2*pi*5;

N=500;k=0:N;W=k*W1/N; F=f*exp(-j*t'*W)*R; F=real(F);

W=[-fliplr(W),W(2:501)]; F=[fliplr(F),F(2:501)]; subplot(2,1,1);plot(t,f); xlabel('t');ylabel('f(t)'); title('f(t)=u(t+1)-u(t-1)'); subplot(2,1,2);plot(W,F); xlabel('w');ylabel('F(w)'); title('f(t)的付氏变换F(w)');

3.用MATLAB分析LTI系统的频率特性

当系统的频率响应H(jw)是jw的有理多项式时,有

1?0.02 2F0jwM)?1?L?b1jw(?)b0B(w)bM(jw)M?bM?1( H(jw)? ?NN?1A(w)aN(jw)?aN?1(jw)?L?a1(jw)?a018

MATLAB信号处理工具箱提供的freqs函数可直接计算系统的频率响应的数值解。其调用格式如下

H=freqs(b,a,w)

其中,a和b分别是H(jw)的分母和分子多项式的系数向量,w为形如w1:p:w2的向量,定义系统频率响应的频率范围,w1为频率起始值,w2为频率终止值,p为频率取样间隔。H返回w所定义的频率点上,系统频率响应的样值。

例如,运行如下命令,计算0~2pi频率范围内以间隔0.5取样的系统频率响应的样值 a=[1 2 1]; b=[0 1];

h=freqs(b,a,0:0.5:2*pi)

例 4-5 三阶归一化的butterworth 低通滤波器的频率响应为

H(jw)?1 32(jw)?2(jw)?2(jw)?1 试画出该系统的幅度响应H(jw)和相位响应?(?)。

解 其MATLAB程序及响应的波形如下 w=0:0.025:5; b=[1];a=[1,2,2,1]; H=freqs(b,a,w); subplot(2,1,1);

plot(w,abs(H));grid; xlabel('\\omega(rad/s)'); ylabel('|H(j\\omega)|'); title('H(jw)的幅频特性'); subplot(2,1,2);

plot(w,angle (H));grid; xlabel('\\omega(rad/s)'); ylabel('\\phi(\\omega)'); title('H(jw)的相频特性');

4.用MATLAB分析LTI系统的输出响应

例 4-6已知一RC电路如图所示 系统的输入电压为f(t),输出信号为电阻两端的电压y(t).当RC=0.04,f(t)=cos5t+cos100t, ???t??? 试求该系统的响应y(t)

19

+ f(t) - C R + y(t) -

解 由图可知 ,该电路为一个微分电路,其频率响应为 H(jw)?Rjw ?R?1jwCjw?1RC 由此可求出余弦信号cos?0t通过LTI系统的响应为

y(t)?H(j0w)co?s0(?t??0( ))计算该系统响应的MATLAB程序及响应波形如下

RC=0.04;

t=linspace(-2,2,1024); w1=5;w2=100;

H1=j*w1/(j*w1+1/RC); H2=j*w2/(j*w2+1/RC); f=cos(5*t)+cos(100*t);

y=abs(H1)*cos(w1*t+angle(H1))+ abs(H2)*cos(w2*t+angle(H2)); subplot(2,1,1); plot(t,f); ylabel('f(t)'); xlabel('Time(s)'); subplot(2,1,2); plot(t,y); ylabel('y(t)'); xlabel('Time(s)'); 三、 上机实验内容

1.验证实验原理中所述的相关程序; 2.试用MATLAB求单边指数数信号f(t)?e3.设H(jw)??atu(t)的傅立叶变换,并画出其波形;

1,试用MATLAB画出该系统的幅频特性H(jw)和相20.08(jw)?0.4jw?1频特性?(?),并分析系统具有什么滤波特性。

20

实验五 信号抽样与恢复

一、实验目的

学会用MATLAB实现连续信号的采样和重建 二、实验原理 1.抽样定理

若f(t)是带限信号,带宽为?m, f(t)经采样后的频谱Fs(?)就是将f(t)的频谱

F(?)在频率轴上以采样频率?s为间隔进行周期延拓。因此,当?s??m时,不会发生频

率混叠;而当 2.信号重建

经采样后得到信号fs(t)经理想低通h(t)则可得到重建信号f(t),即:

?s

f(t)=fs(t)*h(t)

其中:fs(t)=f(t)??(t?nT)=?f(nT)?(t?nT)

sss???????ch(t)?TsSa(?ct)

?所以:

f(t)=fs(t)*h(t)=?f(nTs)?(t?nTs)*Ts????cSa(?ct) ?? =Tsc??f(nT)Sa[?(t?nT)]

scs???上式表明,连续信号可以展开成抽样函数的无穷级数。

利用MATLAB中的sinc(t)?tsin(?t)来表示Sa(t),有 Sa(t)?sinc(),所以可以?t?得到在MATLAB中信号由f(nTs)重建f(t)的表达式如下:

?f(t)=Tsc?????f(nTs)sinc[?c(t?nTs)] ?我们选取信号f(t)=Sa(t)作为被采样信号,当采样频率?s=2?m时,称为临界采样。我们取理想低通的截止频率?c=?m。下面程序实现对信号f(t)=Sa(t)的采样及由该采样

21

信号恢复重建Sa(t):

例5-1 Sa(t)的临界采样及信号重构;

wm=1; %信号带宽

wc=wm; %滤波器截止频率 Ts=pi/wm; %采样间隔

ws=2*pi/Ts; %采样角频率 n=-100:100; %时域采样电数 nTs=n*Ts %时域采样点 f=sinc(nTs/pi);

Dt=0.005;t=-15:Dt:15;

fa=f*Ts*wc/pi*sinc((wc/pi)*(ones(length(nTs),1)*t-nTs'*ones(1,length(t)))); %信号重构 t1=-15:0.5:15; f1=sinc(t1/pi); subplot(211); stem(t1,f1); xlabel('kTs'); ylabel('f(kTs)');

title('sa(t)=sinc(t/pi)的临界采样信号'); subplot(212); plot(t,fa) xlabel('t'); ylabel('fa(t)');

title('由sa(t)=sinc(t/pi)的临界采样信号重构sa(t)'); grid;

例5-2 Sa(t)的过采样及信号重构和绝对误差分析

程序和例4-1类似,将采样间隔改成Ts=0.7*pi/wm , 滤波器截止频率该成wc=1.1*wm , 添加一个误差函数 wm=1;

wc=1.1*wm; Ts=0.7*pi/wm; ws=2*pi/Ts; n=-100:100; nTs=n*Ts

f=sinc(nTs/pi);

Dt=0.005;t=-15:Dt:15;

fa=f*Ts*wc/pi*sinc((wc/pi)*(ones(length(nTs),1)*t-nTs'*ones(1,length(t)))); error=abs(fa-sinc(t/pi)); %重构信号与原信号误差 t1=-15:0.5:15; f1=sinc(t1/pi); subplot(311); stem(t1,f1); xlabel('kTs');

22

ylabel('f(kTs)');

title('sa(t)=sinc(t/pi)的采样信号'); subplot(312); plot(t,fa) xlabel('t'); ylabel('fa(t)');

title('由sa(t)=sinc(t/pi)的过采样信号重构sa(t)'); grid;

subplot(313); plot(t,error); xlabel('t');

ylabel('error(t)');

title('过采样信号与原信号的误差error(t)');

例5-3 Sa(t)的欠采样及信号重构和绝对误差分析

程序和例4-2类似,将采样间隔改成Ts=1.5*pi/wm , 滤波器截止频率该成wc=wm=1

三、上机实验内容

1.验证实验原理中所述的相关程序;

2.设f(t)=0.5*(1+cost)*(u(t+pi)-u(t-pi)) ,由于不是严格的频带有限信号,但其频谱大部分集中在[0,2]之间,带宽wm可根据一定的精度要求做一些近似。试根据以下两种情况用 MATLAB实现由f(t)的抽样信号fs(t)重建f(t) 并求两者误差,分析两种情况下的结果。 (1) wm=2 , wc=1.2wm , Ts=1; (2) wm=2 , wc=2 , Ts=2.5

23

实验六 信号与系统复频域分析

一、实验目的

1.学会用MATLAB进行部分分式展开; 2.学会用MATLAB分析LTI系统的特性; 3.学会用MATLAB进行Laplace正、反变换。 4.学会用MATLAB画离散系统零极点图; 5.学会用MATLAB分析离散系统的频率特性;

二、实验原理及内容

1.用MATLAB进行部分分式展开

用MATLAB函数residue可以得到复杂有理分式F(s)的部分分式展开式,其调用格式为 ?r,p,k??residue(num,den)

其中,num,den分别为F(s)的分子和分母多项式的系数向量,r为部分分式的系数,p为极点,k为F(s)中整式部分的系数,若F(s)为有理真分式,则k为零。

例6-1 用部分分式展开法求F(s)的反变换 F(s)?s?2

s3?4s2?3s解:其MATLAB程序为 format rat; num=[1,2]; den=[1,4,3,0];

[r,p]=residue(num,den)

程序中format rat是将结果数据以分数形式显示

?1?0.56 ?F(s)可展开为 F(s)?3?ss?1s?3所以,F(s)的反变换为 f(t)???e?e6?322?21?t1?3t?ut( )??2.用MATLAB分析LTI系统的特性

系统函数H(s)通常是一个有理分式,其分子和分母均为多项式。计算H(s)的零极点可以应用MATLAB中的roots函数,求出分子和分母多项式的根,然后用plot命令画图。

在MATLAB中还有一种更简便的方法画系统函数H(s)的零极点分布图,即用pzmap函数画图。其调用格式为

pzmap(sys)

sys表示LTI系统的模型,要借助tf函数获得,其调用格式为

sys=tf(b,a)

24

式中,b和a分别为系统函数H(s)的分子和分母多项式的系数向量。

(j?)如果已知系统函数H(s),求系统的单位冲激响应h(t)和频率响应H可以用以前介绍过的impulse和freqs函数。 例6-2 已知系统函数为 H(s)=1 32s?2s?2s?1(j?)试画出其零极点分布图,求系统的单位冲激响应h(t)和频率响应H,并判断系统

是否稳定。

解:其MATLAB程序如下: num=[1]; den=[1,2,2,1]; sys=tf(num,den); figure(1);pzmap(sys); t=0:0.02:10;

h=impulse(num,den,t); figure(2);plot(t,h)

title('Impulse Response') [H,w]=freqs(num,den); figure(3);plot(w,abs(H)) xlabel('\\omega')

title('Magnitude Response')

3.用MATLAB进行Laplace正、反变换

MATLAB的符号数学工具箱提供了计算Laplace正、反变换的函数Laplace和ilaplace,其调用格式为

F?laplace(f)

f?ilaplace(F)上述两式右端的f和F分别为时域表示式和s域表示式的符号表示,可以应用函数sym实现,其调用格式为

S=sym(A)

式中,A为待分析表示式的字符串,S为符号数字或变量。 例6-3 试分别用Laplace和ilaplace函数求 (1)f(t)?esin(at)u(t)的Laplace变换;

?ts2(2)F(s)?2的Laplace反变换。

s?1解:(1)其程序为 f=sym('exp(-t)*sin(a*t)'); F=laplace(f) 或

syms a t

F=laplace(exp(-t)*sin(a*t)) (2)其程序为

25

F=sym('s^2/(s^2+1)'); ft=ilaplace(F) 或 syms s

ft= ilaplace(s^2/(s^2+1)) 4.离散系统零极点图

离散系统可以用下述差分方程描述:

?ay(k?i)??bii?0m?0NMmf(k?m)

Y(z)b0?b1z?1?...?bMz?MZ变换后可得系统函数:H(z)? ?F(z)a0?a1z?1?...?aNz?N用MATLAB提供的root函数可分别求零点和极点,调用格式是

p=[a0,a1…an],q=[b0,b1…bm,0,0…0], 补0使二者维数一样。画零极点图的方法有多种,可以用MATLAB函数[z,p,k]=tf2zp(b,a)和zplane(q,p),也可用plot命令自编一函数ljdt.m,画图时调用。

function ljdt(A,B)

% The function to draw the pole-zero diagram for discrete system

p=roots(A); %求系统极点 q=roots(B); %求系统零点 p=p'; %将极点列向量转置为行向量 q=q'; %将零点列向量转置为行向量 x=max(abs([p q 1])); %确定纵坐标范围 x=x+0.1; y=x; %确定横坐标范围 clf hold on

axis([-x x -y y]) %确定坐标轴显示范围 w=0:pi/300:2*pi; t=exp(i*w); plot(t) %画单位园 axis('square') plot([-x x],[0 0]) %画横坐标轴 plot([0 0],[-y y]) %画纵坐标轴 text(0.1,x,'jIm[z]') text(y,1/10,'Re[z]')

plot(real(p),imag(p),'x') %画极点 plot(real(q),imag(q),'o') %画零点 title('pole-zero diagram for discrete system') %标注标题 hold off

例6-4 求系统函数零极点图H(z)?

a=[3 -1 0 0 0 1];

26

z?1 543z?z?1

b=[1 1]; ljdt(a,b) p=roots(a) q=roots(b) pa=abs(p)

5.离散系统的频率特性

离散系统的频率特性可由系统函数求出,既令z?ej?,MATLAB函数freqz可计算频率

特性,调用格式是:

[H,W]=freqz(b,a,n),b和a是系统函数分子分母系数,n是0-?范围 n个等份点,默认

值512,H是频率响应函数值,W是相应频率点;

[H,W]=freqz(b,a,n,’whole’), n是0-2?范围 n个等份点; freqz(b,a,n),直接画频率响应幅频和相频曲线;

例6-5 系统函数H(z)?z?0.5

运行如下语句,可得10个频率点的计算结果 A=[1 0]; B=[1 -0.5];

[H,W]=freqz(B,A,10)

继续运行如下语句,可将400个频率点的计算结果用plot语句画幅频和相频曲线 B=[1 -0.5]; A =[1 0];

[H,w]=freqz(B,A,400,'whole'); Hf=abs(H); Hx=angle(H); clf

figure(1) plot(w,Hf)

title('离散系统幅频特性曲线') figure(2) plot(w,Hx)

title('离散系统相频特性曲线')

还可用freqz语句直接画图,注意区别 A=[1 0]; B=[1 -0.5]; freqz(B,A,400)

例6-6 用几何矢量法,自编程序画频率响应

z原理:频率响应H(ej??(e??qjMj))?j?1N?(e??p)jii?1

27

编程流程:定义Z平面单位圆上k个频率等分点;求出系统函数所有零点和极点到这些等分点的距离;求出系统函数所有零点和极点到这些等分点的矢量的相角;求出单位圆上各 频率等分点的

H(ej?)和?(?)画指定范围内的幅频与相频。若要画零极点图,可调用ljdt.m函数。 function dplxy(k,r,A,B)

%The function to draw the frequency response of discrete system p=roots(A); %求极点 q=roots(B); %求零点 figure(1) ljdt(A,B) %画零极点图 w=0:l*pi/k:r*pi; y=exp(i*w); %定义单位圆上的k个频率等分点 N=length(p); %求极点个数 M=length(q); %求零点个数 yp=ones(N,1)*y; %定义行数为极点个数的单位圆向量 yq=ones(M,1)*y; %定义行数为零点个数的单位圆向量 vp=yp-p*ones(1,r*k+1); %定义极点到单位圆上各点的向量 vq=yq-q*ones(1,r*k+1); %定义零点到单位圆上各点的向量 Ai=abs(vp); %求出极点到单位圆上各点的向量的模 Bj=abs(vq); %求出零点到单位圆上各点的向量的模 Ci=angle(vp); %求出极点到单位圆上各点的向量的相角 Dj=angle(vq); %求出零点到单位圆上各点的向量的相角 fai=sum(Dj,1)-sum(Ci,1); %求系统相频响应 H=prod(Bj,1)./prod(Ai,1); %求系统幅频响应 figure(2) plot(w,H); %绘制幅频特性曲线 title('离散系统幅频特性曲线') xlabel('角频率') ylabel('幅度') figure(3) plot(w,fai) title('离散系统的相频特性曲线') xlabel('角频率') ylabel('相位')

5/4(1?z?1)已知系统函数H(z)?,画频率响应和零极点图。 ?11?1/4zA=[1 -1/4]; B=[5/4 -5/4];

dplxy(500,2,A,B) %绘制系统2π频率范围内500个频率点的幅频和相频特性曲线

及零极点图

28

三、上机实验内容

1.验证实验原理中所述的相关程序; 2.求信号f(t)?te?3tu(t)的拉普拉斯变换

s3?5s2?9s?73.求函数F(s)?的反变换 2s?3s?24.已知连续系统的系统函数如下,试用MATLAB绘制系统的零极点图,并根据零极点图判断系统的稳定性

s2?s?2 H(s)=3 23s?5s?4s?6

5.系统函数是

1?5z?5z

?1?2?z?3

求频率响应。

29