信号与系统实验教程学生版文档格式.docx
《信号与系统实验教程学生版文档格式.docx》由会员分享,可在线阅读,更多相关《信号与系统实验教程学生版文档格式.docx(38页珍藏版)》请在冰豆网上搜索。
这里分别给出相应的简单的产生单位冲激信号和单位阶跃信号的扩展函数。
产生单位冲激信号的扩展函数为:
functiony=delta(t)
dt=0.01;
y=(u(t)-u(t-dt))/dt;
产生单位阶跃信号的扩展函数为:
%Unitstepfunction
functiony=u(t)
y=(t>
=0);
%y=1fort>
0,elsey=0
请将这二个MATLAB函数分别以delta和u为文件名保存在work文件夹中,以后,就可以像教材中的方法使用单位冲激信号δ(t)和单位阶跃信号u(t)。
2、离散时间单位阶跃信号u[n]定义为
1.2
离散时间单位阶跃信号u[n]除了也可以直接用前面给出的扩展函数来产生,还可以利用MATLAB内部函数ones(1,N)来实现。
这个函数类似于zeros(1,N),所不同的是它产生的矩阵的所有元素都为1。
值得注意的是,利用ones(1,N)来实现的单位阶跃序列并不是真正的单位阶跃序列,而是一个长度为N单位门(Gate)序列,也就是u[n]-u[n-N]。
但是在一个有限的图形窗口中,我们看到的还是一个单位阶跃序列。
3、信号的基本加法和乘法运算
信号f1与f2之和(瞬时和)是指同一瞬时两个信号之值对应相加所构成的“和信号”即f3=f1+f2;
信号f1与f2之积是指同一瞬时两信号之值对应相乘所构成的“积信号”即f3=f1*f2;
离散序列相加(或相乘)可采用对应样点的值分别相加(或相乘)的方法来计算。
用MATLAB程序仿真下面运算:
f1=sin(t),f2=sin(t),f3=f1+f2,f4=f1*f2;
x=[011111],h=[213411],y=x+h,g=x.*h;
连续信号加法乘法实现程序
%Program
t=0:
0.01:
4*pi;
f1=sin(t);
f2=sin(t);
f3=f1+f2;
f4=f1.*f2;
subplot(221);
plot(t,f1);
title('
f1signal'
);
subplot(222);
plot(t,f2);
f2signal'
subplot(223);
plot(t,f3);
f1+f2signal'
subplot(224);
plot(t,f4);
f1*f2signal'
运行后的结果:
图1-1程序运行结果图
离散序列加法乘法实现程序
x=[011111];
h=[213411];
y=x+h,g=x.*h;
stem(x);
xsignal'
stem(h);
hsignal'
stem(y);
x+hsignal'
stem(g);
x.*hsignal'
图1-2程序运行结果图
4、信号的时移
信号的时移可用下面的数学表达式来描述:
设一个连续时间信号为x(t),它的时移y(t)表示为:
y(t)=x(t-t0)1.3
其中,t0为位移量。
若t0为正数,则y(t)等于将x(t)右移t0秒之后的结果。
反之,若t0为负数,则y(t)等于将x(t)左移t0秒之后的结果。
在MATLAB中,时移运算与数学上习惯表达方法完全相同。
对给定一个连续时间信号x(t)=e-0.5tu(t),对它分别左移2秒钟和右移2秒钟得到信号x1(t)=e-0.5(t+2)u(t+2)和x2(t)=e-0.5(t-2)u(t-2)。
实现程序:
%Program
clear,closeall,
t=-5:
5;
x=exp(-0.5*t).*u(t);
%Generatetheoriginalsignalx(t)
x1=exp(-0.5*(t+2)).*u(t+2);
%Shiftx(t)totheleftby2secondtogetx1(t)
x2=exp(-0.5*(t-2)).*u(t-2);
%Shiftx(t)totherightby2secondtogetx2(t)
subplot(311)
plot(t,x)%Plotx(t)
gridon,
title('
x=exp(-0.5*t).*u(t)'
)
subplot(312)
plot(t,x1)%Plotx1(t)
x1=exp(-0.5*(t+2)).*u(t+2)'
subplot(313)
plot(t,x2)%Plotx2(t)
x2=exp(-0.5*(t-2)).*u(t-2)'
xlabel('
Timet(sec)'
程序运行结果:
图1-3程序运行结果图
注意:
在运行上面的程序时,一定在所在的路径下创建u(t)的子函数:
保存名为u.m
5、信号的时域翻转
对一个信号x[n]的翻转运算在数学上表示为
y[n]=x[-n]1.4
这种翻转运算,用MATLAB实现起来也是非常简单的。
有多种方法可以实现信号的翻转运算。
方法一,修改绘图函数plot(t,x)和stem(n,x)中的时间变量t和n,即用-t和-n替代原来的t和n,这样绘制出来的图形,看起来就是原信号经时域翻转后的版本。
方法二,直接利用原信号与其翻转信号的数学关系式来实现。
这种方法最符合信号翻转运算的实际意义。
方法三,使用MATLAB内部函数fliplr()来实现信号的翻转运算。
其用法如下:
y=fliplr(x):
其中x为原信号x(t)或x[n],而y则为x的时域翻转。
需要说明的是,函数fliplr()对信号作时域翻转,仅仅将信号中各个元素的次序作了一个反转,这种反转处理是独立于时间变量t和n的。
因此,如果信号与其时间变量能够用一个数学函数来表达的话,那么建议将时间变量t和n的范围指定在一个正负对称的时间区间即可。
分别编写程序实现m=sin(t);
n=sin(-t);
x[n]=[1234];
x[-n],分析所画信号波形,
程序如下:
t=0:
n=0:
1:
3;
m=sin(t);
x=[1234];
plot(t,m);
sin(t)signal'
plot(-t,m);
sin(-t)signal'
stem(n,x);
x[n]signal'
stem(-n,x);
x[-n]signal'
图1-4程序运行结果图
6、信号的时域尺度变换
信号x(t)的时域尺度变换在数学描述为
y(t)=x(at),1.5
其中a为任意常数。
根据a的不同取值,这种时域尺度变换对信号x(t)具有非常不同的影响。
当a=1时,y(t)=x(t);
当a=-1时,y(t)=x(-t),即y(t)可以通过将x(t)翻转运算而得到;
当a>
1时,y(t)=x(at),y(t)是将x(t)在时间轴上的压缩而得到;
当0<
a<
1时,y(t)=x(at),y(t)是将x(t)在时间轴上的扩展而得到;
当-1<
0时,y(t)=x(at),y(t)是将x(t)在时间轴上的扩展同时翻转而得到;
当a<
-1时,y(t)=x(at),y(t)是将x(t)在时间轴上的压缩同时翻转而得到;
由此可见,信号的时域尺度变换,除了对信号进行时域压缩或扩展外,还可能包括对信号的时域翻转运算。
实际上,MATLAB完成式1.5的运算,并不需要特殊的处理,按照数学上的常规方法即能完成。
编写程序实现m=sin(t);
n=sin(2t);
x[(-1/2)n],分析所画信号波形
%sin(2t)通过改变图形的压缩从sin(t)得来,x[(-1/2)n]通过展坐标轴从x[n]得来。
k=2*t;
g=(-2)*n;
s=sin(k);
plot(t,s);
sin(2t)signal'
stem(g,x);
x[(-1/2)n]signal'
图1-5程序运行结果图
7、周期信号
在《信号与系统》课程中,周期信号是一类非常重要的信号。
给定一个信号x(t)或x[n],如果满足
x(t)=x(t+kT)1.6
x[n]=x[n+kN]1.7
则该信号叫做周期信号。
其中,k为任意整数,T和N为常数,通常称为信号的基本周期或最小周期。
周期信号可以看作是一个时限的非周期信号经过周期延拓之后形成的。
在数字信号处理中,周期延拓这一信号处理方法非常重要。
下面的程序段,就是将一个非周期信号x1(t)=e-2t[u(t)-u(t-2)]经过周期延拓之后而得到一个周期信号。
程序如下:
clear,closeall;
t=-4:
0.001:
4;
T=2;
x=0;
y=exp(-2*t).*(u(t)-u(t-2));
fork=-2:
2;
x=x+exp(-2*(t-k*T)).*(u(t-k*T)-u(t-(k+1)*T));
end;
subplot(211);
plot(t,y);
e-2t[u(t)-u(t-2)]signal'
subplot(212)
plot(t,x);
e-2t[u(t)-u(t-2)]延拓后的波形'
程序运行结果:
图1-6程序运行结果图
仔细阅读该程序,可以发现其算法就是:
1.8
由于k无法计算到无穷,而是以有限值加以替代,反映到有限宽度图形窗口中得到的效果完全符合要求。
8、卷积的计算
卷积的计算通常可按下面的五个步骤进行(以卷积积分为例):
1.该换两个信号波形图中的横坐标,由t改为τ,τ变成函数的自变量;
2.把其中一个信号翻转,如把h(τ)变成h(-τ);
3.把翻转后的信号做移位,移位量是t,这样t是一个参变量。
在τ坐标系中,t>
0时图形右移,t<
0时图形左移。
4.计算两个信号重叠部分的乘积x(τ)h(t-τ);
5.完成相乘后图形的积分。
对于两个时限信号(Time-limitedsignal),按照上述的五个步骤,作卷积积分运算时,关键是正确确定不同情况下的积分限。
只要正确地确定了积分限都能得到正确定积分结果。
尽管如此,在时域中计算卷积积分,总体上来说是一项比较困难的工作。
程序convlution_demo用来演示上述作卷积积分运算的五个步骤。
本程序较为复杂,不建议读者读懂该程序,只需执行这个程序,观看程序执行过程中有关卷积积分的运算过程,以便于理解这五个步骤。
借助MATLAB的内部函数conv()可以很容易地完成两个信号的卷积积分运算。
其语法为:
y=conv(x,h)。
其中x和h分别是两个作卷积运算的信号,y为卷积结果。
为了正确地运用这个函数计算卷积,这里有必要对conv(x,h)做一个详细说明。
conv(x,h)函数实际上是完成两个多项式的乘法运算。
例如,两个多项式p1和p2分别为:
和
这两个多项式在MATLAB中是用它们的系数构成一个行向量来表示的,如果用x来表示多项式p1,h表示多项式p2,则x和h分别为
x=[1234]
h=[4321]
在MATLAB命令窗口依次键入
>
x=[1234];
h=[4321];
y=conv(x,h)
在屏幕上得到显示结果:
y=411203020114
这表明,多项式p1和p2的乘积为:
正如前所述,用MATLAB处理连续时间信号时,独立时间变量t的变化步长应该是很小的,假定用符号dt表示时间变化步长,那么,用函数conv()作两个信号的卷积积分时,应该在这个函数之前乘以时间步长方能得到正确的结果。
也就是说,正确的语句形式应为:
y=dt*conv(x,h)。
对于定义在不同时间段的两个时限信号x(t),t0≤t≤t1,和h(t),t2≤t≤t3。
如果用y(t)来表示它们的卷积结果,则y(t)的持续时间范围要比x(t)或h(t)要长,其时间范围为t0+t2≤t≤t1+t3。
这个特点很重要,利用这个特点,在处理信号在时间上的位置时,可以很容易地将信号的函数值与时间轴的位置和长度关系保持一致性。
根据给定的两个连续时间信号x(t)=t[u(t)-u(t-1)]和h(t)=u(t)-u(t-1),编写程序,完成这两个信号的卷积运算,并绘制它们的波形图。
范例程序如下:
t0=-2;
t1=4;
dt=0.01;
t=t0:
dt:
t1;
x=u(t)-u(t-1);
h=t.*(u(t)-u(t-1));
y=dt*conv(x,h);
%Computetheconvolutionofx(t)andh(t)
subplot(221)
plot(t,x),gridon,title('
Signalx(t)'
),axis([t0,t1,-0.2,1.2])
subplot(222)
plot(t,h),gridon,title('
Signalh(t)'
t=2*t0:
2*t1;
%Againspecifythetimerangetobesuitabletothe
%convolutionofxandh.
plot(t,y),gridon,title('
Theconvolutionofx(t)andh(t)'
),axis([2*t0,2*t1,-0.1,0.6]),
xlabel('
Timetsec'
程序运行结果
图1-7程序运行结果图
在有些时候,做卷积和运算的两个序列中,可能有一个序列或者两个序列都非常长,甚至是无限长,MATLAB处理这样的序列时,总是把它看作是一个有限长序列,具体长度由编程者确定。
实际上,在信号与系统分析中所遇到的无限长序列,通常都是满足绝对可和或绝对可积条件的信号。
因此,对信号采取这种截短处理尽管存在误差,但是通过选择合理的信号长度,这种误差是能够减小到可以接受的程度的。
若这样的一个无限长序列可以用一个数学表达式表示的话,那么,它的长度可以由编程者通过指定时间变量n的范围来确定。
例如,对于一个单边实指数序列x[n]=0.5nu[n],通过指定n的范围为0≤n≤100,则对应的x[n]的长度为101点,虽然指定更宽的n的范围,x[n]将与实际情况更相符合,但是,注意到,当n大于某一数时,x[n]之值已经非常接近于0了。
对于序列x[n]=0.5nu[n],当n=7时,x[7]=0.0078,这已经是非常小了。
所以,对于这个单边实指数序列,指定更长的n的范围是没有必要的。
当然,不同的无限长序列具有不同的特殊性,在指定n的范围时,只要能够反映序列的主要特征就可以了。
9、关于MATLAB工具在信号处理中应用的补充
在绘制信号的波形图时,有时我们需要将若干个图形绘制在图一个图形窗口中,这就需要使用MATLAB的图形分割函数subplot(),其用法是在绘图函数stem或plot之前,使用图形分割函数subplot(n1,n2,n3),其中的参数n1,n2和n3的含义是,该函数将把一个图形窗口分割成n1xn2个子图,即将绘制的图形将绘制在第n3个子图中。
常用的图形控制函数axis([xmin,xmax,ymin,ymax]):
图型显示区域控制函数,其中xmin为横轴的显示起点,xmax为横轴的显示终点,ymin为纵轴的显示起点,ymax为纵轴的显示终点。
有时,为了使图形具有可读性,需要在所绘制的图形中,加上一些网格线来反映信号的幅度大小。
MATLAB中的gridon/gridoff可以实现在你的图形中加网格线。
gridon:
在图形中加网格线。
gridoff:
取消图形中的网格线。
x=input(‘Typeinsignalx(t)inclosedform:
’)
三、实验内容及步骤
实验前,必须首先阅读本实验原理,读懂所给出的全部范例程序。
实验开始时,先在计算机上运行这些范例程序,观察所得到的信号的波形图。
并结合范例程序应该完成的工作,进一步分析程序中各个语句的作用,从而真正理解这些程序。
实验前,一定要针对下面的实验项目做好相应的实验准备工作,包括事先编写好相应的实验程序等事项。
练习1:
结合编写的阶跃函数编写一门函数(门宽为4幅度为1)写出程序并会出门函数信号的波形;
练习2:
结合实验原理的信号的基本运算的程序,编写程序绘制m=sin(t);
g=sin(2t-pi/2);
x[n]=[12563];
x[(1/2)n-1];
的四个信号的波形,并分析图形的变换过程。
练习3:
根据周期函数的定义以及实验原理中延拓的方法实现脉冲函数(脉冲宽度1周期2幅度1)并绘制其图形;
练习4:
利用MATLAB内部所带的卷积工具对两个门函数进行卷积,分别绘制出两个门函数和卷积后的波形,并分析门函数卷积的规律,
(一个门函数门宽为1幅度1另一个门函数门宽为2幅度为1,进行两者卷积)
四、实验报告要求
1、按要求完整书写你所编写的全部MATLAB程序
2、详细记录实验过程中的有关信号波形图(存于自带的U盘中),图形要有明确的标题。
全部的MATLAB图形应该用打印机打印,然后贴在本实验报告中的相应位置,禁止复印件。
3、实事求是地回答相关问题,严禁抄袭。
实验二周期信号的傅里叶级数及Gibbs现象
1、掌握连续时间周期信号的傅里叶级数的物理意义和分析方法;
2、观察截短傅里叶级数而产生的“Gibbs现象”,了解其特点以及产生的原因;
3、掌握连续周期时间信号傅里叶变换的分析方法及其物理意义;
二、实验原理及方法
1、连续时间周期信号的傅里叶级数CTFS分析
任何一个周期为T1的正弦周期信号,只要满足狄利克利条件,就可以展开成傅里叶级数。
其中三角傅里叶级数为:
2.1
或:
2.2
其中
,称为信号的基本频率(Fundamentalfrequency),
分别是信号
的直流分量、余弦分量幅度和正弦分量幅度,
为合并同频率项之后各正弦谐波分量的幅度和初相位,它们都是频率
的函数,绘制出它们与
之间的图像,称为信号的频谱图(简称“频谱”),
-
图像为幅度谱,
图像为相位谱。
三角形式傅里叶级数表明,如果一个周期信号x(t),满足狄里克利条件,那么,它就可以被看作是由很多不同频率的互为谐波关系(harmonicallyrelated)的正弦信号所组成,其中每一个不同频率的正弦信号称为正弦谐波分量(Sinusoidcomponent),其幅度(amplitude)为
。
也可以反过来理解三角傅里叶级数:
用无限多个正弦谐波分量可以合成一个任意的非正弦周期信号。
指数形式的傅里叶级数为:
2.3
其中,
为指数形式的傅里叶级数的系数,按如下公式计算:
2.4
指数形式的傅里叶级数告诉我们,如果一个周期信号x(t),满足狄里克利条件,那么,它就可以被看作是由很多不同频率的互为谐波关系(harmonicallyrelated)的周期复指数信号所组成,其中每一个不同频率的周期复指数信号称为基本频率分量,其复幅度(complexamplitude)为
这里“复幅度(complexamplitude)”指的是
通常是复数。
上面的傅里叶级数的合成式说明,我们可以用无穷多个不同频率的周期复指数信号来合成任意一个周期信号。
然而,用计算机(或任何其它设备)合成一个周期信号,显然不可能做到用无限多个谐波来合成,只能取这些有限个谐波分量来近似合成。
假设谐波项数为N,则上面的和成式为:
2.5
显然,N越大,所选项数越多,有限项级数合成的结果越逼近原信号x(t)。
本实验可以比较直观地了解傅里叶级数的物理意义,并观察到级数中各频率分量对波形的影响包括“Gibbs”现象:
即信号在不连续点附近存在一个幅度大约为9%的过冲,且所选谐波次数越多,过冲点越向不连续点靠近。
这一现象在观察周期矩形波信号和周期锯齿波信号时可以看得很清楚。
例题1、给定一个周期为T1=2s的连续时间周期方波信号,如图所示,其一个周期内的数学表达式为: