8.1.1典型离散信号的表示
如果信号的自变量和函数值都取连续值,称为时域连续信号,如果自变量取离散值,函数取连续值,则称这种信号为时域离散信号,这种信号通常来源于模拟信号的采样,如果信号的自变量和函数值均取离散值,则称为数字信号。
离散时间信号通常用x(n)表示,时间变量n取整数,代表离散的时刻,x(n)是一个离散序列。在Matlab中,用两个向量x,n来表示离散信号序列,向量n是x(n)的位置向量,向量x是x(n)的样值向量。
1. 单位脉冲序列

[例8-1]产生单位脉冲序列,离散时间n从-1到10,x(0)=1,并绘棒状图。
程序如下,输出棒状图如图8-1所示。

图8-1单位冲激序列
编写产生单位脉冲序列函数如下:
function [x,n]=imp_seq(ns,ne,n0)
%此函数产生冲激序列,ns表示起始点,ne是终止点,n0为脉冲点
n=[ns:ne];
x=[(n-n0)==0];
可以应用imp_seq函数产生单位冲激序列,例如:
>> [x,n]=imp_seq(-1,10,0);stem(n,x);
2. 单位阶跃序列

编写单位阶跃序列函数如下:
function [x,n]=step_seq(ns,ne,n0)
%此函数产生阶跃序列,ns表示起始点,ne是终止点,n0为阶跃点
n=[ns:ne];
x=[n-n0>=0];
3. 实指数序列

编写实指数序列函数如下:
function [x,n]=exp_seq(ns,ne,a)
%此函数产生实指数序列,ns表示起始点,ne是终止点
n=[ns:ne];
x=a.^n;
4. 门序列(矩形序列)

编写门序列函数如下:
function [x,n]=squ_seq(ns,ne,n1,n2)
%此函数产生门序列
n=[ns:ne];
x=[(n-n1>=0)&(n-n2<0)];
例如,产生离散时间n从-1到10,x(0)=1,x(1)=1,x(2)=1的门序列。产生门序列可以应用门序列函数或直接编程。
>> [y,n]=squ_seq(-1,10,0,3);
也可以应用两个阶跃函数相减产生。
>> [x1,n]=step_seq(-1,10,0);
>> [x2,n]=step_seq(-1,10,3);
>> y=x1-x2;
5. Sinc序列

运行以下命令,将产生一个Sinc序列,输出图形如图8-2所示。
n=[-100:100];
y=sinc(n/25);
stem(n,y,'.')

图8-2sinc序列
6. 随机信号
Matlab提供了可以产生各种概率密度分布的随机变量序列,如前面介绍过的产生均匀分布的rand函数与产生高斯分布的randn函数。下面简单介绍random函数,它是一个可以用于产生各种常用分布的函数,其格式如下:
Y=random('name',a1,a2,a3,m,n);
说明:name用于指定分布,相应的分布参数由a1,a2,a3指定,m与n指定函数产生的随机矩阵的行数和列数。运行以下命令将产生均值为零,方差为1正态分布的随机序列,如图8-3所示。
n=[0:100];
y=random('norm',0,1,size(n)); stem(n,y,'.');

图8-3应用random函数产生的随机序列
8.1.2信号序列的基本运算
信号序列的运算包含相加、相乘、移位、反褶、卷积等基本运算。
1. 信号序列的相加与相乘
信号序列的相加或相乘是指序列对应相同时间位置的序列值的相加与相乘。相加或相乘时,首先要将两序列位置向量延拓至同长度,再逐点相加或相乘序列值。
例:编写两个信号序列相加函数。
function [y,n]=sigadd(x1,n1,x2,n2)
n=min(min(n1),min(n2)):max(max(n1),max(n2));
y1=zeros(1,length(n));
y2=y1;
y1(find((n>=min(n1))&(n<=max(n1))==1))=x1;
y2(find((n>=min(n2))&(n<=max(n2))==1))=x2;
y=y1+y2;
说明:函数首先将原两个位置向量中的最小值、最大值作为新位置向量n的起始位置、终止位置,产生与位置向量n等长的全零新向量y1、y2,然后将原x1、x2向量对应相同位置的样值赋给新向量,最后完成样值向量y1、y2相加。注意find函数功能返回非零元素的下标值。
[例8-2]利用信号相加函数,实现两路序列相加。
%序列1
n1=-1:2;
x1=[1 2 3 5];
subplot(3,1,1),stem(n1,x1);axis([-2,5,0,6]);
%序列2
n2=0:4;
x2=[1 2 1 2 1];
subplot(3,1,2),stem(n2,x2);axis([-2,5,0,6]);
%信号相加
[y,n]=sigadd(x1,n1,x2,n2);
subplot(3,1,3),stem(n,y);axis([-2,5,0,6]);
说明:在函数sigadd执行中,局部变量新位置向量n从-1到4,y1、y2同n等长,且初值取零,n1是从-1到2,则“(n>=min(n1))&(n<=max(n1))”结果是“[1 1 1 1 0 0]”,使find(…)返回的下标值是1到4,此处语句“y1(find(…))=x1;”相当执行了“y1([1 2 3 4])=x1;”,同理,y2进行了相同操作,这样就得到了延拓至同长度的y1与y2,最后y1与y2对应元素的相加。程序结果如图8-4所示。

