运行结果如下:
● 符号函数
符号函数的定义为:
在MATLAB中有专门用于表示符号函数的函数sign(),由于单位阶跃信号ε(t)和符号函数两者之间存在以下关系:
,因此,利用这个函数就可以很容易地生成单位阶跃信号。
下面举个例子来说明如何利用sign()函数生成单位阶跃信号,并同时绘制其波形。
举例:
利用sign()函数生成单位阶跃信号,并分别绘出两者的波形
MATLAB程序如下:
t=-5:
0.01:
5; %定义自变量取值范围及间隔,生成行向量t
f=sign(t); %定义符号信号表达式,生成行向量f
figure
(1); %打开图形窗口1
plot(t,f), %绘制符号函数的波形
axis([-5,5,-1.5,1.5]) %定义坐标轴显示范围
s=1/2+1/2*f; %生成单位阶跃信号
figure
(2); %打开图形窗口2
plot(t,s),
axis([-5,5,-0.5,1.5]) %定义坐标轴显示范围
运行结果如下:
2、离散时间信号
离散时间信号又叫离散时间序列,一般用
表示,其中变量k为整数,代表离散的采样时间点(采样次数)。
在MATLAB中,离散信号的表示方法与连续信号不同,它无法用符号运算法来表示,而只能采用数值计算法表示,由于MATLAB中元素的个数是有限的,因此,MATLAB无法表示无限序列;另外,在绘制离散信号时必须使用专门绘制离散数据的命令,即stem()函数,而不能用plot()函数。
下面通过一些常用离散信号来说明如何用MATLAB来实现离散信号的表示,以及可视化。
● 单位序列δ(k)
单位序列δ(k)的定义为
下面是用MATLAB绘制单位序列δ(k)的MATLAB程序:
k1=-5;k2=5; %定义自变量的取值范围
k=k1:
k2; %定义自变量的取值范围及取样间隔(默认为1),并生成行向量
n=length(k); %取向量的维数
f=zeros(1,n); %生成与向量k的维数相同的零矩阵,给函数赋值
f(1,6)=1; %在k=0时刻,信号赋值为1
stem(k,f,'filled') %绘制波形
axis([k1,k2,0,1.5]) %定义坐标轴显示范围
运行结果如下:
如果要绘制移位的单位序列δ(k+k0)的波形,只要将以上程序略加修改即可,例如要绘制信号δ(k+3)的图形,可将以上程序改为:
k1=-5;k2=5; %定义自变量的取值范围
k0=3; %定义平移量
k=k1:
k2; %定义自变量的取值范围及取样间隔(默认为1),并生成行向量
n=length(k); %取向量的维数
f=zeros(1,n); %生成与向量k的维数相同的零矩阵,给函数赋值
f(1,-k0-k1+1)=1; %在k=k0时刻,信号赋值为1
stem(k,f,'filled') %绘制波形
axis([k1,k2,0,1.5]) %定义坐标轴显示范围
● 单位阶跃序列ε(k)
单位阶跃序列ε(k)的定义为
下面是绘制单位阶跃序列ε(k+k0)的MATLAB程序:
k1=-3;k2=10;
k0=0;
k=k1:
-k0-1;
kk=-k0:
k2;
n=length(k); %取k=k0点以前向量的维数
nn=length(kk); %取k=k0点以后(含k=k0点)向量的维数
u=zeros(1,n); %在k=k0以前,信号赋值为零
uu=ones(1,nn); %在k=k0以后,信号赋值为一
stem(k,u,'filled') %绘制k=k0以前信号的波形
holdon %保持图形窗口,以便绘制多个图形
stem(kk,uu,'filled') %绘制k=k0以后(含k=k0点)信号的波形
holdoff %图形窗口解冻
axis([k1,k2,0,1.5]) %设置坐标轴显示范围
运行结果如下:
注意:
以上介绍了几个常用的绘图命令:
plot,ezplot,stairs,stem,其中,绘制连续信号得到光滑的曲线时用plot命令;显示连续信号中的不连续点时用stairs命令较好;绘制离散信号波形用stem命令;当绘制用MATLAB符号表达式表达的信号时要用ezplot命令。
三、 实验内容
1、 分别用MATLAB的向量表示法和符号运算功能,表示并绘出下列连续时间信号的波形:
⑴
⑵
⑶
⑷
2、 分别用MATLAB表示并绘出下列离散时间信号的波形:
⑴
⑵
⑶
⑷
3、 已知信号f(t)的波形如下图所示,试用MATLAB绘出满足下列要求的信号波形。
⑴
⑵
⑶
(其中a的值分别为a=0.5和a=2)
四、 预习要求
1、 熟悉常见信号的意义、特性及用MATLAB软件表示的方法
2、 熟悉用MATLAB软件绘制信号波形的方法
3、编写MATLAB程序
五、实验报告要求
1、 简述实验目的及实验原理
2、 写出程序清单
3、 记录信号波形
4、收获与建议
实验二 连续时间信号的卷积积分
一、实验目的
1. 熟悉卷积积分的定义和性质
2. 了解卷积积分在系统分析中的应用
3. 熟悉用MATLAB实现卷积的方法
二、实验原理
信号的卷积是数学上的一种积分运算,两个信号的卷积定义为:
信号的卷积运算在系统分析中主要用于求解系统的零状态响应。
一般情况,卷积积分的运算比较困难,但在MATLAB中则变得十分简单,MATLAB中是利用conv函数来实现卷积的。
功能:
实现二个函数
和
的卷积。
格式:
g=conv(f1,f2)
说明:
f1=f1(t),f2=f2(t) 表示二个函数,g=g(t)表示两个函数的卷积结果。
例题:
已知两信号
,
,求卷积
。
MATLAB程序如下:
t1=1:
0.01:
2;
f1=ones(size(t1)); %高度为一的门函数,时间从t=1到t=2
t2=2:
0.01:
3;
f2=ones(size(t2)); %高度为一的门函数,时间从t=2到t=3
g=conv(f1,f2); %对f1和f2进行卷积
t3=3:
0.01:
5;
subplot(311);
plot(t1,f1);
subplot(312)
plot(t2,f2);
subplot(313)
plot(t3,g)
2.2实现卷积
,其中:
m21.m
p=0.01;%取样时间间隔
nf=0:
p:
1;%f(t)对应的时间向量
f=2*((nf>=0)-(nf>=1));%序列f(n)的值
nh=0:
p:
2;%h(t)对应的时间向量
h=(nh>=0)-(nh>=2);%序列h(n)的值
[y,k]=sconv(f,h,nf,nh,p);%计算y(t)=f(t)*h(t)
subplot(3,1,1),stairs(nf,f);%绘制f(t)的波形
title('f(t)');axis([0302.1]);
subplot(3,1,2),stairs(nh,h);%绘制h(t)的波形
title('h(t)');axis([0301.1]);
subplot(3,1,3),plot(k,y);%绘制y(t)=f(t)*h(t)的波形
title('y(t)=f(t)*h(t)');axis([0302.1]);
子程序sconv.m
%此函数用于计算连续信号的卷积y(t)=f(t)*h(t)
function[y,k]=sconv(f,h,nf,nh,p)
%y:
卷积积分y(t)对应的非零样值向量
%k:
y(t)对应的时间向量
%f:
f(t)对应的非零样值向量
%nf:
f(t)对应的时间向量
%h:
h(t)对应的非零样值向量
%nh:
h(t)对应的时间向量
%p:
取样时间间隔
y=conv(f,h);%计算序列f(n)与h(n)的卷积和y(n)
y=y*p;%y(n)变成y(t)
left=nf
(1)+nh
(1)%计算序列y(n)非零样值的起点位置
right=length(nf)+length(nh)-2%计算序列y(n)非零样值的终点位置
k=p*(left:
right);%确定卷积和y(n)非零样值的时间向量
2.3实现卷积
,其中:
m22.m
p=0.01;%取样时间间隔
nf=0:
p:
2;%f(t)对应的时间向量
f=2*((nf>=0)-(nf>=2));%序列f(n)的值
nh=0:
p:
4;%h(t)对应的时间向量
h=exp(-nh);%序列h(n)的值
[y,k]=sconv(f,h,nf,nh,p);%计算y(t)=f(t)*h(t)
subplot(3,1,1),stairs(nf,f);%绘制f(t)的波形
title('f(t)');axis([0602.1]);
subplot(3,1,2),plot(nh,h);%绘制h(t)的波形
title('h(t)');axis([0601.1]);
subplot(3,1,3),plot(k,y);%绘制y(t)=f(t)*h(t)的波形
title('y(t)=f(t)*h(t)');axis([0602.1]);
运行结果:
三、实验内容
1.已知两信号
,
,求卷积
,并与例题比较。
2.已知两信号
,
,求卷积
。
四、实验报告要求
1. 简述实验目的和原理。
4. 记录实验结果。
2. 理论上计算信号的卷积积分。
5.收获与建议
3. 写出程序清单。
实验三 连续时间信号的频域分析
一、 实验目的
1. 熟悉傅里叶变换的性质
2. 熟悉常见信号的傅里叶变换
3. 了解傅里叶变换的MATLAB实现方法
二、 实验原理
傅里叶变换是信号分析的最重要的内容之一。
从已知信号
求出相应的频谱函数
的数学表示为:
的傅里叶变换存在的充分条件是
在无限区间内绝对可积,即
满足下式:
但上式并非傅里叶变换存在的必要条件。
在引入广义函数概念之后,使一些不满足绝对可积条件的函数也能进行傅里叶变换。
傅里叶反变换的定义为:
。
在这一部分的学习中,大家都体会到了这种数学运算的麻烦。
在MATLAB语言中有专门对信号进行正反傅里叶变换的语句,使得傅里叶变换很容易在MATLAB中实现。
在MATLAB中实现傅里叶变换的方法有两种,一种是利用MATLAB中的SymbolicMathToolbox提供的专用函数直接求解函数的傅里叶变换和傅里叶反变换,另一种是傅里叶变换的数值计算实现法。
下面分别介绍这两种实现方法的原理。
1、直接调用专用函数法
①在MATLAB中实现傅里叶变换的函数为:
● F=fourier(f) 对f(t)进行傅里叶变换,其结果为F(w)
②傅里叶反变换
● f=ifourier(F) 对F(w)进行傅里叶反变换,其结果为f(x)
由于MATLAB中函数类型非常丰富,要想了解函数的意义和用法,可以用mhelp命令。
如在命令窗口键入:
mhelpfourier回车,则会得到fourier的意义和用法。
注意:
(1)在调用函数fourier()及ifourier()之前,要用syms命令对所有需要用到的变量(如t,u,v,w)等进行说明,即要将这些变量说明成符号变量。
对fourier()中的f及ifourier()中的F也要用符号定义符sym将其说明为符号表达式。
(2)采用fourier()及fourier()得到的返回函数,仍然为符号表达式。
在对其作图时要用ezplot()函数,而不能用plot()函数。
(3)fourier()及ifourier()函数的应用有很多局限性,如果在返回函数中含有δ(ω)等函数,则ezplot()函数也无法作出图来。
另外,在用fourier()函数对某些信号进行变换时,其返回函数如果包含一些不能直接表达的式子,则此时当然也就无法作图了。
这是fourier()函数的一个局限。
另一个局限是在很多场合,尽管原时间信号f(t)是连续的,但却不能表示成符号表达式,此时只能应用下面介绍的数值计算法来进行傅氏变换了,当然,大多数情况下,用数值计算法所求的频谱函数只是一种近似值。
例①:
求门函数
的傅里叶变换,并画出幅度频谱图
MATLAB程序如下:
symstw %定义两个符号变量t,w
Gt=sym('Heaviside(t+1)-Heaviside(t-1)'); %产生门宽为2的门函数
Fw=fourier(Gt,t,w); %对门函数作傅氏变换求F(jw)
FFw=maple('convert',Fw,'piecewise'); %数据类型转换,调用函数convert,将Fw转换为‘piecewise’
FFP=abs(FFw); %求振幅频谱|F(jw)|
ezplot(FFP,[-10*pi10*pi]);grid; %绘制函数图形,并加网格
axis([-10*pi10*pi02.2]) %限定坐标轴范围
运行结果:
例②:
求函数
的傅里叶反变换f(t)
MATLAB程序如下:
symstw