2.2.1序列的表示方法
当把一个经等间隔采样的信号表示为序列后,就抽掉了它的采样周期T的信息。如果序列的长度有限,就可以用一个向量来表示。然而这样一个向量并没有包含采样位置(或时间先后)的信息。因此,完全表示序列x(n)要用x和n两个向量,例如序列x(n)·{2,1.2,1.4,3,1,4,3.1,7}(双下画线表示n·0处的采样点),即x(·3)·2,x(·2)·1.2,x(·1)·1.4,x(0)·3,…,所以要用n和x两个向量才能完全地表示一个序列:
n·[·3,·2,·1,0,1,2,3,4];
x·[2,1.2,?1.4,3,1,4,3.1,7];
stem(n,x);%绘制离散信号
位置向量n是顺序增加的整数,所以在MATLAB中可以简化表示为n·[·3:4];而因变量x是一个模拟量数组,可以有小数,甚至可以是无理数。有些序列,因为采样位置从n·0开始,就省写了n向量,只用x向量来表示序列x[n]。在MATLAB的信号处理工具箱函数中,对输入序列大多都采取这种设定,以减少输入变元的数目,实际上n仍然存在。如果x的长度是N?length(x),即默认n·0:N·1。由于MATLAB中的变量下标是从1开始的,此时x的下标仍不是n,而应该是·1,x的下标范围为(1:N)。所以,即使在MATLAB的默认条件下,x的下标也并不等于位置向量n。在本书中给出的序列运算的函数程序,输入和输出序列都用n和x两个向量表示,所以存在一个与MATLAB的信号处理工具箱函数衔接的问题,需要做简单的处理。
如果x是实数数组,则称为实序列;如果x是复数数组,则称为复序列;一个复序列可以分解为两个实序列的合成:
(2.2.1)
其中,都是实序列,它们分别为序列x(n)的实部和虚部。因此可以用实序列的理论和方法来处理。复序列也可以用它的幅度和相角来表示:
(2.2.2)
其中,幅度|x(n)|和相角(n)也都是实序列。借助幅度和相位可以利用向量形式来简化一些繁杂的数学公式,直观地理解数字信号处理中许多深奥的概念。
如果x的长度N?length(x)有界,则称之为有限序列;如果N无界,则称之为无限长序列。实际中遇到的序列都是有限序列,无限长序列是一种数学模型,只有理论意义。
如果对应的n、x都有确定的取值,则称之为确知序列;如果取值随机,则称之为随机序列。在现实中不存在完全的确知信号,因为现实中的信号都不可避免地受到噪声的污染。由此,对确知序列的研究更多的是理论上的意义,有助于探究如何更好地从噪声污染的信号中提取有用的信息,这是信号处理非常重要的任务之一。
2.2.2常用的典型序列
(1)单位脉冲序列(unitimpulsesequence)?(n)
(2.2.3)
其特点是仅在n=0处取值为1,n为其他值处均为零。它类似于模拟信号中的单位冲激函数?(t)。
后面要常常用到迟延的单位脉冲序列。其脉冲的作用起点不是0而是,表示为:
(2.2.4)
为了方便调用,本书建立一个MATLAB函数impseq.m,用来生成迟延的单位脉冲序列。其输入参数为序列起始位置ns、序列终止位置nf及脉冲位置np。函数如下:
function[x,n]=impseq(np,ns,nf)
%生成x(n)=delta(n-np);ns<=n<=nf
%----------------------------------------------
%ns为序列起始位置,nf为序列终止位置,np为脉冲位置
%调用方式[x,n]=impseq(ns,ns,nf)
%
ifns>np|ns>nf|np>nf
error('输入位置参数不满足ns<=np<=nf')
elsen=[ns:nf];
x=[(n-np)==0];
end%单位脉冲序列的产生
这里出现了本书第一个自编的MATLAB函数文件,写得比较完整。程序中的核心部分是第一行和倒数第二行,缺了这两行,程序将不能工作。第二行至第六行都是以%开始的,它们是注释语句。在键入helpimpseq时将显示这几行内容,以便用户正确调用这个函数。以if打头的第7行、第8行是用来检验输入参数的正确性的。输入参数错误时它会显示错误的信息。在MATLAB语法上用了完整的if-else-end语句。现在起本书中的函数程序将省略某些辅助语句,以节省篇幅。但在我们提供的程序集中,将给出完整的程序。
注意,倒数第二行的核心语句采用了逻辑语句x=[(n-np)==0]。在n=ns:nf的一串值中,只有一个值能满足这个逻辑式,因而只在这个n=np处,x为1,在其余的n值处,x均为0,形成了迟延np的单位脉冲序列x。读者也可以试用其他方法来写这条核心语句,不过本书提供的这条语句可能是最简练的。
(2)单位阶跃序列(unitstepsequence)u(n)
(2.2.5)
它类似于模拟信号中的单位阶跃函数u(t),u(n)和?(n)的关系如下:
(2.2.6)
(2.2.7)
由于后面常会用到这个序列,本书也建立一个函数stepseq.m,用来生成迟延的单位阶跃序列。其输入参数为序列起始位置ns、序列终止位置nf及阶跃位置np。函数如下:
function[x,n]=stepseq(np,ns,nf)
n=[ns:nf];x=[(n-np)>=0];%单位阶跃序列的产生
它与impseq函数的差别只是把逻辑语句中的“等于号”改成了“大于等于号”,读者也可以尝试用其他语句来实现此程序中的核心语句。
(3)矩形序列(rectangularsequence)
(2.2.8)
式中的N为序列的长度。矩形序列可以方便地用单位阶跃序列之差来生成:
(2.2.9)
所以不必为它编子程序了。
(4)复指数序列(complexexponentialsequence)
(2.2.10)
若ω=0,它是实指数序列;若α=0,它是虚指数序列,故其实部为余弦序列,虚部为正弦序列。
例2.2.1:编写MATLAB程序来产生下列基本脉冲序列。
a.单位脉冲序列:起点ns=0,终点nf=10,在np=3处有一单位脉冲(ns≤np≤nf);
b.单位阶跃序列:起点ns=0,终点nf=10,在np=3前为0,在ns处及以后为1(ns≤np≤nf);
c.复数指数序列:取a=?0.2,ω=0.5,起点为ns3=?2,终点为10。
解:这些基本序列的表达式比较简单,编写程序也不难。对于单位脉冲序列和单位阶跃序列,我们直接调用了上面编写的子程序。编写的程序hc221如下:
clear,ns=0;nf=10;np=3;ns3=-2
[x1,n1]=impseq(np,ns,nf);%单位脉冲序列的产生
[x2,n2]=stepseq(np,ns,nf);%单位阶跃序列的产生
n3=ns3:nf;x3=exp((-0.2+0.5j)*n3);%复数指数序列
subplot(2,2,1),stem(n1,x1);title('单位脉冲序列')
subplot(2,2,3),stem(n2,x2,'.');title('单位阶跃序列')
subplot(2,2,2),stem(n3,real(x3),’x’);line([-5,10],[0,0])%画横坐标
title('复指数序列'),ylabel('实部')
subplot(2,2,4),stem(n3,imag(x3),'filled');
line([-5,10],[0,0]),ylabel('虚部')
程序运行结果如图2.2.1所示。
在程序中采用了stem绘图函数来代替plot。因为plot是用来画连续曲线的,它自动把各点用直线连接起来,所以不适于表现脉冲序列。本例中几条绘图语句stem使用了不同的“点形”输入参数,因此各条曲线上的标志方式不同,读者可以参照其进行使用。stem命令在绘制序列时用得很频繁,要熟悉它的用法。在后面的程序中,将省略大同小异的subplot、xlabel、title,以及plot、stem、line等绘图和标注语句。
(5)正余弦序列(thesine/cosinesequence)
其中?为以弧度为单位的相角,例如,要产生
0≤n≤10
可以用下列MATLAB语句:
n=[0:10];x=3*cos(0.1*pi*n+pi/3)+2*sin(0.5*pi*n);
(6)随机序列(randomsequence)
许多实际的序列是不能用确定性的数学式来描述的,对这些序列称之为随机序列。在MATLAB中,有两种基本的人造的随机序列(也称伪随机序列)可供调用。Rand(N,M)函数产生在[0,1]均匀分布的N?M元随机矩阵。Randn(N,M)则产生均值为0,方差为1的N?M元正态分布高斯随机矩阵。
……