运行结果如下:
符号函数
符号函数的定义为:
在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') %绘制波形
%'filled'定义点的形状,可通过help文件查询其它形状的描述
axis([k1,k2,0,1.5]) %定义坐标轴显示范围
运行结果如下:
如果要绘制移位的单位序列(k+k0)的波形,只要将以上程序略加修改即可,例如要绘制信号(k+2)的图形,可将以上程序改为:
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以前,信号赋值为0
uu=ones(1,nn); %在k=k0以后,信号赋值为1
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命令。
3.卷积积分
信号的卷积是数学上的一种积分运算,两个信号的卷积定义为:
信号的卷积运算在系统分析中主要用于求解系统的零状态响应。
一般情况,卷积积分的运算比较困难,但在MATLAB中则变得十分简单,MATLAB中是利用conv函数来实现卷积的。
功能:
实现两个函数
和
的卷积。
格式:
g=conv(f1,f2)
说明:
f1=f1(t),f2=f2(t) 表示两个函数,g=g(t)表示两个函数的卷积结果。
例题:
已知两信号
,
,求卷积
。
MATLAB程序如下:
t1=1:
0.01:
2;t2=2:
0.01:
3;
t3=3:
0.01:
5;%两信号卷积结果自变量t区间应为:
[两信号起始时刻之%和~两信号终止时刻之和]请自行推导该结论
f1=ones(size(t1));%高度为一的门函数,时间从t=1到t=2
f2=ones(size(t2)); %高度为一的门函数,时间从t=2到t=3
g=conv(f1,f2); %对f1和f2进行卷积
subplot(3,1,1),plot(t1,f1); %画f1的波形
subplot(3,1,2),plot(t2,f2); %画f2的波形
subplot(3,1,3),plot(t3,g); %grid on; 画g的波形
三、实验内容
1.分别用MATLAB的向量表示法和符号运算功能,表示并绘出下列连续时间信号的波形:
⑴
⑵
⑶
⑷
2.分别用MATLAB表示并绘出下列离散时间信号的波形:
⑴
⑵
⑶
⑷
3.已知信号f(t)的波形如下图所示,试用MATLAB绘出满足下列要求的信号波形。
⑴
⑵
⑶
(其中a的值分别为a=0.5和a=2)
⑷
4.已知两信号
,
,求卷积积分
,并与例题比较。
5.已知两信号
,
,求卷积积分
。
6.已知
,求两序列的卷积和。
四、预习要求
1.熟悉常见信号的意义、特性及用MATLAB软件表示的方法
2.熟悉用MATLAB软件绘制信号波形的方法
3.编写MATLAB程序
五、实验报告要求
1.简述实验目的及实验原理
2.抄写实验内容,写出程序清单
3.记录信号波形
4.实验总结(收获及体会)
实验三 连续时间信号的频域分析
一、 实验目的
1.熟悉傅里叶变换的性质
2.熟悉常见信号的傅里叶变换
3.了解傅里叶变换的MATLAB实现方法
二、 实验原理
傅里叶变换是信号分析的最重要的内容之一。
从已知信号
求出相应的频谱函数
的数学表示为:
的傅里叶变换存在的充分条件是
在无限区间内绝对可积,即
满足下式:
但上式并非傅里叶变换存在的必要条件。
在引入广义函数概念之后,使一些不满足绝对可积条件的函数也能进行傅里叶变换。
傅里叶反变换的定义为:
。
在这一部分的学习中,大家都体会到了这种数学运算的麻烦。
在MATLAB语言中有专门对信号进行正反傅里叶变换的语句,使得傅里叶变换很容易在MATLAB中实现。
在MATLAB中实现傅里叶变换的方法有两种,一种是利用MATLAB中的SymbolicMathToolbox提供的专用函数直接求解函数的傅里叶变换和傅里叶反变换,另一种是傅里叶变换的数值计算实现法。
下面分别介绍这两种实现方法的原理。
1.直接调用专用函数法
①在MATLAB中实现傅里叶变换的函数为:
F=fourier(f) 对f(t)进行傅里叶变换,其结果为F(w)
F=fourier(f,v) 对f(t)进行傅里叶变换,其结果为F(v)
F=fourier(f,u,v) 对f(u)进行傅里叶变换,其结果为F(v)
②傅里叶反变换
f=ifourier(F) 对F(w)进行傅里叶反变换,其结果为f(x)
f=ifourier(F,U) 对F(w)进行傅里叶反变换,其结果为f(u)
f=ifourier(F,v,u) 对F(v)进行傅里叶反变换,其结果为f(u)
由于MATLAB中函数类型非常丰富,要想了解函数的意义和用法,可以用mhelp命令。
如在命令窗口键入:
mhelpfourier回车,则会得到fourier的意义和用法。
注意:
(1)在调用函数fourier()及ifourier()之前,要用syms命令对所有需要用到的变量(如t,u,v,w)等进行说明,即要将这些变量说明成符号变量。
对fourier()中的f及ifourier()中的F也要用符号定义符sym将其说明为符号表达式。
(2)采用fourier()及fourier()得到的返回函数,仍然为符号表达式。
在对其作图时要用ezplot()函数,而不能用plot()函数。
(3)fourier()及fourier()函数的应用有很多局限性,如果在返回函数中含有δ(ω)等函数,则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'); %数据类型转换,转为分段函数,此处可以去掉
FFP=abs(FFw); %求振幅频谱|F(jw)|
ezplot(FFP,[-10*pi10*pi]);grid; %绘制函数图形,并加网格
axis([-10*pi10*pi02.2]) %限定坐标轴范围
运行结果:
Fw=exp(i*w)*(pi*Dirac(w)-i/w)-exp(-i*w)*(pi*Dirac(w)-i/w)
%Dirac(w)为δ(ω),即傅立叶变换结果中含有奇异函数,故绘图前需作函数类型转换
FFw=-i*exp(i*w)/w+i*exp(-i*w)/w%FFw为复数
FFP=abs(-i*exp(i*w)/w+i*exp(-i*w)/w)%求FFw的模值
例②求函数
的傅里叶反变换f(t)
MATLAB程序如下:
symstw %定义两个符号变量t,w
Fw=sym('1/(1+w^2)'); %定义频谱函数F(jw)
ft=ifourier(Fw,w,t); %对频谱函数F(jw)进行傅氏反变换
运行结果:
ft=
1/2*exp(-t)*Heaviside(t)+1/2*exp(t)*Heaviside(-t)
2、傅里叶变换的数值计算实现法
严格说来,如果不使用symbolic工具箱,是不能分析连续时间信号的。
采用数值计算方法实现连续时间信号的傅里叶变换,实质上只是借助于MATLAB的强大数值计算功能,特别是其强大的矩阵运算能力而进行的一种近似计算。
傅里叶变换的数值计算实现法的原理如下:
对于连续时间信号f(t),其傅里叶变换为:
其中τ为取样间隔,如果f(t)是时限信号,或者当|t|大于某个给定值时,f(t)的值已经衰减得很厉害,可以近似地看成是时限信号,则上式中的n取值就是有限的,假定为N,有:
若对频率变量ω进行取样,得:
通常取:
,其中
是要取的频率范围,或信号的频带宽度。
采用MATLAB实现上式时,其要点是要生成f(t)的N个样本值
的向量,以及向量
,两向量的内积(即两矩阵的乘积),结果即完成上式的傅里叶变换的数值计算。
注意:
时间取样间隔τ的确定,其依据是τ必须小于奈奎斯特(Nyquist)取样间隔。
如果f(t)不是严格的带限信号,则可以根据实际计算的精度要求来确定一个适当的频率
为信号的带宽。
例③用数值计算法实现上面门函数
的傅里叶变换,并画出幅度频谱图.
分析:
该信号的频谱为
,其第一个过零点频率为π,一般将此频率认为是信号的带宽。
但考虑到
的形状