本节书摘来自异步社区《MATLAB信号处理超级学习手册》一书中的第2章,第2.1节,作者:MATLAB技术联盟 , 史洁玉著,更多章节内容可以访问云栖社区“异步社区”公众号查看
第2章 时间信号与系统
一个离散时间信号是一个整数值变量n的函数,表示为x(n)或{x(n)}。尽管独立变量n不一定表示“时间”(例如,n可以表示温度或距离),但x(n)一般被认为是时间的函数。因为离散时间信号x(n)对于非整数值n是没有定义的。
离散时间信号的波形绘制在MATLAB中一般用stem函数。stem函数的基本用法和plot函数一样,它绘制的波形图的每个样本点上有一个小圆圈,默认是空心的。如果需要实心,需使用参数“fill”、“filled”,或者参数“.”。
由于MATLAB中矩阵元素的个数有限,所以MATLAB只能表示一定时间范围内有限长度的序列;而对于无限序列,也只能在一定时间范围内表示出来。
2.1 离散序列
MATLAB信号处理超级学习手册
离散时间信号是指在离散时刻才有定义的信号,简称离散信号,或者序列。离散序列通常用x(n)来表示,自变量必须是整数。
离散时间信号(Discrete-time Signal)是指在时间上取离散值,幅度取连续值的一类信号,可以用序列(Sequence)来表示。
序列是指按一定次序排列的数值x(n)的集合,表示为:
注意:其中n为整数,x(n)表示序列,对于具体信号,x(n)也代表第n个序列值。特别应当注意的是,x(n)仅当n为整数时才有定义,对于非整数,x(n)没有定义,不能错误地认为x(n)为零。
2.1.1 单位取样序列
单位取样序列(也称单位脉冲序列)δ(n),定义为:
单位取样序列δ(n)的特点是仅在时序列n=0时值为1,n取其他值时,序列值为0。它的地位与连续信号中的单位冲激函数δ(t)相当。不同的是n=0时δ(n)=1,而不是无穷大。
在MATLAB中,冲激序列可以用zeros函数实现,如要产生N点的单位取样序列,可以通过以下命令实现:
x=zeros(1,N);
x(1)=1;
【例2-1】编制程序产生单位取样序列δ(n)及δ(n-20),并绘制出图形。运行程序如下:
clear all
n=50;
x=zeros(1,n);
x(1)=1;
xn=0:n-1;
subplot(121);
stem(xn,x);
grid on
axis([-1 51 0 1.1]);
title('单位取样序列δ(n)')
ylabel('δ(n)');
xlabel('n');
k=20;
x(k)=1;
x(1)=0;
subplot(122);
stem(xn,x);
grid on
axis([-1 51 0 1.1]);
title('单位取样序列δ(n-20)')
ylabel('δ(n-20)');
xlabel('n');
运行结果如图2-1所示。
2.1.2 单位阶跃序列
单位阶跃序列(Unit Step Sequence)u(n),定义如下:
在MATLAB中,阶跃序列可以用ones函数实现,如要产生N点的单位阶跃序列,可以通过以下命令实现:
x=ones(1,N);
【例2-2】编制程序产生单位阶跃序列u(n)及u(n-20),并绘制出图形。运行程序如下:
clear all
n=50;
x=ones(1,n);
xn=0:n-1;
subplot(211);
stem(xn,x);
grid on
axis([-1 51 0 1.1]);
title('单位阶跃序列u(n)')
ylabel('u(n)');
xlabel('n');
x=[zeros(1,20),1,ones(1,29)];
subplot(212);
stem(xn,x);
grid on
axis([-1 51 0 1.1]);
title('单位阶跃序列u(n-20)')
ylabel('u(n-20)');
xlabel('n');
运行结果如图2-2所示。
2.1.3 矩形序列
矩形序列(Rectangular Sequence)定义为:
式中的N称为矩形序列的长度。符号R N(n)的下标N表示矩形序列的长度,如R 4(n)表示长度N=4的矩形序列。
单位取样序列δ(n),单位阶跃序列U(n)和矩形序列R N(n)之间的关系如下:
一般地,若序列y(n)与序列x(n)之间满足y(n)=x(n-k)的关系,则称y(n)为x(n)的移位(或延迟)序列。
2.1.4 正弦序列
正弦序列的定义如下:
式中ω称为正弦序列的数字域频率,单位为弧度,它表示序列变化的速率,或者表示相邻两个序列值之间相差的弧度数。
如果正弦序列是由连续信号采样得到的,那么:
因为在数值上序列值等于采样值,可以得到数字域频率与模拟角频率的关系为:
上式具有普遍意义,它表明由连续信号采样得到的序列,模拟角频率Ω与数字域频率ω成线性关系。再由采样频率f s与采样间隔T互为倒数,上式也可以写成下列形式:
上式表示数字域频率ω可以看作模拟角频率Ω对采样频率f s的归一化频率。
【例2-3】试用MATLAB命令绘制正弦序列x(n) = sin (frac{{npi }}{6}) 的波形图。运行程序如下:
clear all
n=0:39;
x=sin(pi/6*n);
stem(n,x);
xlabel('n')
ylabel('h(n)')
title('正弦序列')
axis([0,40,-1.5,1.5]);
grid on;
运行结果如图2-3所示。
2.1.5 实指数序列
实指数序列定义如下:
运行程序如下:
clear
n=0:10;
a1=1.2;a2=-1.2;a3=0.8;a4=-0.8;
x1=a1.^n;
x2=a2.^n;
x3=a3.^n;
x4=a4.^n;
subplot(221)
stem(n,x1,'fill');
grid on;
xlabel('n'); ylabel('h(n)');
title('x(n)=1.2^{n}')
subplot(222)
stem(n,x2,'fill');
grid on
xlabel('n'); ylabel('h(n)');
title('x(n)=(-1.2)^{n}')
subplot(223)
stem(n,x3,'fill');
grid on
xlabel('n') ; ylabel('h(n)');
title('x(n)=0.8^{n}')
subplot(224)
stem(n,x4,'fill');
grid on
xlabel('n'); ylabel('h(n)');
title('x(n)=(-0.8)^{n}')
运行程序如图2-4所示。
2.1.6 复指数序列
复指数序列定义为:
x(n) = e^{(a + jomega _0 )n}
(2-13)
当a=0时,得到虚指数序列x(n) = e^{jomega _0 n} ,式中ω 0是正弦序列的数字域频率。由欧拉公式知,复指数序列可进一步表示为:
与连续复指数信号一样,下面将复指数序列实部和虚部的波形分开讨论,得出如下结论:
(1)当a>0时,复指数序列x(n)的实部和虚部分别是按指数规律增长的正弦振荡序列;
(2)当a<0时,复指数序列x(n)的实部和虚部分别是按指数规律衰减的正弦振荡序列;
(3)当a=0时,复指数序列x(n)即为虚指数序列,其实部和虚部分别是等幅的正弦振荡序列。
【例2-5】用MATLAB命令画出复指数序列x(n) = 2e^{( - frac{1}{{10}} + jfrac{pi }{6})n} 的实部、虚部、模及相角随时间变化的曲线,并观察其时域特性。
运行程序如下:
clear
n=0:30;
A=2;a=-1/10;b=pi/6;
x=A*exp((a+i*b)*n);
subplot(2,2,1)
stem(n,real(x),'fill');
grid on
title('实部');
axis([0,30,-2,2]),xlabel('n')
subplot(2,2,2)
stem(n,imag(x),'fill');
grid on
title('虚部');
axis([0,30,-2,2]) ,xlabel('n')
subplot(2,2,3)
stem(n,abs(x),'fill'),grid on
title('模'),axis([0,30,0,2]) ,xlabel('n')
subplot(2,2,4)
stem(n,angle(x),'fill');
grid on
title('相角');
axis([0,30,-4,4]) ,xlabel('n')
运行结果如图2-5所示。
2.1.7 周期序列
如果对所有的n,关系式x(n)=x(n+N)均成立,且N为满足关系式的最小正整数,则定义x(n)为周期序列,其周期为N。
例如,对于正弦序列,设x(n) = Asin (omega _0 n + varphi ) ,那么x(n + N) = Asin [omega _0 (n + N) + varphi ] = Asin (omega _0 n + varphi + omega _0 N)
如果x(n)=x(n+N),则要求omega _0 N = 2pi k 或N = (2pi /omega _0 )k 。式中N和k均取整数,而且k的取值要保证N是最小的正整数。
对于具体的正弦序列周期(包括余弦序列及复指数序列)有以下3种情况:
(1)当2π/ω 0为整数时,k=1,该序列是以2π/ω 0为周期的周期序列。例如序列sin(πn/4),ω 0=π/4,2π/ω 0=8,该正弦信号的周期为8。
(2)当2π/ω 0不是整数,是一个有理数时,设2π/ω 0=P/Q,式中P、Q是整数,并且P/Q为最简分数;取k=Q,则该序列的周期N=P。例如sin(5πn/8),ω 0=5π/8,2π/ω 0=16/5,取k=5,该正弦信号的周期为16。
(3)当2π/ω 0是一个无理数时,任何整数都不能使N为正整数,则该序列不是周期序列。例如sin(2n/5),ω 0=2/5,2π/ω 0=5π,该正弦信号不是周期序列。
【例2-6】已知xleft( n right) = 0.8^n R_8 left( n right) ,利用MATLAB生成并图示x(n), x(n-m),x((n))8 R N(n),其中N=24,0
运行程序如下:
N=24;M=8;m=5;
%设移位值为5
n=0:N-1;
x1=0.8.^n;x2=[(n>=0)&(n<M)];
xn=x1.*x2;
%产生x(n)
[xm,nm]=sigshift(xn,n,m);
%产生x(n-m)
xc=xn(mod(n,8)+1);
%产生x(n)的周期延拓,求余后加1是因为MATLAB向量下标从开始
xcm=xn(mod(n-m,8)+1);
%产生x(n)移位后的周期延拓
subplot(2,2,1);stem(n,xn,'.');
axis([0,length(n),0,1]);title('x(n)')
subplot(2,2,2);stem(nm,xm,'.');
axis([0,length(nm),0,1]);title('x(n-5)')
subplot(2,2,3);stem(n,xc,'.');
axis([0,length(n),0,1]);title('x(n)的周期延拓')
subplot(2,2,4);stem(n,xcm,'.');
axis([0,length(n),0,1]);title('x(n)的循环移位')
运行结果如图2-6所示。
运行过程中用到的子程序为:
function[y,n]=sigshift(x,m,n0)
% y(n)=x(n-n0)
n=m+n0;y=x;