信号与系统实验教程(学生版)

更新时间:2024-06-04 16:01:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

信 号 与 系 统

实验指导教程

长春工程学院电气与信息学院

二〇〇八年二月十日

目 录

实验一 信号的基本运算 ...................................................................................................... 0

一、实验目的 ................................................................................................................. 0 二、实验原理 ................................................................................................................. 0 三、实验内容及步骤 .................................................................................................... 10 四、实验报告要求 ........................................................................................................ 10 实验二 周期信号的傅里叶级数及Gibbs现象 ....................................................................... 11

一、实验目的 ............................................................................................................... 11 二、实验原理及方法 .................................................................................................... 11 三、实验内容和要求 .................................................................................................... 16 四、实验报告要求 ........................................................................................................ 17 实验三 信号抽样及信号重建 ............................................................................................. 18

一、实验目的 ............................................................................................................... 18 二、实验原理及方法 .................................................................................................... 18 三、实验内容及步骤 .................................................................................................... 24 四、实验报告要求 ........................................................................................................ 24 实验四 信号系统仿真 ........................................................................................................ 25

一、实验目的 ............................................................................................................... 25 二、实验原理 ............................................................................................................... 25 三、实验内容及步骤 .................................................................................................... 28 四、实验报告要求 ........................................................................................................ 29

实验一 信号的基本运算

一、实验目的

1、熟悉掌握常用的用于信号与系统时域仿真分析的MATLAB函数。

2、掌握用MATLAB描述连续时间信号和离散时间信号的方法,能够编写MATLAB程序进行仿真。

3、熟悉实现各种信号的时域变换和运算的原理和方法,并在MATLAB环境下仿真。

4、利用延拓的方法将时限信号变成一个周期函数。 5、利用MATLAB的卷积工具实现两个信号的卷积运算。

二、实验原理

1、在《信号与系统》课程中,单位阶跃信号u(t) 和单位冲激信号δ(t) 是二个非常有用的信号。它们的定义如下

???(t)dtt????1t?0t?0 1.1(a)

?(t)?0,?1,u(t)???0,t?0 1.1(b)

这里分别给出相应的简单的产生单位冲激信号和单位阶跃信号的扩展函数。产生单位冲激信号的扩展函数为:

function y = delta(t) dt = 0.01;

y = (u(t)-u(t-dt))/dt;

产生单位阶跃信号的扩展函数为:

% Unit step function

function y = u(t)

y = (t>=0); % y = 1 for t > 0, else y = 0

请将这二个MATLAB函数分别以delta 和u为文件名保存在work文件夹中,以后,就可以像教材中的方法使用单位冲激信号δ(t) 和单位阶跃信号u(t)。

2、离散时间单位阶跃信号u[n]定义为

u[n]???1,?0,n?0n?0 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=[0 1 1 1 1 1],h=[2 1 3 4 1 1],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('f1 signal'); subplot(222); plot(t,f2); title('f2 signal'); subplot(223); plot(t,f3); title('f1+f2 signal'); subplot(224); plot(t,f4); title('f1*f2 signal'); 运行后的结果:

1

图1-1 程序运行结果图 离散序列加法乘法实现程序

x=[0 1 1 1 1 1]; h=[2 1 3 4 1 1]; y=x+h,g=x.*h; subplot(221); stem(x); title('x signal'); subplot(222); stem(h); title('h signal'); subplot(223); stem(y);

title('x+h signal'); subplot(224); stem(g);

title('x.*h signal'); 运行后的结果:

图1-2 程序运行结果图

4、信号的时移

信号的时移可用下面的数学表达式来描述:

设一个连续时间信号为x(t),它的时移y(t) 表示为:

y(t) = x(t - t0) 1.3

其中,t0为位移量。若t0为正数,则y(t)等于将x(t)右移t0秒之后的结果。反之,若t0为负数,

2

则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,close all, t = -5:0.01:5;

x = exp(-0.5*t).*u(t); % Generate the original signal x(t)

x1 = exp(-0.5*(t+2)).*u(t+2); % Shift x(t) to the left by 2 second to get x1(t) x2 = exp(-0.5*(t-2)).*u(t-2); % Shift x(t) to the right by 2 second to get x2(t) subplot(311)

plot(t,x) % Plot x(t) grid on,

title (' x = exp(-0.5*t).*u(t)')

subplot (312)

plot (t,x1) % Plot x1(t) grid on,

title (' x1 = exp(-0.5*(t+2)).*u(t+2) ') subplot (313)

plot (t,x2) % Plot x2(t) grid on,

title (' x2 = exp(-0.5*(t-2)).*u(t-2)') xlabel ('Time t (sec)') 程序运行结果:

图1-3 程序运行结果图

注意:在运行上面的程序时,一定在所在的路径下创建u(t)的子函数: function y = u(t)

y = (t>=0); % y = 1 for t > 0, else y = 0 保存名为u.m 5、信号的时域翻转

3

对一个信号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]=[1 2 3 4];x[-n],分析所画信号波形, 程序如下: t=0:0.01:4*pi; n=0:1:3; m=sin(t); x=[1 2 3 4]; subplot(222); plot(t,m);

title('sin(t) signal'); subplot(221); plot(-t,m);

title('sin(-t) signal'); subplot(224); stem(n,x); title('x[n] signal'); subplot(223); stem(-n,x); title('x[-n] signal'); 程序运行结果:

