Matlab第十三次课
基本信号的 MATLAB实现
,实验目的
1,连续信号:
( 1) 指数信号:在 MATLAB中用 exp
函数表示,调用形式为:
如单边衰减指数信号的 MATLAB表示:
clc
clear
close all
A=1;a=-0.4;
t=0:0.01:10;
ft=A*exp(a*t);
plot(t,ft);
grid on;
( 1) 正弦信号:可用 MATLAB的内部函数
cos与 sin表示:
如
A=1;w=2*pi;
phi=pi/6;
t=0:0.001:10;
ft=A*sin(w*t+phi);
plot(t,ft)
在信号处理工具箱中( Signal Processing
Toolbox)还提供了诸如矩形波、三角形、
周期性矩形波和三角波等信号处理中常用的信号。比如,矩形脉冲信号在
MATLAB中用 rectpuls 表示,调用形式为:
y=rectpuls(t-t0,width)
用以产生一个幅度为 1,宽度为 width以
t=t0为对称的矩形波。 Width的默认值为
1。
clc
clear
close all
t=0:0.01:5;
y = rectpuls(t-1);
figure
plot(t,0.5*y,'r')
axis([0 5 0 0.6])
三角波脉冲信号在 MATLAB中用 tripuls函数表示,其调用形式为:
y=tripuls(t,width,skew)
用以产生一个最大幅度为 1,宽度为 width斜度为 skew的三角波。该函数的横坐标范围由向量
t决定,是以 t=0为中心向左右各展开 width /2的范围,即函数值的非零范围为( - width /2,
width /2 ) ;斜度 skew是一个介于 -1到 1之间的值,它表示最大幅度 1出现所对应的横坐标位置,
比如 skew=0,表示是一个左右对称的三角波,最大幅度 1出现在 t=0处 ;最大幅度 1出现在
t=(width/2) × skew的横坐标位置。
clc
clear
close all
t=-3:0.01:3;
ft=tripuls(t,4,0.5);
plot(t,ft,'r');
grid on;
axis([-3 3 -0.5 1.5])
clc
clear
close all
t=-5:0.01:5;
y=tripuls(t-1,3);
y1=tripuls(t-1,3,0.5);
plot(t,y)
figure
plot(t,y1)
y2=tripuls(t-1,3,-0.5);
plot(t,y2)
取样函数
y=sinc(t)
sinc computes the sinc function of an input
vector or array,where the sinc function is
clc
clear
close all
t=-10:0.01:10;
y=sinc(t);
y1=sin(pi*t)./(pi*t);
plot(t,y,’r’)
figure
plot(t,y1)
6.3 离散信号和系统
补充知识
6.3 离散信号和系统
学习如何利用 MATLAB表示离散信号和
LTI离散系统的问题。
MATLAB具有数值计算的特点,因此用它来分析离散信号比较方便。
有限长序列:用一个列向量表示。
光用一个向量难以表示序列的起始位置,
或采样位置。
解决办法:用两个向量。
如序列:
X(n)={2,1,-1,3,1,4,3,7}
要表示起始点,要用个箭头。
在 Matlab里,可以用如下方法表示。
n=[-3,-2,-1,0,1,2,3,4];
x=[2,1,-1,3,1,4,3,7]
例:用图示的方法表示上述序列
clc
clear,close all
n=[-4,-3,-2,-1,0,1,2,3,4,5];
x=[0,2,1,-1,3,1,4,3,7,0];
stem(n,x)
例 6.13 离散信号的 Matlab表述
编写 Matlab程序来产生下列基本脉冲序列。
( 1)单位脉冲序列,起点 n0,终点 nf,在 ns处有一单位脉冲 (n0?ns?nf).
(2)单位阶跃序列,起点 n0,终点 nf,在 ns前为 0,
在 ns后为 1(n0?ns?nf).
( 3)复指数序列。
解:
单位脉冲序列 (单位序列,单位样值(采样)序列 )。
其它0
01)( nn?
延迟 ns(如 3)的单位采样序列
其它0
1)()(
1
s
s
nnnnnx?
( 2)单位阶跃序列
00
01)(
n
nnu
延迟 ns(如 3)的单位阶跃序列
s
s
s nn
nnnnunx
0
1)()(
2
(3)复指数序列
00
0)( )(
3 n
nenx njw?
1)当 w=0时,为实指数序列;
2)当?= 0时,为虚指数序列,实部为余弦序列,虚部为正弦序列。
本例取?= -0.2,w=0.5
clc
clear,close all
n0=0;nf=10;ns=3;
n1=n0:nf;
x1=[(n1-ns)==0];%假为零,真为一
x2=[(n1-ns)>=0];%假为零,真为一
x3=exp((-0.2+0.5j)*n1);
subplot(2,2,1),stem(n1,x1);title('单位采样序列 ')
subplot(2,2,2),stem(n1,x2);title('单位阶跃序列 ')
subplot(2,2,3),stem(n1,real(x3)); %line([0,10],[0,1])
title('复指数序列 '),ylabel('实部 ')
subplot(2,2,4),stem(n1,imag(x3));line([0,10],[0,0])
title('复指数序列 '),ylabel('虚部 ')
补充知识
利用递推法解差分方程
描述离散时间系统的差分方程是具有递推关系的代数方程;
若已知初始状态和输入激励序列,利用递推法 (迭代法 )可求得差分方程的数值解。
例 一阶线性常系数差分方程
y[k]-0.5y[k-1]=u[k],k?0
且已知初始状态 y[-1]=1,用递推法求解差分方程。
解:将差分方程写成 y[k]= u[k] +0.5y[k-1]
代入初始状态,可求得
y[0]=u[0]+0.5y[-1]=1+0.5× 1=1.5
类似地,依次迭代可得
y[1]=u[1]+0.5y[0]=1+0.5× 1.5=1.75
y[2]=u[2]+0.5y[1]=1+0.5× 1.75=1.875
等等
clc
clear,close all
u=[0,ones(1,20)];
y=zeros(1,21);
y(1)=1;
for n=2:length(y)
y(n)=u(n)+0.5*y(n-1);
end
stem(y)
6.14差分方程的通用递推程序
描述 LTI离散系统的差分方程为
a1y(n)+a2y(n-1)+…+a nay(n-na+1)=b1u(n-
1)+b2u(n-1)+…+b nbu(n-nb+1)
编写解上述方程的通用程序
解:
将原方程整理为
a1y(n) =b1u(n-1)+b2u(n-1)+…+b nbu(n-
nb+1)-[a2y(n-1)+…+a nay(n-na+1)]
令 us=[u(n),…u(n -nb+1)]
ys=[y(n-1),…,y(n -na+1)];
则上式变为
a(1)*y(n)=b*us’-a(2:na)*ys’
得 y(n)=(b*us’-a(2:na)*ys’)/a(1);
这样就可以利用递推法来求 y(n)了;
但是由于要用到初始条件,y(-1),y(-2),y(-3)… 。
但 Matlab中不能有负数的下标???
解决的办法,另外设置两个变量:
ym=[y01,y02…y];
um=[0,0,…u]
最后取出 y就可以了。
clc
clear,% close all
a=input('差分方程左端的系数向量
a=[a(1),a(2),...a(na)]=');%[1,0.1,0.15,-0.225]
b=input('差分方程右端的系数向量
b=[b(1),b(2),...b(nb)]=');%[3,7,1];
u=input('输入信号序列 u=');%exp(0.1*[1:20])
na=length(a);nb=length(b);nu=length(u);
%s=['起算点前 ',int2str(na-1),'点 y的值= [y(',int2str(na-
2),'),...,y(0)]=']
ym=zeros(1,na+nu-1);ym(1:na-1)=input('初始值
s=');%[0,0,0]
um=[0,zeros(1,na-1),u];%u以 n=0为起始点 zeros(1:na-
2),
for n=na:na+nu-1
ys=ym(n-1:-1:n-na+1); us=um(n:-1:n-
nb+1)
ym(n)=(b*us'-a(2:na)*ys')/a(1);
end
%把 ym时间坐标右移 na-1位,求出 y
y=ym(na:na+nu-1);stem(y),grid on
line([0,nu],[0,0])
例 6.5 求离散系统在各种输入下的响应
clc
clear,close all
disp('分题 1,初始条件响应 ')
subplot(1,3,1),q614
disp('分题 2,单位脉冲响应 ')
subplot(1,3,1),q614
基本信号的 MATLAB实现
,实验目的
1,连续信号:
( 1) 指数信号:在 MATLAB中用 exp
函数表示,调用形式为:
如单边衰减指数信号的 MATLAB表示:
clc
clear
close all
A=1;a=-0.4;
t=0:0.01:10;
ft=A*exp(a*t);
plot(t,ft);
grid on;
( 1) 正弦信号:可用 MATLAB的内部函数
cos与 sin表示:
如
A=1;w=2*pi;
phi=pi/6;
t=0:0.001:10;
ft=A*sin(w*t+phi);
plot(t,ft)
在信号处理工具箱中( Signal Processing
Toolbox)还提供了诸如矩形波、三角形、
周期性矩形波和三角波等信号处理中常用的信号。比如,矩形脉冲信号在
MATLAB中用 rectpuls 表示,调用形式为:
y=rectpuls(t-t0,width)
用以产生一个幅度为 1,宽度为 width以
t=t0为对称的矩形波。 Width的默认值为
1。
clc
clear
close all
t=0:0.01:5;
y = rectpuls(t-1);
figure
plot(t,0.5*y,'r')
axis([0 5 0 0.6])
三角波脉冲信号在 MATLAB中用 tripuls函数表示,其调用形式为:
y=tripuls(t,width,skew)
用以产生一个最大幅度为 1,宽度为 width斜度为 skew的三角波。该函数的横坐标范围由向量
t决定,是以 t=0为中心向左右各展开 width /2的范围,即函数值的非零范围为( - width /2,
width /2 ) ;斜度 skew是一个介于 -1到 1之间的值,它表示最大幅度 1出现所对应的横坐标位置,
比如 skew=0,表示是一个左右对称的三角波,最大幅度 1出现在 t=0处 ;最大幅度 1出现在
t=(width/2) × skew的横坐标位置。
clc
clear
close all
t=-3:0.01:3;
ft=tripuls(t,4,0.5);
plot(t,ft,'r');
grid on;
axis([-3 3 -0.5 1.5])
clc
clear
close all
t=-5:0.01:5;
y=tripuls(t-1,3);
y1=tripuls(t-1,3,0.5);
plot(t,y)
figure
plot(t,y1)
y2=tripuls(t-1,3,-0.5);
plot(t,y2)
取样函数
y=sinc(t)
sinc computes the sinc function of an input
vector or array,where the sinc function is
clc
clear
close all
t=-10:0.01:10;
y=sinc(t);
y1=sin(pi*t)./(pi*t);
plot(t,y,’r’)
figure
plot(t,y1)
6.3 离散信号和系统
补充知识
6.3 离散信号和系统
学习如何利用 MATLAB表示离散信号和
LTI离散系统的问题。
MATLAB具有数值计算的特点,因此用它来分析离散信号比较方便。
有限长序列:用一个列向量表示。
光用一个向量难以表示序列的起始位置,
或采样位置。
解决办法:用两个向量。
如序列:
X(n)={2,1,-1,3,1,4,3,7}
要表示起始点,要用个箭头。
在 Matlab里,可以用如下方法表示。
n=[-3,-2,-1,0,1,2,3,4];
x=[2,1,-1,3,1,4,3,7]
例:用图示的方法表示上述序列
clc
clear,close all
n=[-4,-3,-2,-1,0,1,2,3,4,5];
x=[0,2,1,-1,3,1,4,3,7,0];
stem(n,x)
例 6.13 离散信号的 Matlab表述
编写 Matlab程序来产生下列基本脉冲序列。
( 1)单位脉冲序列,起点 n0,终点 nf,在 ns处有一单位脉冲 (n0?ns?nf).
(2)单位阶跃序列,起点 n0,终点 nf,在 ns前为 0,
在 ns后为 1(n0?ns?nf).
( 3)复指数序列。
解:
单位脉冲序列 (单位序列,单位样值(采样)序列 )。
其它0
01)( nn?
延迟 ns(如 3)的单位采样序列
其它0
1)()(
1
s
s
nnnnnx?
( 2)单位阶跃序列
00
01)(
n
nnu
延迟 ns(如 3)的单位阶跃序列
s
s
s nn
nnnnunx
0
1)()(
2
(3)复指数序列
00
0)( )(
3 n
nenx njw?
1)当 w=0时,为实指数序列;
2)当?= 0时,为虚指数序列,实部为余弦序列,虚部为正弦序列。
本例取?= -0.2,w=0.5
clc
clear,close all
n0=0;nf=10;ns=3;
n1=n0:nf;
x1=[(n1-ns)==0];%假为零,真为一
x2=[(n1-ns)>=0];%假为零,真为一
x3=exp((-0.2+0.5j)*n1);
subplot(2,2,1),stem(n1,x1);title('单位采样序列 ')
subplot(2,2,2),stem(n1,x2);title('单位阶跃序列 ')
subplot(2,2,3),stem(n1,real(x3)); %line([0,10],[0,1])
title('复指数序列 '),ylabel('实部 ')
subplot(2,2,4),stem(n1,imag(x3));line([0,10],[0,0])
title('复指数序列 '),ylabel('虚部 ')
补充知识
利用递推法解差分方程
描述离散时间系统的差分方程是具有递推关系的代数方程;
若已知初始状态和输入激励序列,利用递推法 (迭代法 )可求得差分方程的数值解。
例 一阶线性常系数差分方程
y[k]-0.5y[k-1]=u[k],k?0
且已知初始状态 y[-1]=1,用递推法求解差分方程。
解:将差分方程写成 y[k]= u[k] +0.5y[k-1]
代入初始状态,可求得
y[0]=u[0]+0.5y[-1]=1+0.5× 1=1.5
类似地,依次迭代可得
y[1]=u[1]+0.5y[0]=1+0.5× 1.5=1.75
y[2]=u[2]+0.5y[1]=1+0.5× 1.75=1.875
等等
clc
clear,close all
u=[0,ones(1,20)];
y=zeros(1,21);
y(1)=1;
for n=2:length(y)
y(n)=u(n)+0.5*y(n-1);
end
stem(y)
6.14差分方程的通用递推程序
描述 LTI离散系统的差分方程为
a1y(n)+a2y(n-1)+…+a nay(n-na+1)=b1u(n-
1)+b2u(n-1)+…+b nbu(n-nb+1)
编写解上述方程的通用程序
解:
将原方程整理为
a1y(n) =b1u(n-1)+b2u(n-1)+…+b nbu(n-
nb+1)-[a2y(n-1)+…+a nay(n-na+1)]
令 us=[u(n),…u(n -nb+1)]
ys=[y(n-1),…,y(n -na+1)];
则上式变为
a(1)*y(n)=b*us’-a(2:na)*ys’
得 y(n)=(b*us’-a(2:na)*ys’)/a(1);
这样就可以利用递推法来求 y(n)了;
但是由于要用到初始条件,y(-1),y(-2),y(-3)… 。
但 Matlab中不能有负数的下标???
解决的办法,另外设置两个变量:
ym=[y01,y02…y];
um=[0,0,…u]
最后取出 y就可以了。
clc
clear,% close all
a=input('差分方程左端的系数向量
a=[a(1),a(2),...a(na)]=');%[1,0.1,0.15,-0.225]
b=input('差分方程右端的系数向量
b=[b(1),b(2),...b(nb)]=');%[3,7,1];
u=input('输入信号序列 u=');%exp(0.1*[1:20])
na=length(a);nb=length(b);nu=length(u);
%s=['起算点前 ',int2str(na-1),'点 y的值= [y(',int2str(na-
2),'),...,y(0)]=']
ym=zeros(1,na+nu-1);ym(1:na-1)=input('初始值
s=');%[0,0,0]
um=[0,zeros(1,na-1),u];%u以 n=0为起始点 zeros(1:na-
2),
for n=na:na+nu-1
ys=ym(n-1:-1:n-na+1); us=um(n:-1:n-
nb+1)
ym(n)=(b*us'-a(2:na)*ys')/a(1);
end
%把 ym时间坐标右移 na-1位,求出 y
y=ym(na:na+nu-1);stem(y),grid on
line([0,nu],[0,0])
例 6.5 求离散系统在各种输入下的响应
clc
clear,close all
disp('分题 1,初始条件响应 ')
subplot(1,3,1),q614
disp('分题 2,单位脉冲响应 ')
subplot(1,3,1),q614