从线性代数的角度理解线性时不变系统和信号响应
这篇也是之前写在知乎上的一个答案,不过后来发现答非所问,无所谓,在这重新总结一下。线性时不变系统和信号响应是信号与系统理论中两个非常基本的观点,从线性代数的角度理解起来非常清晰。首先,来看线性代数中的一个非常基本的概念:
线性映射(Linear Map)
设想有个向量v,通过某种映射可以从v得到w,记为\(w=T\left( v \right)\)。如果对于任意v,w,T都满足线性代数里两条巨基本的性质:
1) \(T\left( u+v \right)=T\left( u \right)+T\left( v \right)\)
2) \(aT\left( v \right)=T\left( av \right)\)
那么就称T是一个线性映射。其实说通俗了就是简单的加法而已。从信号与系统的观点看来,如果我们把输入信号和输出信号分别和v和w对应起来的话,似乎就是个简单的线性映射系统啊。当然实际上没有这么简单,还多了那么一点东西,所以在信号与系统里,叫做:
线性时不变(Linear Time-Invariant, LTI)系统
什么叫时不变呢?以冲击函数为例子说明一下,假设在t=0的位置上有个单位冲击,在某个LTI system中,造成的响应是在t=1到t=2区间上的某种曲线。
时不变的意思就是如果把这个t=0上的单位冲击移动到任意时间点,比如t0去,那么响应的曲线也会响应地移动到t=t0+1到t=t0+2的位置上去。
结合之前线性系统的定义,整个系统是线性的,所以是线性+时不变。简单来说就是输入信号怎么个叠加法,输出信号就怎么叠加。
其实从线性代数角度也可以理解线性时不变系统,本质还是线性映射。比如考虑对如下对一个向量的变换:
\[\left( \begin{matrix}
0 \\
0 \\
x \\
0 \\
\end{matrix} \right)=\left( \begin{matrix}
0 & 0 & 0 & 0 \\
1 & 0 & 0 & 0 \\
0 & 1 & 0 & 0 \\
0 & 0 & 1 & 0 \\
\end{matrix} \right)\left( \begin{matrix}
0 \\
x \\
0 \\
0 \\
\end{matrix} \right)\]
矩阵的特点是紧贴着对角线下的元素是1,其他的元素都是0,得到的结果是x“向下移”了一个位置。如果我们在输入信号离散的时间轴上取一段,想象每个离散的时间点就是向量的一维,那么可以把这段信号看做一个向量,用一个同样大的具有如上特点的矩阵与这个向量相乘,得到的结果就是这个输入信号在时间轴上“移动了”一个离散时间单位,那么如果变换矩阵是如下的形式呢?
\[\left( \begin{matrix}
0 \\
0 \\
0 \\
x \\
\end{matrix} \right)=\left( \begin{matrix}
0 & 0 & 0 & 0 \\
0 & 0 & 0 & 0 \\
1 & 0 & 0 & 0 \\
0 & 1 & 0 & 0 \\
\end{matrix} \right)\left( \begin{matrix}
0 \\
x \\
0 \\
0 \\
\end{matrix} \right)\]
可以看到,x移动了两个单位,这似乎就是时间轴上的移动操作啊。那如果变换矩阵再换换样子呢?
\[\left( \begin{matrix}
0 \\
0 \\
ax \\
0 \\
\end{matrix} \right)=\left( \begin{matrix}
0 & 0 & 0 & 0 \\
a & 0 & 0 & 0 \\
0 & a & 0 & 0 \\
0 & 0 & a & 0 \\
\end{matrix} \right)\left( \begin{matrix}
0 \\
x \\
0 \\
0 \\
\end{matrix} \right)\]
是不是觉得眼熟,其实这种斜边元素相等形式的矩阵变换就可以看成是一个简单的线性时不变系统(忽略两边的元素)。如果我们把每个时间点都理解成一个向量中的一维的话,矩阵乘法操作的本质就是将这个向量投射到对应的维上。而这种对角矩阵行向量平移后得到的矩阵就相当于每一维上的投影进行了平移,对应时域就是时不变。所以不用被时不变的概念困扰,说白了还是个线性系统。
信号响应
了解了线性时不变系统,由卷积求信号的响应的方法就可以看成是一个线性系统中的叠加,说白了就是简简单单的加法而已:已知冲激信号在输出中的响应的情况下,给定一个输入信号,只要把输入信号看成一个个时间点上的冲激信号的叠加,那么\(t\)时刻的输出就是简单地把许许多多冲激输入对应的输出在\(t\)时刻的叠加。我们可以想象在输入的时间轴上取\(0\),如果这个位置的输入是\(\delta \left( 0 \right)\),在\(t\)的响应是\(h\left( t \right)\),根据线性时不变特性,如果在\(1\)位置上有个\(\delta \left( 1 \right)\)的话,在\(t+1\)处也会形成大小为\(h\left( t \right)\)的一个响应,那么这个响应成分在\(t\)位置的大小就应该是\(h\left( t-1 \right)\),如果在\(t+1\)位置上不是单位冲激而是\(0.5\delta \left( 1 \right)\)的话,相应地在\(t\)的响应幅度就是\(0.5h\left( t-1 \right)\),所以如果在\(1\)位置上的值是\(f\left( 1 \right )\)的话,那么冲激大小幅度就是\(f\left( 1 \right )\),相应地在\(t\)的响应幅度就是\(f\left( 1 \right )h\left( t-1 \right)\)。图形化的例子就是上面讲线性时不变部分里的最后一个示意图。所以把整个时间轴的输入都考虑到并相加,写出来就是:
\[\cdots +f\left( n-1 \right)h\left( t-\left( n-1 \right) \right)+f\left( n \right)h\left( t-n \right)+f\left( n+1 \right)h\left( t-\left( n+1 \right) \right)+\cdots =\sum\limits_{\tau }{f\left( \tau \right)}h\left( t-\tau \right)=f*h\left( t \right)\]
这就是离散卷积求响应的公式,对应前面解释来看,\(f(n)\)是输入信号在n位置的值,也就是和单位冲激信号的比值,作为系数。而\(h(t-n)\)则是和t时刻相距n的时间点上的一个冲激信号在对应的输出响应。