4

图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 < a < 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[n]=[1 2 3 4];x[(-1/2)n],分析所画信号波形 程序如下:

%sin(2t)通过改变图形的压缩从sin(t)得来,x[(-1/2)n]通过展坐标轴从x[n]得来。 t=0:0.01:4*pi; k=2*t; n=0:1:3; g=(-2)*n;

m=sin(t);s=sin(k); x=[1 2 3 4]; subplot(222); plot(t,m); title('sin(t) signal'); subplot(221); plot(t,s);

title('sin(2t) signal');

5

subplot(224); stem(n,x); title('x[n] signal'); subplot(223); stem(g,x);

title('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, close all; t = -4:0.001:4;

T = 2; x = 0;

y = exp(-2*t).*(u(t)-u(t-2)); for k = -2:2;

x = x+exp(-2*(t-k*T)).*(u(t-k*T)-u(t-(k+1)*T)); end; subplot(211); plot(t,y);

6

title('e-2t[u(t)-u(t-2)] signal'); subplot(212)

plot(t,x);

title('e-2t[u(t)-u(t-2)]延拓后的波形');

程序运行结果:

图1-6 程序运行结果图

仔细阅读该程序,可以发现其算法就是:

?

x(t)??xk???1(t?kT) 1.8

由于k无法计算到无穷,而是以有限值加以替代,反映到有限宽度图形窗口中得到的效果完全符合要求。

8、卷积的计算

卷积的计算通常可按下面的五个步骤进行(以卷积积分为例):

1. 该换两个信号波形图中的横坐标,由t改为τ,τ变成函数的自变量;

2. 把其中一个信号翻转,如把h(τ)变成h(-τ);

3. 把翻转后的信号做移位,移位量是t,这样t是一个参变量。在τ坐标系中,t > 0时图形右移, t < 0时图形左移。

4. 计算两个信号重叠部分的乘积x(τ)h(t-τ);

5. 完成相乘后图形的积分。

对于两个时限信号(Time-limited signal),按照上述的五个步骤,作卷积积分运算时,关键是正确确定不同情况下的积分限。只要正确地确定了积分限都能得到正确定积分结果。尽管如此,在时域中计算卷积积分,总体上来说是一项比较困难的工作。

程序convlution_demo用来演示上述作卷积积分运算的五个步骤。本程序较为复杂,不建议读者读懂该程序,只需执行这个程序,观看程序执行过程中有关卷积积分的运算过程,以便于理解这五个步骤。 借助MATLAB的内部函数conv()可以很容易地完成两个信号的卷积积分运算。其语法为:y = conv(x,h)。其中x和h分别是两个作卷积运算的信号,y为卷积结果。

为了正确地运用这个函数计算卷积,这里有必要对conv(x,h)做一个详细说明。conv(x,h)函

7

数实际上是完成两个多项式的乘法运算。例如,两个多项式p1和p2分别为:

3232p1?s?2s?3s?4 和 p2?4s?3s?2s?1

这两个多项式在MATLAB中是用它们的系数构成一个行向量来表示的,如果用x来表示多项式p1,h表示多项式p2,则x和h分别为 x = [1 2 3 4] h = [4 3 2 1] 在MATLAB命令窗口依次键入

>> x = [1 2 3 4];

>> h = [4 3 2 1]; >> y=conv(x,h)

在屏幕上得到显示结果:

y = 4 11 20 30 20 11 4 这表明,多项式p1和p2的乘积为:

p3?4s?11s?20s?30s?20s?11s?4

65432 正如前所述,用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),编写程序,完成这两个信号的卷积运算,并绘制它们的波形图。范例程序如下:

% Program

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); % Compute the convolution of x(t) and h(t) subplot(221)

plot(t,x), grid on, title('Signal x(t)'), axis([t0,t1,-0.2,1.2]) subplot(222)

plot(t,h), grid on, title('Signal h(t)'), axis([t0,t1,-0.2,1.2])

subplot(212)

t = 2*t0:dt:2*t1; % Again specify the time range to be suitable to the % convolution of x and h.

plot(t,y), grid on, title('The convolution of x(t) and h(t)'), axis([2*t0,2*t1,-0.1,0.6]), xlabel('Time t sec') 程序运行结果

8

图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中的grid on/grid off可以实现在你的图形中加网格线。

grid on:在图形中加网格线。 grid off:取消图形中的网格线。

x = input(‘Type in signal x(t) in closed form:’)

9

三、实验内容及步骤

实验前,必须首先阅读本实验原理,读懂所给出的全部范例程序。实验开始时,先在计算机上运行这些范例程序,观察所得到的信号的波形图。并结合范例程序应该完成的工作,进一步分析程序中各个语句的作用,从而真正理解这些程序。

实验前,一定要针对下面的实验项目做好相应的实验准备工作,包括事先编写好相应的实验程序等事项。

练习1:结合编写的阶跃函数编写一门函数(门宽为4幅度为1)写出程序并会出门函数信号的

波形;

练习2:结合实验原理的信号的基本运算的程序,编写程序绘制m=sin(t);g=sin(2t-pi/2);x[n]=[1

2 5 6 3 ];x[(1/2)n-1];的四个信号的波形,并分析图形的变换过程。

