信号与系统实验指导书.docx
《信号与系统实验指导书.docx》由会员分享,可在线阅读,更多相关《信号与系统实验指导书.docx(16页珍藏版)》请在冰豆网上搜索。
![信号与系统实验指导书.docx](https://file1.bdocx.com/fileroot1/2022-12/13/e8b8ee0b-7a45-4dbd-b1bf-aaddc11eae89/e8b8ee0b-7a45-4dbd-b1bf-aaddc11eae891.gif)
信号与系统实验指导书
信号与系统
实验指导书
合肥工业大学电物学院电子科学与技术系
MATLAB简介
MATLAB是MATHWORKS公司推出的一套高性能的数值计算与可视化软件,它集数值分析,矩阵运算,信号处理和图形显示于一体,构成了一个方便的、界面友好的用户环境。
其强大的扩展功能为各个领域的应用提供了基础。
由各个领域的专家学者相继推出了MATLAB工具箱,其中主要有信号处理(signalprocessing),控制系统(controlsystem),神经网络(neuralnetwork),图像处理(imageprocessing),鲁棒辨识(systemidentification),最优化(optimisation),
分析与综合(
analysisandsynthesis),模糊逻辑(fuzzylogic),小波(wavelet),样条(spline)等工具箱。
可以毫不夸张的说,如果您以后想在信号处理、控制、信息学方面有所发展,那么您就必须应该首先接触MATLAB这一“巨人肩上的工具”。
在此,请同学们认真学习以下内容。
1、基本操作简介
单击桌面上的MATLAB快捷方式即可打开如下的操作界面。
左下角的是CommangHistory窗口,记录了曾经输入的命令,可以方便的查询或复制曾经输入的命令。
右边的是CommandWindow,用于命令输入和运行,我们运行程序和观察结果都在此窗口中。
1.1简单的数学运算
使用MATLAB进行简单的数学运算如同在计算器上的操作一样。
如:
要计算:
4+3;
只要在MATLAB命令窗口内输入>>4+3(回车),便会得到答案:
ans=7
1.2变量定义:
MATLAB中变量的命名规则如下:
变量名必须以字母开头,之后可以是任意字母、数字或下划线;变量名是大小写敏感的,变量A和a是不一样的;变量名不能超过19个字符,第19个字符以后的字符将被忽略。
举例,输入>>a=4(回车),就定义了一个变量a,并赋以初值4。
MATLAB中还包括一些特殊的变量:
如ans(MATLAB中默认变量)、pi(圆周率)、inf(无穷大)、i或j(复数中的虚数单位)……
1.3注释和标点
%后的语句为注释语句。
“;”放在语句之后,表示不出现运行结果。
如:
输入>>a=4+3;(回车),系统命令窗口不会出现结果。
如果去掉“;”系统会给出答案:
a=7。
1.4复数的定义:
举例>>a=1+2*i
1.5数学函数
MATLAB所支持的部分常用函数在下面列出,其中的大部分可以数学方式书写。
举例:
输入>>x=sqrt
(2)/2(回车)
系统给出结果x=
0.7071
此命令得到
的值,注意:
MATLAB只对弧度操作。
本实验中可能用到的MATLAB的基本信号函数:
sin
正弦
Cot
余切
acot
反余切
log
自然对数
csc
余割
Asin
反正弦
exp
E为底的指数
log2
2为底的对数
cos
余弦
acos
反余弦
log10
10为底的对数
sqrt
平方根
tan
正切
atan
反正切
pow2
2的幂
abs
绝对值
1.6取整函数:
在运算中经常要遇到将浮点数或分数截断变成整数的问题。
MATLAB提供了几种不同的函数,实现这种截断问题,要注意其区分。
fix(x):
是取浮点数的整数部分;
floor(x);是向下截断,取比x小的最近整数;
ceil(x):
是向上截断,取比x大的最近整数;
round(x);是取最近的整数,如小数部分为0.5则取离0远的最近的整数;
frac(x):
则是取分数的真分数部分(不能用于浮点数)。
例如:
x=sym(-5/2)
则fix(x)floor(x)round(x)ceil(x)frac(x)分别为
-2-3-3-2-1/2
2数组的定义和运算
数组运算主要是针对多个数执行同样的计算而运用的。
在MATLAB中,以一种非常直观的方式来处理数组。
2.1数组的定义:
(1)直接定义:
例如>>n=[12345]
n=
12345
(2)利用first:
increment:
last来创建数组。
表示创建一个从first开始,每个元素间隔incerment,直到last的数组。
例如>>t1=-0.5;dt=0.001;t2=7;
>>t=t1:
dt:
t2;
定义了一个变量t数组。
在我们的实验中,自变量都是这样的方式来定义的。
当increment缺省时,默认为1。
例如>>n=1:
5定义了数组[12345]。
(3)利用linespace创建数组
格式:
linespace(first_value,last_value,number)
创建一个以first_value开始,以last_value结束,包含有number个数据元素的数组。
(4)利用logspace创建一个对数分割的数组
格式:
logspace(first_value,last_value,number)
创建一个以10first_value开始,以10last_value结束,包含有number个数据元素的数组。
2.2数组与标量的四则运算:
数组与标量的四则运算格式与标量间运算类似,它是将数组中的每个元素与标量进行加、减、乘、除运算,但除法运算时标量只能作除数。
例如>>rectRC=rectRC+sin((2*k+1)*t-atan((2*k+1)*RC))/((2*k+1)*sqrt(1+((2*k+1)*RC)^2));
表示:
,其中
。
上面的运算中,t是一个数组,其它都是标量。
2.3数组间的四则运算:
数组间进行四则运算时,要求参与运算的数组必须具有相同的维数。
加、减、乘、是按元素与元素的方式进行的。
加减运算与标量运算相同,但乘除运算的符号则是“.*”和“./”或“.\”(两种除号的关系是a./b=b.\a)。
例如>>a=[134];
>>b=[231];
>>c=a.*b
c=
294
例如>>x=0.02*(1+0.4*cos(60*pi*t))./(0.0001+t.^2);
表示
因为分子分母都是数组,所以使用“./”。
2.4数组的幂运算:
数组的幂运算符号为“.^”,表示每个元素分别进行幂运算。
例如>>a=[134];
>>c=a.^2
c=
1916
2.5数组的函数运算:
数组的函数运算也是对每个元素分别进行函数运算。
对标量适用的函数对数组也同样适用。
2.6向量运算:
当数组作为向量进行运算时,有点乘、叉乘和混合积运算。
点乘使用函数dot(A,B)来实现,叉乘使用函数cross(A,B)来实现,混合积则通过组合点乘和叉乘来实现。
3、矩阵运算
MATLAB名字由MATrix和LABoratory两词的前三个字母组合而成。
这是因为MATLAB是以矩阵运算为基础的一种语言,其所有的运算都是基于矩阵的。
前面说的数组也就是一个1×n的矩阵。
例如>>a=[135];
>>size(a)
ans=
13
>>size(a,2)
ans=
3
3.1矩阵的定义:
矩阵的定义方法与数组相同,只不过不同行之间需要用分号或回车隔开。
举个例子:
矩阵
,它的MATLAB定义方法为>>a=[123;456;789](回车),您就可以看到这个矩阵了。
(也可使用>>a=[1:
1:
3;4:
1:
6;7:
1:
9]或者>>a=[1:
3;4:
6;7:
9])
矩阵的另一个生成方法是使用MatrixEditor工具,主要用于生成大型矩阵。
3.2矩阵与标量的四则运算与数组相同。
3.3矩阵间的四则运算
矩阵间的加减与数组相同。
矩阵间的乘除分为两种:
一是与数组运算相同,采用按元素运算的方法。
此时要求两个矩阵的大小完全相同,运算符采用“.*”和“.^”以及“./”或“.\”。
二是按线性代数的方法运算。
此时要求进行相乘的两矩阵要有相同的公共维。
矩阵乘法符号是“*”。
矩阵的除法符号是“/”或“\”,用于寻找使Ax=b的解。
举例:
a.^
又例如
3.4本实验需用到的矩阵相关函数:
(1)zeros(n):
产生一个n×n的零矩阵;
zeros(1,n):
产生一个长度为n的零数组;
zeros(size(X))(X为一数组):
产生一与X等长的零数组。
(2)sum(A):
若A为数组,则对数组中所有元素求和;若A为矩阵,则对矩阵按列求和,返回比A维数低1的矩阵。
(3)size(X):
返回矩阵的维数。
数组被看作1×n矩阵。
所以要将数组X的长度赋给整数N时应使用size(X,2)。
例:
>>x=[123;456];>>y=[13579];
>>size(x)ans=23
>>a=size(y)a=15
>>b=size(y,2)b=5
(4)[XY]=meshgrid(x,y):
用x和y数组构造矩阵X和Y。
X的每行都是数组x,列数与数组y的大小相同。
Y的每行都是数组y,列数与数组x的大小相同。
4、信号的MATLAB表示
众所周知,计算机只能处理数字信号,时域连续信号也是数字信号模拟的结果。
因此,我们先从离散信号(数字)信号说起。
4.1离散信号与系统
在此之前,要先介绍一下逻辑运算符和关系运算符。
逻辑运算符见表二:
表二
逻辑运算符
说明
&
|
~
与
或
非
‘&’是逻辑“与”操作。
意思是&符号两边的集合取交集。
如:
“(x>0)&(x<4)”意思是取范围在0“|”是逻辑“或”操作。
意思是“|”符号两边的集合取并集。
如:
“(x>4)&(x<0)”意思是x>4和x<0范围的x。
“~”是逻辑“非”操作。
意思是对表达式做“非”运算。
如:
“~1”取值为0,“~0”取值为1。
关系运算符见表三:
表三
关系操作符
说明
<
<=
>
>=
==
~=
小于
小于或等于
大于
大于或等于
等于
不等于
在数字信号处理中,所有的信号都是离散(时间)信号,因此首先应解决在MATLAB中如何表示离散信号。
设一个序列信号x(n)={…,x(-1),x(0),x
(1),…}。
由于MATLAB对下标的约定为从1开始递增,因此要表示x(n),一般应采用两个矢量,如:
n=[-3-2-1012345]x=[1-13204521]
这表示了一个含9个采样点的矢量:
x(n)={x(-3),x(-2),x(-1),x(0),x
(1),x
(2),…,x(5)={1,-1,3,2,0,4,5,2,1}。
通常情况下,序列值从x(0)开始,因此一个N-1点序列x(n)={x(0),x
(1),…,x(N-1)}可简单的表示为:
x(n)=[x(0),x
(1),…,x(N-1)]。
函数的表示:
单位取样序列:
>>n=1:
N>>x=[n==1]
“==”是关系运算符,表示如果符号两边的表达式相等,总的表达式为1,如果不相等表达式值为0。
上式表达的意思是:
时间域自变量n定义为从1到N,X为自变量n上的函数,它只在n=1的时候取值为1,其它为0。
单位阶跃序列:
>>n=n1:
n2>>x=[(n-n0)>=0]
注意:
“>=”与“<=”和“==”一样都是关系运算符。
其含义为:
自变量n定义在从n1到n2,当n>=n0时函数x的值为1。
4.2连续信号与系统
由于计算机只能处理离散信号不能直接处理连续信号,因此只能由离散信号去模拟连续信号。
只要离散信号取的一系列离散点的间隔足够小,就可以把此信号作为连续信号来使用。
让我们看一段MATLAB程序:
(“%”号后为注释语句)
t=0:
0.001:
5;%取t为0至5的彼此间隔为0.001的一系列点。
x=sin(t);%为t的正弦函数。
(“;”表示在主窗口中不显示运算结果)
plot(t,x)%绘制x的图形。
(“plot”命令表示绘制图形,基本格式为:
%plot(t自变量,函数))
5脚本文件和函数
MATLAB除了可以通过CommandWindow中运行相关语句外,还可以将命令写成脚本文件(.M文件)集中执行,或者称为MATLAB编程。
通常是使用M文件编辑器将要运行的程序或函数编辑好,需要运行或调用时在命令窗口输入源文件的名字或函数名称即可运行。
5.1M文件的分类
M文件分为两种,即函数式M文件和脚本式M文件。
函数式M文件的第一句是以function语句开头的,脚本式M文件则是命令的简单叠加。
脚本式M文件运行产生的所有变量都是全局变量,而函数式M文件中所有变量除特别声明的外,都是局部变量。
举例:
下面的函数式M文件定义了单位斜变函数ur(t)。
functionu=ur(t)
u=0.*(t<0)+t.*(t>=0);
这样在CommandWindow中或其他M文件中就可以通过ur(t)来构建其他函数或变量,例如>>x=3*ur(t)-12*ur(t-0.3)+9*ur(t-0.4);定义了一个三角脉冲。
5.2M文件的程序结构
M文件的程序结构分为:
顺序结构、循环结构、分支结构。
这些结构不仅可以在M文件中使用,也可以在CommandWindow中输入运行。
我们的实验中可能用到的结构有:
(1)for循环结构
举例:
下面的语句通过循环用正弦波合成方波
rectwave=zeros(size(t));
fork=0:
m
rectwave=rectwave+sin((2*k+1)*t)/(2*k+1);
end;
(2)if-elseif-……-else-end分支结构
举例:
下面的语句根据ns的奇偶将xpf数组的前半部分和后半部分调换,并存入xf数组中
n2=ceil(ns/2);n1=floor(ns/2);
ifn1==n2
xf(1:
n2)=xpf(n2+1:
ns);
xf(n2+1:
ns)=xpf(1:
n2);
else
xf(1:
n2-1)=xpf(n2:
ns);
xf(n2:
ns)=xpf(1:
n2-1);
end
6、信号曲线的绘制
6.1plot(…)函数
基本格式:
plot(X1,Y1),以数组X1为横坐标,以Y1为纵坐标绘制曲线图。
这是最基本的用法,更复杂的用法请参看help文档。
要在一幅图中绘制多条曲线可以使用plot(X1,Y1,X1,Y2,X1,Y3,…)。
例如>>t1=-0.5;dt=0.001;t2=7;t=t1:
dt:
t2;
>>plot(t,sin(t));
即打开了曲线绘制窗口,在-0.5~7的区间内绘制sin(t)波形。
在曲线显示窗口中右键点击可以改变曲线显示的属性。
在Edit菜单中可以改变坐标轴的属性。
在File菜单中用SaveAs可以将曲线保存为一个图形文件(建议选择.bmp或.jpg格式)。
6.2stem(…)函数
Stem函数用于绘制火柴杆图,在我们的实验中用于绘制周期信号的频谱。
基本用法:
stem(X,Y),以数组X为横坐标,以Y为纵坐标绘制火柴杆图。
曲线属性、坐标属性的改变方法以及保存图形的方法与plot函数相同。
举例:
>>stem(f,xf)%在频域绘制xf的火柴杆图
7本实验可能用到的MATLAB系统命令:
(在命令窗口中输入)
help主题帮助
demo运行演示程序
who显示当前变量
clear清空工作区间的变量和函数
quit/exit退出MATLAB
实验一周期矩形脉冲的合成
一、实验目的:
本实验的目的是使学生熟悉MATLAB环境,并通过编程加深对信号的合成和分解的理解。
二、实验内容:
1、利用正弦波序列构造周期矩形脉冲,观察吉布斯现象;
2、计算周期矩形脉冲通过RC低通滤波器后的波形(选做)。
三、实验原理:
1、方波合成
一个周期为T的周期矩形脉冲信号可以分解为一系列正弦波信号。
设周期矩形脉冲的周期为T,在0~T之间
。
则f(t)可分解为:
,式中
。
我们通过累加,即可由正弦波序列构造一个周期矩形脉冲。
由于实际运算中不可能求和到无穷大,通常只对k求和到比较大即可,本实验要求分别绘制出k=3、20、100时的合成波形。
2、周期矩形脉冲通过RC低通滤波器的波形
如图所示的电路,由电路分析知道,输出信号与输入信号之比为:
。
若输入输入信号为sin(ωt)则输出信号为
。
对于周期矩形脉冲通过这个低通滤波器后的波形,可以分别计算每个正弦分量通过滤波器的波形,然后累加。
四、实验要求
1、利用正弦波合成一个周期为2π的周期矩形脉冲。
分别绘制出k=3、20、100时的近似曲线,观察吉布斯过冲现象。
2、计算RC分别等于0.1、0.3、1、3时,上述周期矩形脉冲通过RC低通滤波后的波形(取k=500)。
五、实验步骤
1、首先定义时间t的序列,本实验可取-0.52、定义一个零数组以备保存方波波形;
3、利用循环语句计算近似波形,循环次数分别为3、20、100;
4、利用plot语句绘制曲线,并观察吉布斯现象。
5对于RC滤波,更改循环语句对不同RC取值计算波形并绘制。
六、思考题
解释吉布斯现象出现的原因?
用余弦波合成三角波
,观察有无吉布斯过冲,为什么?
实验二时域连续信号的卷积
一、实验目的:
本实验的目的是使学生加深对卷积的理解。
二、实验内容:
1、利用软件动态观察两个信号的卷积过程;
2、编程计算两个信号的卷积。
三、实验原理:
卷积的概念贯穿于这门课程的始终,因此非常重要。
从教材中,我们知道两个信号x(t)与h(t)进行卷积,x(t)可以看作输入系统的信号,而h(t)是系统的冲激响应。
它们卷积的结果就是系统的输出。
两个信号卷积的公式为:
,其图形卷积过程为先将h(t)反褶、平移再和x(t)相乘,最后积分。
在本实验中,利用ctcongui程序可以给学生动态的演示输入两个信号x(t)与h(t)的卷积过程。
由于MATLAB处理的都是矩阵和数组,为了利用MATLAB近似的计算两个信号的卷积,需要对上述公式进行近似。
设τ序列间隔为dτ,则τ=mdτ(m从负无穷到正无穷),同样t=ndt
第二个等号后边的求和两个离散序列x(n)与h(n)的离散卷积。
MATLAB中有专门的函数conv(A,B)用于计算离散序列A、B的卷积。
因此只要知道x(t)和h(t)中时间序列的间隔dt,即可求出
。
四、实验要求
1、利用程序ctconvgui观察两个脉冲波形的图形卷积过程。
2、编程计算f1(t)=-2(u(t-0.5)-u(t-2))和f2(t)=(2x+2)(u(x+1)-u(x-2))的卷积f3=f1*f2,并绘制f1、f2和f3的曲线。
五、实验步骤
1、在CommandWindows中输入ctconvgui(回车),即可运行图形卷积演示过程。
2、使用M文件编辑器或记事本定义一个台阶函数us(t);
functionu=us(t)
u=0.*(t<0)+1.*(t>=0);
3、将us.M所在目录添加到MATLAB的路径中(使用MATLAB窗口中的File菜单下的SetPath),或将us.M放在MATLAB的路径所包含的目录;
4、首先定义f1和f2的时间t序列,本实验可取-25、定义函数f1(t)和f2(t);
6、利用函数conv(),计算f3;
7、显示f1、f2、f3的波形,需注意此时f3的定义域为-4~8。
实验三连续信号的傅立叶变换
一、实验目的:
利用MATLAB求解并绘制一周期信号的频谱,并重新合成。
二、实验内容:
1、求解一周期信号的傅立叶变换;
2、从变换后的频谱中的低频部分恢复信号。
(选做)
三、实验原理:
周期信号的傅立叶变换公式为:
式中
。
最后一项的求和即是离散序列的傅立叶变换,有专门的MATLAB函数fft()用于计算它。
因此
。
不过需要注意的是,fft()出来的结果中频谱的小于零部分存在数组的后半部分,大于零部分存在前半部分,需要自行调整。
对于逆变换:
这里只选取了f(t)的有限个低频分量(相当于理想低通滤波)。
对于后面的求和运算可以利用meshgrid构建F(n)、n和t矩阵,最后利用sum()对列求和获得f(t)。
四、实验要求
1、利用fft()函数对一个周期为2.5脉冲信号求频谱。
在一个周期内x(t)=3ur(t)-12ur(t-0.3)+9ur(t-0.4),ur(t)为单位斜变信号。
并绘制频谱。
2、用频率小于5的频谱合成信号。
五、实验步骤
1、首先定义时间t的序列和x(t);
2、利用fft()求x(t)的傅立叶变换;
3、将前半部分和后半部分调换得到对称的频谱X(f);
4、定义频率f的序列,序列长度N应和t序列相同,df=1/(Ndt);
5、利用stem()函数绘制x(t)的频谱;
6、对x(t)的频谱进行截断
7、利用meshgrid构建矩阵xff、nn和tm,其行长度与要得到的时间序列相同,列长度与f序列相同。
8、计算合成后的近似信号。
实验四信号的抽样和恢复
一、实验目的:
通过实验加深对抽样和采样定理的理解。
二、实验内容:
1、利用fft()函数计算一个脉冲信号的傅立叶变换频谱;
2、对信号进行理想冲击抽样,并计算抽样后的频谱;
3、由抽样后的频谱,采用理想低通滤波恢复信号。
三、实验原理:
1、傅立叶变换
与周期函数的傅立叶变换一样,在显示时也需要将频谱的前半部分和后半部分调换
2、理想冲击抽样
在冲击出现的那一点,信号变为f(t0)δ(t-t0),其余点变为0,f(t)→f(nTs)。
(Ts为抽样时间间隔,Ts=1/fs。
)
抽样后的频谱在频域变成以fs为周期的函数,
。
作为近似,可以将若干个相互错位fs的F(ω)进行错位相加,得到抽样后的频谱。
3、抽样信号的恢复
此时只要取出一个-fs~fs内的频谱,利用傅立叶逆变换,即可恢复信号。
由
,利用MATLAB中的ifft()函数即可恢复f(t)。
需注意的是,ifft()函数要求F(f)的形式应是与fft(t)出来的形式相同,即两头是低频分量,中间是高频分量。
四、实验要求
1、计算并绘制脉冲信号
(其带宽为B=50)的波形和频谱;
2、分别取fs=100和200,绘制抽样后的信号和频谱,进行对比;
3、对上面两种抽样频率下的抽样频谱,采用理想低通滤波(fc对应分别50和100)恢复信号,对比恢复后的信号。
五、实验步骤
1、首先定义时间t的序列,本实验可取-0.42、定义并显示x(t)波形;
3、计算显示x(t)的频谱,方法同实验三;
4、根据fs定义抽样时间序列nT,间隔为Ts;
5、利用stem()函数绘制抽样后的信号波形;
6、将X(f)错位相加(左右各错位4个),得到近似抽样频谱;
7、用plot()函数绘制抽样后的频谱;
8、对抽样后的信号进行滤波,即去掉|f|>fs的频谱分量;
9、利用ifft()函数恢复信号,并绘制波形;
10、改变抽样频率重复4~9。