图8-4 信号相加
信号相乘,只需要将最后一条语句改为“y=y1.*y2;”,另取函数名与文件名即可。
2. 移位
序列移位的数学描述是

m表示右移的长度。函数如下。
function [y,n]=sigshift(x,n,m)
% y(n)=x(n-m),m表示右移的长度
n=n+m;
y=x;
例如:调用移位函数,实现对已知序列的移位,结果如图8-5所示。
n=-1:2;
x=[1 2 3 5];
subplot(2,1,1),stem(n,x);axis([-2,6,0,6]);
[y,n]=sigshift(x,n,3);
subplot(2,1,2),stem(n,y);axis([-2,6,0,6]);

图8-5信号序列的移位
3. 序列反褶
序列反褶的数学描述是:

函数如下:
function [y,n]=sigfold(x,n)
y=fliplr(x);
n=-fliplr(n)
例如:调用反褶函数,实现已知序列的反褶,结果如图8-6所示。
n=[-1,0,1,2];
x=[4,3,2,1];
subplot(2,1,1),stem(n,x);axis([-3,3,0,5]);
[y,n]=sigfold(x,n);
subplot(2,1,2),stem(n,y);axis([-3,3,0,5]);

图8-6序列反褶
4. 卷积运算
两序列卷积运算的数学描述为:

两序列卷积在Matlab中可以利用conv(x1,x2)实现,
必须长度有限。还要注意,函数conv计算的是两个从原点开始的序列的卷积,因此需要先将两个序列移到原点再用conv函数。

x1=[1,2,3];
n1=-1:1;
x2=[2,4,3,5];
n2=0:3;
x=conv(x1,x2)
ns=n1(1)+n2(1);
ne=n1(length(x1))+n2(length(x2)); % ne=n1(end)+n2(end);
n=ns:ne
程序运行结果为:
x =
2 8 17 23 19 15
n =
-1 0 1 2 3 4
function[y,ny]=conv_m(x,nx,h,nh)
%计算卷积
nyb=nx(1)+nh(1);
nye=nx(length(x))+nh(length(h));
ny=[nyb:nye];
y=conv(x,h);
5. 相关运算
两序列相关运算的数学描述为:

两序列相关运算在Matlab中可以利用xcorr(x1,x2)函数实现,若
具有相同的长度m,则相关序列长度为2m-1。不等长,则短者将自动添补零,使之等长
nx=20;nh=10;
n1=0:nx-1;
x=(0.9).^n1;
n2=0:nh-1;
h=ones(1,nh);
y=xcorr(x,h);
subplot(3,1,1),stem(n1,x);axis([-1,20,0,1.1]);
subplot(3,1,2),stem(n2,h);axis([-1,20,0,1.1]);
subplot(3,1,3),stem(0:(2*nx-1-1),y);axis([-1,40,0,8.1]);

图8-7相关运算
6. 周期延拓
周期延拓的数学描述为:

其中M表示延拓周期。周期延拓可应用mod函数实现。
[例8-5]实现已知序列的周期延拓,并图示结果。
M=8; %原序列长度为8
N=40; %周期延拓为40
n=0:N-1;
x1=(0.8).^n;
x2=[(n>=0)&(n<M)];
x=x1.*x2; %将原序列长度增加到40,前M个值不变
xc=zeros(1,N);
xc=x(mod(n,M)+1);
subplot(2,1,1),stem(n,x,'.');
subplot(2,1,2),stem(n,xc,'.');

图8-8周期延拓
下面再举例说明如何应用上述函数。
程序如下,结果如图8-9所示。
%产生h(n)
n=[0:19];
hn=ones(1,20);
h=hn.*(power(0.8,n));
%产生x(n)
[xn1,n1]=imp_seq(0,20,0);
[xn2,n2]=sigshift(xn1, n1,20);
[xn3, n3]=sigshift(xn1,n1,40);
xn2=2*xn2;
xn3=4*xn3;
[xn,nx]=sigadd(xn1,n1,xn2,n2);
[xn,nx]=sigadd(xn,nx, xn3,n3);
%计算卷积
[y,ny]=conv_m(xn,nx,h,n);
subplot(3,1,1),stem(n,h); title('h(n)');
subplot(3,1,2),stem(nx,xn); title('x(n)');
subplot(3,1,3),stem(ny, y); title('x(n)*h(n)');

图8-9卷积计算
7.信号的能量和功率
对连续时间信号x(t)和离散时间信号x(n),其能量分别定义为

如果
,x(t)和x(n)则被称为能量有限信号,能量有限信号也叫能量信号;如果
,则称为能量无限信号。若x(t)和x(n)的能量无限,这时通常研究它们的功率。信号x(t)和x(n)的功率分别定义为

如果
,则称x(t)和x(n)为功率有限信号,功率有限信号也称为功率信号。周期信号、准周期信号及随机信号,由于其时间是无限的,所以它们总是功率信号。一般在有限区间内存在的确定性信号是能量信号。