练习3:根据周期函数的定义以及实验原理中延拓的方法实现脉冲函数(脉冲宽度1周期2

幅度1)并绘制其图形;

练习4:利用MATLAB内部所带的卷积工具对两个门函数进行卷积,分别绘制出两个门函

数和卷积后的波形,并分析门函数卷积的规律,

(一个门函数门宽为1幅度1另一个门函数门宽为2幅度为1,进行两者卷积)

四、实验报告要求

1、按要求完整书写你所编写的全部MATLAB程序

2、详细记录实验过程中的有关信号波形图(存于自带的U盘中),图形要有明确的标题。全部的MATLAB图形应该用打印机打印,然后贴在本实验报告中的相应位置,禁止复印件。

3、实事求是地回答相关问题,严禁抄袭。

10

实验二 周期信号的傅里叶级数及Gibbs现象

一、实验目的

1、掌握连续时间周期信号的傅里叶级数的物理意义和分析方法;

2、观察截短傅里叶级数而产生的“Gibbs现象”,了解其特点以及产生的原因; 3、掌握连续周期时间信号傅里叶变换的分析方法及其物理意义;

二、实验原理及方法

1、连续时间周期信号的傅里叶级数CTFS分析

任何一个周期为T1的正弦周期信号,只要满足狄利克利条件,就可以展开成傅里叶级数。 其中三角傅里叶级数为:

?x(t)?a0??[ak?1?kcos(k?0t)?bksin(k?0t)] 2.1

或: x(t)?a0?2?T1?ck?1kcosk(?0t??k) 2.2

其中?0?,称为信号的基本频率(Fundamental frequency),a0,ak,和bk分别是信号

x(t)的直流分量、余弦分量幅度和正弦分量幅度,ck、?k为合并同频率项之后各正弦谐波分

量的幅度和初相位,它们都是频率k?0的函数,绘制出它们与k?0之间的图像,称为信号的频谱图(简称“频谱”),ck-k?0图像为幅度谱,?k-k?0图像为相位谱。

三角形式傅里叶级数表明,如果一个周期信号x(t),满足狄里克利条件,那么,它就可以被看作是由很多不同频率的互为谐波关系(harmonically related)的正弦信号所组成,其中每一个不同频率的正弦信号称为正弦谐波分量 (Sinusoid component),其幅度(amplitude)为ck。也可以反过来理解三角傅里叶级数:用无限多个正弦谐波分量可以合成一个任意的非正弦周期信号。

指数形式的傅里叶级数为:

11

?x(t)??ak???kejk?0t 2.3

其中,ak为指数形式的傅里叶级数的系数,按如下公式计算: ak?1T1T1/2?x(t)e?jk?0tdt 2.4

?T1/2指数形式的傅里叶级数告诉我们,如果一个周期信号x(t),满足狄里克利条件,那么,它就可以被看作是由很多不同频率的互为谐波关系(harmonically related)的周期复指数信号所组成,其中每一个不同频率的周期复指数信号称为基本频率分量,其复幅度(complex amplitude)为ak。这里“复幅度(complex amplitude)”指的是ak通常是复数。

上面的傅里叶级数的合成式说明,我们可以用无穷多个不同频率的周期复指数信号来合成任意一个周期信号。然而,用计算机(或任何其它设备)合成一个周期信号,显然不可能做到用无限多个谐波来合成,只能取这些有限个谐波分量来近似合成。

假设谐波项数为N,则上面的和成式为:

Nx(t)??ak??Nkejk?0t 2.5

显然,N越大,所选项数越多,有限项级数合成的结果越逼近原信号x(t)。本实验可以比较直观地了解傅里叶级数的物理意义,并观察到级数中各频率分量对波形的影响包括“Gibbs”现象:即信号在不连续点附近存在一个幅度大约为9%的过冲,且所选谐波次数越多,过冲点越向不连续点靠近。这一现象在观察周期矩形波信号和周期锯齿波信号时可以看得很清楚。 例题1、给定一个周期为T1 = 2s的连续时间周期方波信号,如图所示,其一个周期内的数学表达式为:

?1, x1(t)???0,0?t?11?t?2

-2 -1 1 x(t) 0 1 2 t

解:首先,我们根据前面所给出的公式,计算该信号的傅里叶级数的系数。 ak?1T1T1/2图2.1 周期方波信号

11?jk?0t?x?T1/21(t)e?jk?0tdt?e?20k2dt?1?j2k?01?e0?jk?0td(?jk?0t)?e?jk?0t10?j2k?0?e?jk?0?1?j2k?0?e?jk2?0e?jk2?0?ej?0?j2k?0ksin(?0)?jk?02?e2 k?0sin(k?2)因为:?0 = 2π/T1 = π,代入上式得到:ak?(?j)

kk?

12

在MATLAB命令窗口,依次键入:

>> k = -10:10;

>> ak = ((-j).^k).* (sin((k+eps)*pi/2)./((k+eps)*pi)) % The expression of ak

ak =

Columns 1 through 4

-0.0000 0 + 0.0354i -0.0000 0 + 0.0455i Columns 5 through 8

-0.0000 0 + 0.0637i -0.0000 0 + 0.1061i Columns 9 through 12

-0.0000 0 + 0.3183i 0.5000 0 - 0.3183i Columns 13 through 16

-0.0000 0 - 0.1061i -0.0000 0 - 0.0637i Columns 17 through 20

