在介绍完“离散时间序列”基本概念和性质后,实际上就已经踏入了“数字信号处理”这门学科的学习征程,这篇文章里主要去说明“线性时不变系统”的定义概念和探讨“周期采样”的注意细节,相信更加理解这些概念定义和底层逻辑,对于大家在后期的工程应用中会有更多启发价值。
这里不由地多写一些题外话,可能会引起不少朋友共鸣,笔者读高中时学化学和生物,依稀记得高中比初中的内容要深很多并且老师上课讲得很快,一时间灌入很多概念和公式,那时也没有现在这么多一对一辅导补课,都是传统大班教育,老师上课讲过布置作业,课后同学买练习册刷题巩固,但是这样的学习方式延续到高三就较为吃力,特别是生物感到很多东西都见过,考试时成绩却很不好。
这时生物老师告诉了一个方法叫“回归课本”,于是笔者在高三中期少刷题、多看书。因为刷题见了很多概念上的应用,再回过头看书上的概念,一些模糊的知识点就慢慢清晰了,坚持下来到高三后期化学和生物成绩就提高很快,会发现虽然题型在不断变化,但是都在那些知识点中来回变换。
一晃眼已经硕士毕业工作六年了,有时回想起高中和本科学习过程,真的也会感到很多似曾相识,比如本科学习一个专业,学校会给开设很多门专业课,但是大部分只在学习理论概念,为了保研考研大家又要延续了高中时期的苦学精神,但是即便笔试和上机成绩很好,面对现实项目又不知所学专业知识的具体应用在哪里,大学老师通常也只是就课本概念问题给予一些解答,所以说本科学习可能更多的则是眼界上的提升、思维上的扩展。
毕业后工作学习不断积累经验,这时再去看一些本科时期枯燥的专业课才会豁然开朗,慢慢有更多的感性认识和理性认识,所以撰写“数字信号处理基础知识”专栏的初衷即是采用“回归课本”方式加深理解理论概念,再通过实例去说明理论概念在具体项目中的应用,感性和理性层面深刻理解“底层逻辑”和“实施细节”。
首先来举例说明“线性时不变系统”的概念,阅读国内外不同版本的“数字信号处理”类书籍,发现对这个概念给出了不唯一的解释,当然这并不是核心问题,我们更应该从底层逻辑上理解其意义而不仅仅是字面上的定义。
“线性”这个术语生活中也经常会用到,直观上的感觉比如初中学的一次函数y = kx+b,自变量x和因变量y是满足线性关系的,但是这样感性认识在定义一个概念时就显得不那么准确,这里关于“线性系统”的判断有个重要的标准,则需要满足“叠加原理”,即这类的输出是各个输入分别加到该系统后所得的各个输出的叠加或求和。
我们假设一个系统为T[•],那么“线性系统”的叠加原理可以用公式化表示:
- 可加性:设 y1 (n) = T[x1 (n)],y2 (n) = T[x2 (n)],如果T[x1 (n)+x2 (n)] = T[x1 (n)] + T[x2 (n)] =y1 (n)+y2 (n),则说明系统 T[•] 满足可加性;
- 齐次性:设 y1 (n) = T[x1 (n)] ,如果T[a1x1 (n)] = a1T[x1 (n)] = a1 y1 (n),则说明系统T[•]满足齐次性;
同样也举例来说明:假设对于一个离散系统,其输出定义为:y(n) = -0.5* x(n),即输出序列的振幅等于负的1/2输入序列的振幅,若输入序列x(n)表示1Hz的正弦波,采样率为每周期采样32个样本值,在这里我们用matlab来绘制其图形。
如图1所示是matlab下生成正弦波的绘图程序,当然每个工程师可能也有自己的使用习惯,这里为了便于说明我们按照x(n) = sin (2π*f0*n*ts)的格式来书写。
首先解释下程序中matlab用到的几个函数:1. sin()即正弦绘制函数;2. subplot(m,n,p) 即将当前图窗划分为 mxn 网格,并在 p 指定的位置创建坐标区,因为有2个函数x和y图形要绘制且在同一张视图下,所以m=2,n=1即绘图上下分割开,p=1代表绘图坐标在上,p=2代表绘图坐标在下;3. stem(n,x)即在 n 指定的值的位置绘制数据序列x,可以通俗理解成以n为横坐标,x为纵坐标进行绘图;4. axis([xmin xmax ymin ymax]) 即用来标注输出的图线的最大值最小值;5. xlabel(),ylabel()即标注输出的图线横纵坐标的标签值。
在这里我们设置采样周期Ts是1/32,待采波形的频率是1Hz,n = 0:64则表示从时间点0开始采样64个点,调用matlab下相关函数即可生成如图2所示的绘图,细节上可以对照图2再加深理解不过多赘述。
图1 matlab绘制x(n)和y(n)正弦采样图形的程序
图2 matlab绘制x(n)和y(n) = -0.5* x(n)正弦采样图形
类似的我们再用matlab生成序列x1(n)表示1Hz的正弦波和序列x2(n)表示3Hz的正弦波,如图3所示采样率均为每周期采样32个样本值,y(n)表示-0.5*(x1(n)+x2(n)),大家可以发现对于系统y(n) = -0.5* x(n)是满足“线性系统”的叠加原理。
图3 matlab绘制x1(n)、x2(n)、y(n) = -0.5*(x1(n)+x2(n))正弦采样图形
再来看一个例子y(n) = x2 (n),还是用大家熟知的三角函数进行推算验证,假设x(n)用来描述一个频率f0等于1Hz的正弦波序列即x(n) = sin (2π*f0*n*ts) = sin (2π*1*n*ts),若x(n)是输入序列,则系统的输出序列y(n)是1Hz正弦波的平方,即y(n) = x2 (n) = sin (2π*1*n*ts)* sin (2π*1*n*ts)。
高中数学里学过三角函数变换sinA*sinB = (1/2)[cos(A-B) - cos(A+B)],代入其中可得:
y(n) = sin(2π*1*n*ts)*sin(2π*1*n*ts)
= 1/2*[cos(2π*1*n*ts-2π*1*n*ts) - cos(2π*1*n*ts+2π*1*n*ts)]
= 1/2*[cos(0) - cos(2π*2*n*ts)]
= 1/2*[1 - cos(2π*2*n*ts)]
显然在这里我们输入x(n)是1Hz的正弦波,而输出y(n)却得到了0Hz直流成分和2Hz的正弦波混合,所以不满足“线性系统”的叠加原理,如图所示是用matlab绘制的x(n)和y(n) = x2 (n)正弦采样图形。
图4 matlab绘制x(n)和y(n) = x2 (n)正弦采样图形
“时不变系统”也有的教科书也叫“移不变系统”,顾名思义就是说系统输入序列的时间延迟会引起系统输出序列相等的时间延迟。当然也有更加书面化的表达方式,比如国内课本给出定义:若系统响应与激励加于系统的时刻无关,则系统为移不变或时不变系统,即若有 y(n) = T[x(n)],则有y(n-m) = T[x(n-m)]成立。
同样的为了有助于理解,这里也举例说明假设原始的输入序列是x(n)为振幅为1个单位、频率为1Hz的正弦波,其输出为y(n)= -0.5* x(n),那么考虑一个新的序列x`(n) = x(n+4)即x`(n)等于左移4个采样点的x(n),即x`(0) = x(4)、x`(1) = x(5)、x`(2) = x(6)等,这个系统便是时不变的,因为输出序列y`(n) = y(n)向左移4个样值,即y`(n) = y(n+4),不难发现y`(0) = y(4) 、y`(1) = y(5)、y`(2) = y(6)。
同时具有线性和时不变性的离散时间系统称为LSI系统,LSI系统也是“数字信号处理”中主要的研究对象,也许写到这里大家还不能确切地知道什么是卷积,什么是频率响应,亦或者什么是傅里叶变换,不过不必着急在后面的博客中,笔者会循循渐进层层深入,从理论推演到现实应用详细地讨论它们。