离散时间信号最基本的形式是定义在等间隔的时间离散值上,且在这些离散时间上的信号振幅值是连续的。离散时间系统则是输入为离散时间信号输出也是离散时间信号的系统。对于线性时不变(LTI)系统来说,我们可以发现LTI系统与该系统的冲激响应序列是完全等价的。因此在线性时不变条件下(大多数实际系统都能近似为LTI的),离散时间信号与离散时间系统实际是一致的,他们最后都是落脚于研究序列的时域和频域性质。
那么,本章我们将首先介绍离散时间信号和系统在时域中的表示方法和基本性质。同时,我们仅仅考虑LTI离散时间系统,例如后续章节中介绍的数字滤波器包括有限长和无限长冲激响应数字滤波器,所以离散时间信号和系统可以无差别对待。也就是说,序列(系统)的某些性质,同样适用于系统(序列),例如能量信号对应于稳定系统条件、信号的频率分析对应于系统的频谱响应。
离散时间信号
一般来说,离散时间信号可以通过对连续时间信号抽样来得到
其中,表示抽样间隔
实际生活中存在很多离散时间信号的例子,比如天气预报的结果,气温值在一天中每隔一个小时一次的预报就是一个典型的离散时间信号的例子。
当然,我们也可以通过软件仿真出离散时间信号,例如在Matlab中执行
xn = randn(10,1);
就能产生一个随机离散时间信号,长度为10.
上一章节中,我们也提到过,离散时间信号实际上包含两种形式:一种是抽样数据信号,其样本值是连续的;另一种是数字信号,其样本值是离散的.实际的数字信号处理系统所处理的信号都会采用舍入或者截断对样本值量化得到数字信号.对连续信号进行数字处理时,连续时间信号先后通过抽样保持电路和模数转换器得到其等效数字信号.期间对振幅的量化误差的影响,后续会接着介绍
1.1 离散时间信号的时域表示
在信号处理中,信号可以用数字序列来表示,该序列成为样本.
离散时间信号x[n]就表示序列x[n]在时刻n的振幅,而带有下划线(或者箭头标示)的样本点默认为n=0时刻的样本点x[0]。以此类推,这样我们就能定义x[1],x[−1],x[2]…等等。
除了通过数字序列来表示以外,离散时间信号还可以表示为一个矢量的形式,例如:
(后面那个T是T次方.N也是如此)
就定义了一个长度为N的离散时间信号,RN表示一个N维的实数域欧氏空间。
当然,对于长度无线的离散时间信号,我们也可以通过矢量来表示,只不过此时信号x不再属于欧氏空间.为了研究这一类问题,则有必要引入希伯特空间的概念
定义单位抽样序列为δ[n],
它表示的物理含义很明确,就是一个抽样器,表示当n=0时刻抽出一个样本值.那么同理,δ[n-1]就表示当n=1时刻抽出一个样本值,那么对于任意一个序列x[n],我们都可以通过这个单位抽样序列来表示
这个公式可以通过下面的这幅图来理解:
上面介绍是三种比较通用的离散时间信号的表示方法,同样对于某些具有显式表达式的离散时间信号,我们可以直接用它们的表达式来表示,例如
1.2 基本序列
下面将介绍几种基本序列:单位抽样序列、单位阶跃序列、指数衰减序列、窗序列和正弦序列
单位抽样序列
定义单位抽样序列为δ[n],
通过如下Matlab代码可以生成一个单位抽样序列。
% Generation of a Unit Sample Sequence clf; % Generate a vector from -10 to 20 n = -10:20; % Generate the unit sample sequence u = [zeros(1,10) 1 zeros(1,20)]; % Plot the unit sample sequence stem(n,u); xlabel('Time index n');ylabel('Amplitude'); title('Unit Sample Sequence'); axis([-10 20 0 1.2]);
单位阶跃序列
定义单位抽样序列为μ[n],
单位样本序列和单位阶跃序列之间的关系如下:
上述第一个公式中的第二个等号成立的原因是:
阶跃序列通常被用来将非因果序列转换成因果序列。
因果指数衰减序列
指数衰减序列可以用来描述很多实际的物理现象,例如热方程的解、RC电路的放电过程等等。
当衰减参数αα为复数,且幅度小于1时,信号x[n]x[n]不仅幅度会衰减,还会出现周期震荡现象
指数信号
% Generation of a complex exponential sequence clf; c = -(1/12)+(pi/6)*i; K = 2; n = 0:40; x = K*exp(c*n); subplot(2,1,1); stem(n,real(x)); xlabel('Time index n');ylabel('Amplitude'); title('Real part'); subplot(2,1,2); stem(n,imag(x)); xlabel('Time index n');ylabel('Amplitude'); title('Imaginary part');
% Generation of a real exponential sequence clf; n = 0:35; a = 1.2; K = 0.2; x = K*a.^n; stem(n,x); xlabel('Time index n');ylabel('Amplitude');
窗序列
窗序列可以将一个无限长序列h[n]转换成有限长序列
那么最终得到的序列x[n]长度就等于N2−N1+1
正弦序列
其中,ω为离散时间信号的归一化角频率,单位是弧度每样本,ϕ是相位,A是幅度值。
前面我们已经介绍了离散时间信号通常是通过对连续时间信号xa(t)均匀采样得到的,这两个信号之间的关系为
其中,Ts为采样周期。而且,连续时间信号的时间变量t与离散时间信号的时间变量n只在离散时刻tn相关联,且关系为
其中Fs=1/Ts为抽样频率,而Ωs=2πFs表示抽样角频率。
若连续时间信号为
则响应的离散时间信号就是本节开头定义的正弦序列x[n]。很容易,我们可以得到如下关系
而ω为离散时间信号的归一化角频率,单位是弧度每样本。
连续时间信号的角频率Ω0的单位是弧度每秒。
该序列肯定不是周期序列。
我们可以很容易证明,只有当正弦序列的归一化角频率ω满足如下条件时,该序列才是周期的
我们可以很容易证明下列连续时间正弦信号族
通过频率为Ωs抽样之后,能产生相同的抽样信号
同样的,我们也可以证明当ω2=ω1+2πk时,下面两个序列是相等的
复正弦序列
定义正弦序列为
根据欧拉公式,
那么
因此,我们可以将任意复数写成
,其中|A|表示复数A的幅度,
ϕ表示相位。而α记作
最后,可以得到该复正弦序列的实部为衰减的余弦序列,
虚部也是衰减的正弦序列
离散时间信号的分类
根据序列的长度,可以将序列分为有限长序列和无限长序列。对于无限长序列,还可以分为左边序列和右边序列。
根据序列的周期性,可以将序列分为周期序列和非周期序列。周期序列满足
且称满足上述公式的最小正整数NN为该序列的周期。
针对实数序列,根据序列的对称性,可以将序列分为奇对称序列和偶对称序列
同时,对于任意实数序列x[n],我们都可以将该序列通过如下方式分解成奇对称部分
和偶对称部分
很容易可以验证:
1.4 离散时间信号的基本运算
# 循环平移函数 x = np.linspace(0.1, 2 * np.pi, 41) y1 = np.sin(x) y2 = np.cos(2*x) def cshift(key,array): return np.append(array[-key:],array[:-key]) # 线性平移 def lshift(key,array): if key<0: return np.append(array[-key:],np.zeros([-key])) else: return np.append(np.zeros([key]),array[:-key]) ylr = np.flipud(y1) # flip left and right yls = lshift(-10,y1) # left shift yrs = lshift(10,y1) # right shift plt.subplot(221) plt.title('Original') plt.stem(x, y1) plt.subplot(222) plt.title('Reversal') plt.stem(x, ylr) plt.subplot(223) plt.title('Linear Shift -10') plt.stem(x, yls) plt.subplot(224) plt.title('Linear Shift 10') plt.stem(x, yrs) plt.show()
例:信号平滑
# 通过滑动平均平滑信号 R = 51 d = .8*np.random.normal(0,1,[R,]) n = np.arange(0,R,1) s = 2*n*(0.9**n) x = s+d x1 = np.concatenate((np.zeros([2,]),x),axis=0) x2 = np.concatenate((np.zeros([1,]),x,np.zeros([1,])),axis=0) x3 = np.concatenate((x,np.zeros([2,])),axis=0) # Average y1 = (x1+x2+x3)/3 y = y1[1:-1] # 绘制结果 fig = plt.figure(figsize=(5,5)) ax = fig.add_subplot(211) ax.plot(n,d,'r-',label='d[n]') ax.plot(n,s,'g--',label='s[n]') ax.plot(n,x,'b-',label='x[n]') ax.axis([0,50,-2,9]) plt.legend(loc='upper right') plt.ylabel('Amplitude') ax = fig.add_subplot(212) ax.plot(n,y,'r-',label='y[n]') ax.plot(n,s,'g--',label='s[n]') ax.axis([0,50,-2,9]) plt.legend(loc='upper right') plt.xlabel('Time index (n)') plt.ylabel('Amplitude') plt.show()
1.5 离散时间信号的卷积和相关
卷积
那么,可以根据定义编写如下卷积计算的Matlab函数。
function conv_dsp(x,y) lx = length(x); ly = length(y); M = lx+ly-1; x = [flipud(x(:));zeros(M,1)]; % 翻转 y = [y(:);zeros(lx-1,1)]; z = zeros(M,1); for i = 1:M xshift = wshift('1d',x,-i); % 移位 z(i) = sum(y.*xshift(lx+1:end)); %相乘求和 end end
x = [1,0,2,1,0,0,1] y = [2,0,1] z1 = conv_dsp(x,y) z2 = conv_dsp(y,x) x = 1 0 2 1 0 0 1 y = 2 0 1 z1 = 2 0 5 2 2 1 2 0 1 z2 = 2 0 5 2 2 1 2 0 1
例如序列x[n]={1,0,2,1,0,0,1}和序列y[n]={2,0,1}的卷积和按照表格法计算如下:
经过求和之后,得到最后的卷积结果为
卷积的性质
卷积的物理意义
- 信号合成的角度(与Dirac序列卷积)
- 信号分析的角度(与特定信号卷积)
相关
卷积与相关的关系
利用相关性
N = 50; n = 0:N-1; x = exp(-0.8*n); y = randn(1,N)+x; n1 = length(x)-1; r = conv(y,fliplr(y)); % 利用卷积计算相关,这里需要将第二个参数翻转。 k = (-n1):n1; stem(k,r); xlabel('Lag index');ylabel('Amplitude'); gtext('r_{yy}[n]');