-0.0000 0 - 0.0455i -0.0000 0 - 0.0354i Column 21 -0.0000

从MATLAB命令窗口,我们得到了该周期信号从a?10到a10共21个系数。 紧接着再键入以下命令:

>> subplot(221)

>> stem(k,abs(ak),'k.')

>> title('The Fourier series coefficients') >> xlabel('Frequency index k')

就得到一幅如右图所示的描述ak与k之间的关系的图形。

以上是我们通过手工计算得到的这个周期信号的傅里叶级数表达式及其频谱图,下面给出完成傅里叶级数系数计算的相应MATLAB范例程序。

% Program2_1

% This program is used to evaluate the Fourier series coefficients ak of a periodic square

wave

clear, close all

T = 2; dt = 0.00001; t = -2:dt:2;

x1 = u(t) - u(t-1-dt); x = 0;

for m = -1:1 % Periodically extend x1(t) to form a periodic signal x = x + u(t-m*T) - u(t-1-m*T-dt); end

w0 = 2*pi/T;

N = 10; % The number of the harmonic components L = 2*N+1;

for k = -N: N; % Evaluate the Fourier series coefficients ak

13

ak(N+1+k) = (1/T)*x1*exp(-j*k*w0*t')*dt; end

phi = angle(ak); % Evaluate the phase of ak

执行程序Program2_1后,就完成了信号的傅里叶级数的系数的计算,在命令窗口键入 >> ak

命令窗口就可以显示傅里叶级数的21个系数:

ak =

Columns 1 through 4

0.0000 + 0.0000i 0.0000 + 0.0354i 0.0000 - 0.0000i 0.0000 + 0.0455i Columns 5 through 8

0.0000 - 0.0000i 0.0000 + 0.0637i 0.0000 - 0.0000i 0.0000 + 0.1061i Columns 9 through 12

0.0000 - 0.0000i 0.0000 + 0.3183i 0.5000 0.0000 - 0.3183i Columns 13 through 16

0.0000 + 0.0000i 0.0000 - 0.1061i 0.0000 + 0.0000i 0.0000 - 0.0637i Columns 17 through 20

0.0000 + 0.0000i 0.0000 - 0.0455i 0.0000 + 0.0000i 0.0000 - 0.0354i Column 21

0.0000 - 0.0000i

将这里的ak之值同前面手工计算得到的ak比较,可见两者是完全相同的。

再次特别提示:程序中,时间变量的变化步长dt的大小对傅里叶级数系数的计算精度的影响非常大,dt越小,精度越高,本程序中的dt之所以选择0.00001就是为了提高计算精度。但是,计算机所花的计算时间越长。

在程序Program2_1中添加相应的计算| ak |和绘图语句,就可以绘制出信号的幅度谱和相位谱的谱线图。

2、周期信号的合成以及Gibbs现象

从傅里叶级数的合成式(Synthesis equation)

?x(t)??ak???kejk?0t

可以看出,用无穷多个不同频率和不同振幅的周期复指数信号可以合成一个周期信号。然而,我们无法用计算机实现对无穷多个周期复指数信号的合成。但是,用有限项来合成却是可行的,在实际应用中,多半也就是这么做的。然而,这样做的一个必然结果,就是引入了误差。

如果一个周期信号在一个周期有内断点存在,那么,引入的误差将除了产生纹波之外,还将在断点处产生幅度大约为9%的过冲(Overshot),这种现象被称为吉伯斯现象(Gibbs phenomenon)。

为了能够观察到合成信号与原信号的不同以及Gibbs现象,我们可以利用前面已经计算出的傅里叶级数的系数,计算出截短的傅里叶级数:

Nx(t)?

?ak??Nkejk?0t

14

这个计算可用L = 2N+1次循环来完成:

x2?x2?ak(r)?ej(r?1?N)?0t

其中r作为循环次数,x2在循环之前应先清零。完成这一计算的MATLAB程序为:

x2 = 0; L = 2*N+1;

for r = 1:L;

x2 = x2+ak(r)*exp(j*(r-1-N)*w0*t);

end;

完成了所有的计算之后,就可以用绘图函数:plot()和stem()将计算结果包括x1, x2, abs(ak)和angle(ak)以图形的形式给出,便于我们观察。

观察吉伯斯现象的最好的周期信号就是图2-1所示的周期方波信号,这种信号在一个周期内有两个断点,用有限项级数合成这个信号时,吉伯斯现象的特征非常明显,便于观察。 例题2:修改程序Program2_1,使之能够用有限项级数合成例题2-1所给的周期方波信号,并绘制出原始周期信号、合成的周期信号、信号的幅度谱和相位谱。

为此,只要将前述的for循环程序段和绘图程序段添加到程序Program2_1中即可,范例程序如下:

% Program2_2

% This program is used to compute the Fourier series coefficients ak of a periodic square wave clear,close all

T = 2; dt = 0.00001; t = -2:dt:2; x1 = u(t)-u(t-1-dt); x = 0; for m = -1:1

x = x + u(t-m*T) - u(t-1-m*T-dt); % Periodically extend x1(t) to form a periodic signal end

w0 = 2*pi/T;

N = input('Type in the number of the harmonic components N = :'); L = 2*N+1; for k = -N:1:N;

ak(N+1+k) = (1/T)*x1*exp(-j*k*w0*t')*dt; end

phi = angle(ak); y=0;

for q = 1:L; % Synthesiz the periodic signal y(t) from the finite Fourier series y = y+ak(q)*exp(j*(-(L-1)/2+q-1)*2*pi*t/T); end;

subplot(221),

plot(t,x), title('The original signal x(t)'), axis([-2,2,-0.2,1.2]), subplot(223),

plot(t,y), title('The synthesis signal y(t)'), axis([-2,2,-0.2,1.2]), xlabel('Time t'), subplot(222)

k=-N:N; stem(k,abs(ak),'k.'), title('The amplitude |ak| of x(t)'), axis([-N,N,-0.1,0.6]) subplot(224)

15

stem(k,phi,'r.'), title('The phase phi(k) of x(t)'), axis([-N,N,-2,2]), xlabel('Index k') N=12时,程序运行结果:

图2-1 程序运行结果

在用这个程序观察吉伯斯现象时,可以反复执行该程序,每次执行时,输入不同之N值,比较所的图形的区别,由此可以观察到吉伯斯现象的特征。

三、实验内容和要求

实验前,必须首先阅读本实验原理,读懂所给出的全部范例程序。实验开始时,先在计算机上运行这些范例程序,观察所得到的信号的波形图。并结合范例程序应该完成的工作,进一步分析程序中各个语句的作用,从而真正理解这些程序。

实验前,一定要针对下面的实验项目做好相应的实验准备工作,包括事先编写好相应的实验程序等事项。

练习1、周期信号的傅里叶级数

给定如下两个周期信号:

x1(t)1t?2?112

(1)、手工计算x1(t)傅里叶级数的系数:

信号x1(t) 在其主周期内的数学表达式为:

计算x1(t) 的傅里叶级数的系数的计算过程如下:

16

仅供参考ak?1T1T1/2?x1(t)e?jk?0tdt x1(t)=(t+1)*(u(t+1)-u(t))+(1-t)*(u(t)-u(t-1))

?T1/2计算小程序: k = -10:10;

ak = ak的表达式 % The expression of ak

通过计算得到的x1(t)的傅里叶级数的系数的数学表达式是:

(2)、用MATLAB计算的傅里叶级数的系数ak从-10到10共21个系数。仿照程序Program2_1,编写程序以计算x1(t)的傅里叶级数的系数。程序如下:

执行程序后,就完成了信号的傅里叶级数的系数的计算,在命令窗口键入 >> ak

命令窗口就可以显示傅里叶级数的21个系数:

(3)、通过执行程序所得到的x1(t)的傅里叶级数的ak从-10到10共21个系数 与你手工计算的ak相比较,是否相同,如有不同,是何原因造成的?

答:

练习2、反复执行程序Program2_2,每次执行该程序时,输入不同的N值,并观察所合成的

周期方波信号。分析吉伯斯现象的特点,观察合成的信号波形中,是否会产生Gibbs现象?为什么?;

答:

四、实验报告要求

1、按要求完整书写你所编写的全部MATLAB程序

2、详细记录实验过程中的有关信号波形图(存于自带的U盘中),图形要有明确的标题。全部的MATLAB图形应该用打印机打印,然后贴在本实验报告中的相应位置,禁止复印件。

3、实事求是地回答相关问题,严禁抄袭。

本实验完成时间: 年 月 日

17

实验三 信号抽样及信号重建

一、实验目的

1、进一步理解信号的抽样及抽样定理; 2、进一步掌握抽样信号的频谱分析;

3、掌握和理解信号抽样以及信号重建的原理;

二、实验原理及方法

1、信号的抽样及抽样定理

抽样(Sampling),就是从连续时间信号中抽取一系列的信号样本,从而,得到一个离散时间序列(Discrete-time sequence),

图3-1给出了信号理想抽样的原理图:

x(t)?p(t)xs(t)X(j?)???m?m(a) (b)

图3-1 (a) 抽样原理图,(b) 带限信号的频谱

上图中,假设连续时间信号是一个带限信号(Bandlimited Signal),其频率范围为

??m~?m,抽样脉冲为理想单位冲激串(Unit Impulse Train),其数学表达式为:

?p(t)???(t?nT??s) 3.1

由图可见,模拟信号x(t)经抽样后,得到已抽样信号(Sampled Signal)xs(t),且:

xs(t)?x(t)p(t) 3.2

将p(t)的数学表达式代入上式得到:

?xs(t)??x(nT??s)?(t?nTs) 3.3

显然,已抽样信号xs(t) 也是一个冲激串,只是这个冲激串的冲激强度被x(nTs) 加权了。 从频域上来看,p(t) 的频谱也是冲激序列,且为:

18

?F{p(t)}??s??(??n?s) 3.4

??根据傅里叶变换的频域卷积定理,时域两个信号相乘,对应的积的傅里叶变换等于这两个信号的傅里叶变换之间的卷积。所以,已抽样信号xs(t)的傅里叶变换为:

Xs(j?)?1Ts??n???X(j(??n?s)) 3.5

表达式4.5告诉我们,如果信号x(t)的傅里叶变换为X(j?),则已抽样信号xs(t) 的傅里叶变换Xs(j?)等于无穷多个加权的移位的X(j?)之和,或者说,已抽样信号的频谱等于原连续时间信号的频谱以抽样频率?s为周期进行周期复制的结果。如图3-2所示:

x(t)X(j?)t??M?M?p(t)t?s??s1/TsP(j?)Tsxs(t)?sXs(j?)?t图3-2 信号抽样及其频谱图

3.6 在MATLAB中,对信号抽样的仿真,

?

例题 设连续时间信号为一个正弦信号 x(t) = cos(0.5πt),抽样周期为Ts = 1/4秒,编程序绘制信号x(t)和已抽样信号x[n]的波形图。

范例程序Sampling如下:

% Sampling

clear, close all,

t = 0:0.01:10;

Ts = 1/4; % Sampling period

n = 0:Ts:10; % Make the time variable to be discrete x = cos(0.5*pi*t);

xn = cos(0.5*pi*n); % Sampling

subplot(221)

plot(t,x), title('A continuous-time signal x(t)'), xlabel('Time t')

subplot(222)

stem(n,xn,'.'), title('The sampled version x[n] of x(t)'), xlabel('Time index n')

19

执行该程序后,得到的波形图如图3-3所示。

图3-3 连续时间信号及其抽样后的离散时间序列

在这个范例程序中,先将连续时间t进行离散化,使之成为以Ts = 1/4秒的离散时间n,然后,将n代入到信号x(t) 的数学表达式中计算,就完成了抽样过程,且得到了抽样后的离散时间序列x[n]。

2、 信号抽样过程中的频谱混叠

为了能够观察到已抽样信号的频谱是否会存在混叠现象,或者混叠程度有多么严重,有必要计算并绘制出已抽样信号的傅里叶变换。

根据式3.5可计算出已抽样信号的频谱。其中,主要利用了一个for循环程序完成周期延拓运算。

% Program

clear, close all,

tmax = 4; dt = 0.01; t = 0:dt:tmax; Ts = 1/10; ws = 2*pi/Ts; w0 = 20*pi; dw = 0.1; w = -w0:dw:w0; n = 0:1:tmax/Ts; x = exp(-4*t).*u(t); xn = exp(-4*n*Ts);

subplot(221)

plot(t,x), title('A continuous-time signal x(t)'), xlabel('Time t'), axis([0,tmax,0,1]), grid on subplot(223)

stem(n,xn,'.'), title('The sampled version x[n] of x(t)'), xlabel('Time index n'), axis([0,tmax/Ts,0,1]), grid on Xa = x*exp(-j*t'*w)*dt; X = 0;

for k = -8:8;

20

X = X + x*exp(-j*t'*(w-k*ws))*dt; end

subplot(222) plot(w,abs(Xa))

title('Magnitude spectrum of x(t)'), grid on axis([-60,60,0,1.8*max(abs(Xa))]) subplot(224) plot(w,abs(X))

title('Magnitude spectrum of x[n]'), xlabel('Frequency in radians/s'),grid on axis([-60,60,0,1.8*max(abs(Xa))]) 程序运行结果:

图3-4 程序运行结果图

本程序可以用来观察在不同的抽样频率条件下,已抽样信号的频谱的混叠程度,从而更加牢固地理解抽样定理。但是,提请注意的是,在for循环程序段中,计算已抽样信号的频谱X 时,没有乘以系数1/Ts,是为了便于比较X与Xa之间的区别,从而方便观察频谱的混叠程度。另外,程序中的时间步长dt的选择应该与抽样周期Ts保持一定的比例关系,建议Ts不应小于10dt,否则,计算得到的已抽样信号的频谱将出现错误。

3、 信号重建

如果满足抽样定理,那么,我们就可以唯一地由已抽样信号x[n] 恢复出原连续时间信号x(t)。在理想情况下,可以将离散时间序列通过一个理想低通滤波器,图3.5给出了理想情况下信号重建的原理示意图。

x(t)?xp(t)Ideal Lowpass Filter xr(t)p(t)图3-5 信号重建原理图

21

理想低通滤波器也称重建滤波器,它的单位冲激响应

h(t)??cTsin(?ct)??ct 3.7

?已抽样信号xp(t)的数学表达式为:xp(t)?表达式,我们有

?x(nT)?(t?nT),根据系统输入输出的卷积

??xr(t)?xp(t)?h(t) 3.8

将xp(t)代入式4.8,有

?xr(t)??n???x(nT)?cTsin(?c(t?nT))??c(t?nT) 3.9

这个公式称为内插公式(Interpolation Formula),该公式的推导详见教材,请注意复习有关内容。须提请注意的是,这里的内插公式是基于重建滤波器为理想低通滤波器的。若重建滤波器不是理想低通滤波器,则不能用这个内插公式。理想低通滤波器的频率响应特性曲线和其单位冲激响应曲线如图3.6所示。

H(j?)Th(t)T?c?t???c?c图3-6 理想低通滤波器的幅度频率响应和单位冲激响应

范例程序程序就是根据这个内插公式来重构原始信号。本程序已经做了较为详细的注释,请结合教材中的内插公式仔细阅读本程序,然后执行,以掌握和理解信号重建的基本原理。范例程序如下。

% Program

% Signal sampling and reconstruction

% The original signal is the raised cosin signal: x(t) = [1+cos(pi*t)].*[u(t+1)-u(t-1)]. clear; close all,

wm = 2*pi; % The highest frequency of x(t) a = input('Type in the frequency rate ws/wm=:'); % ws is the sampling frequency wc = wm; % The cutoff frequency of the ideal lowpass filter t0 = 2; t = -t0:0.01:t0;

x = (1+cos(pi*t)).*(u(t+1)-u(t-1));

subplot(221); % Plot the original signal x(t) plot(t,x); grid on, axis([-2,2,-0.5,2.5]); title('Original signal x(t)');xlabel('Time t');

22

ws = a*wm; % Sampling frequency Ts = 2*pi/ws; % Sampling period

N = fix(t0/Ts); % Determine the number of samplers n = -N:N;

nTs = n*Ts; % The discrete time variable xs = (1+cos(pi*nTs)).*(u(nTs+1)-u(nTs-1)); % The sampled version of x(t) subplot(2,2,2) % Plot xs

stem(n,xs,'.'); xlabel('Time index n'); grid on, title('Sampled version x[n]'); xr = zeros(1,length(t)); % Specify a memory to save the reconstructed signal L = length(-N:N);

xa = xr;

figure(2); % Open a new figure window to see the demo of signal reconstruction stem(nTs,xs,'.'); xlabel('Time index n'); grid on;hold on for i = 1:L m = (L-1)/2+1-i;

xa = Ts*(wc)*xs(i)*sinc((wc)*(t+m*Ts)/pi)/pi; plot(t,xa,'b:');axis([-2,2,-0.5,2.5]); hold on pause

xr = xr+xa; % Interpolation end

plot(t,xr,'r'); axis([-2,2,-0.5,2.5]); hold on figure(1); subplot(223)

plot(t,xr,'r');axis([-2,2,-0.5,2.5]); xlabel('Time t');grid on

title('Reconstructed signal xr(t)');

% Compute the error between the reconstructed signal and the original signal error = abs(xr-x); subplot(2,2,4)

plot(t,error);grid on title('Error');xlabel('Time t') 程序运行结果图: 当ws/wm= 3时

23

图3-7 程序运行图

图3-8 时域采样图 注意:根据抽样定理 ws/wm的值必须大于或等于2

三、实验内容及步骤

实验前,必须首先阅读本实验原理,了解所给的MATLAB相关函数,读懂所给出的全部范例程序。实验开始时,先在计算机上运行这些范例程序,观察所得到的信号的波形图。并结合范例程序所完成的工作,进一步分析程序中各个语句的作用,从而真正理解这些程序的编程算法。 实验前,一定要针对下面的实验项目做好相应的实验准备工作,包括事先编写好相应的实验程序等事项。

练习1、什么是抽样定理?信号采样后重建的步骤,抽样频率如何设置? 练习2、 给范例程序Program4_1加注释。

练习3、分别进行设置ws/wm= 2,ws/wm= 1,ws/wm= 3,并运行抽样信号重建程序,并

根据抽样定理及重建条件分析三种设置情况下的结果。

四、实验报告要求

1、按要求完整书写你所编写的全部MATLAB程序

2、详细记录实验过程中的有关信号波形图(存于自带的U盘中),图形要有明确的标题。全部的MATLAB图形应该用打印机打印,然后贴在本实验报告中的相应位置,禁止复印件。

3、实事求是地回答相关问题,严禁抄袭。

本实验完成时间: 年 月 日

24

实验四 信号系统仿真

一、实验目的

1、了解信号中常用的几种滤波器的使用方法。

2、掌握信号的基本运算,并掌握对要求信号傅里叶变换。 3、理解信号通过滤波器的滤波函数的调用。 4、掌握信号时域分析与频域分析的区别。

5、了解一个系统对输入信号处理,观察信号前后的变化。

二、实验原理

1、在《信号与系统》课程中,要分析一个系统,首先要建立描述该系统基本特征的数学模型,然后用数学方法(或计算机仿真等)求出它的解答,并对结果赋予实际含义。连续或离散系统除用数学函数方程描述外,还可用框图表示系统的激励和响应之间的数学运算关系。一个方框(或其他形状)可以表示一个具有某种功能的部件,也可以表示一个子系统。每个方框内部的具体结构并非考察重点,而只注重其输入、输出之间的关系。

表示系统功能的常用基本单元有:积分器(用于连续系统)或延迟单元(用于离散系统)以及加法和数乘器(标量乘法器),对于连续系统,有时还需用延时时间为T的延时器。

2、一般信号通过系统进行分析有两种方法:时域分析法和频域分析法。下面是一个系统分析的简化图:

上图中x(t)、y(t)分别为系统的时域激励信号和响应信号,h(t)是系统的单位冲激响应,它们三者之间的关系为:y(t )?x(t)*h(t),由傅里叶变换的时域卷积定理可得到:LTI系统y(t)x(t)h(t)Y(j?)?X(j?)H(j?) X(j?)H(j?)Y(j?)4.1

信号x(t)通过LTIY(j?)系统分析图 或者: H(j?)? 4.2

X(j?)H(j?)为系统的频域数学模型,它实际上就是系统的单位冲激响应h(t)的傅里叶变换。即

? H(j?)??h(t)e???j?tdt 4.3

由于H(j?)实际上是系统单位冲激响应h(t)的傅里叶变换,如果h(t)是收敛的,或者说是绝对可积(Absolutly integrabel)的话,那么H(j?)一定存在,而且H(j?)通常是复数,因此,也可以表示成复数的不同表达形式。在研究系统的频率响应时,更多的是把它表示成极坐标形式:

25

H(j?)?H(j?)ej?(?) 4.4

上式中,H(j?)称为幅度频率相应(Magnitude response),反映信号经过系统之后,信号各频率分量的幅度发生变化的情况,?(?)称为相位特性(Phase response),反映信号经过系统后,信号各频率分量在相位上发生变换的情况。H(j?)和?(?)都是频率?的函数。

对于一个系统,其频率响应为H(j?),其幅度响应和相位响应分别为H(j?)和?(?),如果作用于系统的信号为x(t)?ej?t,则其响应信号为

0y(t)?H(j?0)ej?0t?H(j?0)ej?(?0)ej?0t?H(j?0)ej(?0t??(?0)) 4.5

若输入信号为正弦信号,即x(t) = sin(?0t),则系统响应为

y(t)?H(j?0)sin(?0t)?|H(j?0)|sin(?0t??(?0)) 3.6

可见,系统对某一频率分量的影响表现为两个方面,一是信号的幅度要被H(j?)加权,二是信号的相位要被?(?)移相。

由于H(j?)和?(?)都是频率?的函数,所以,系统对不同频率的频率分量造成的幅度和相位上的影响是不同的。

3、我们通过两个例子来说明信号通过系统的两种分析方法:

例题1、一个正弦信号6*sin(20*pi*t)通过一个系统(此系统实现对信号乘以以个正弦sin(2*pi*t))通过编写MATLAB程序,仿真此系统的功能并绘制出信号通过此系统后的信号波形与原来的变化。

程序如下:

t=0:0.01:2*pi; m=6*sin(20*pi*t); g=sin(2*pi*t); y=m.*g; subplot(311)

plot(t,m);

title('6*sin(20*pi*t) signal'); subplot(312)

plot(t,g);

title(' sin(2*pi*t) signal'); subplot(313); plot(t,y);

26

title('通过系统后的信号波形') 程序运行后的结果

图4-1 程序运行结果图

例题2、产生三个正弦成分(5Hz,15Hz,30Hz)的信号,然后,设计一滤波器来去除5Hz和30Hz,的正弦信号,保留15Hz信号的系统。

程序如下:

%产生含有3个正弦分量的信号 Fs=100; t=(1:100)/Fs; s1=sin(2*pi*t*5); s2=sin(2*pi*t*15); s3=sin(2*pi*t*30); s=s1+s2+s3; subplot(221); plot(t,s);

xlabel('Time(second)');

ylabel('Time waveform');

title('含有三个正弦分量的信号');

%产生一个8阶的IIR带通滤波器,通带10Hz到20Hz,其频率响应如下: [b,a]=ellip(4,0.1,40,[10 20]*2/Fs); [H,w]=freqz(b,a,512);

subplot(222);

plot(w*Fs/(2*pi),abs(H));

title('所设计的10Hz~20Hz的带通滤波器 ');

xlabel('Frequency(Hz)');ylabel('Mag.of frequency response'); grid on;

%对信号进行滤波 sf=filter(b,a,s);

27

subplot(223); plot(t,sf);

xlabel('Time(seconds)'); ylabel('Rime waveform');

title('信号通过滤波系统后的时域波形 ') axis([0 1 -1 1]);

%绘出信号滤波前后的幅频图 S=fft(s,512);

SF=fft(sf,512);

w=(0:255)/256*(Fs/2);

subplot(224);

plot(w,abs(S(1:256)),'r--',w,abs(SF(1:256)),'g');

xlabel('Frequency(Hz)');ylabel('Mag.of Fourier transform'); title('信号通过滤波系统前后频域波形分析') grid on;legend('before','after') 程序运行后的结果:

图4-2 程序运行结果图

三、实验内容及步骤

实验前,必须首先阅读本实验原理,了解所给的MATLAB相关函数,读懂所给出的全部范例程序。实验开始时,先在计算机上运行这些范例程序,观察所得到的信号的波形图。并结合范例程序所完成的工作,进一步分析程序中各个语句的作用,从而真正理解这些程序。

实验前,一定要针对下面的实验项目做好相应的实验准备工作,包括事先编写好相应的实验程序等事项。

练习 如果设单频调制信号

u(t)=cos(2*pi*t),AM调制系统的载波v(t)=4*cos(20*pi*t),用

28

MATLAB语言仿真整个结果(包括u(t)的时域和频域波形;v(t)的时域和频域波形,信号调制后的时域和频域波形); 提示:单频信号调幅波的表达式为:

y(t)=4*(1+m*cos(2*pi*t))*cos(20*pi*t) m为调制系数,调制系数m必须满足:0

将程序分别在调制系数m<1时,m>1时,m=1时观察三种情况的不同,查阅高频或通信原理教科书分析为什么?

四、实验报告要求

1、按要求完整书写你所编写的全部MATLAB程序

2、详细记录实验过程中的有关信号波形图(存于自带的U盘中),图形要有明确的标题。全部的MATLAB图形应该用打印机打印,然后贴在本实验报告中的相应位置,禁止复印件。

3、实事求是地回答相关问题,严禁抄袭。

本实验完成时间: 年 月 日

29

本文来源:https://www.bwwdw.com/article/hpm6.html

Top