深入浅出讲解卷积

卷积是什么?

离散域

离散域的要简单得多,所以我先讲离散域的。
下文中的$*$表示卷积,而不是乘法。

卷积这名字听着就是高大上,但却是个非常简单实用的概念。
通常意义下,卷积描述的下面这种运算:
$$y[n]=\sum_{a+b=n} x_1[a]x_2[b]$$
其中$x_1$和$x_2$是两个序列,$y$是卷积出来的序列。

是不是发现上面这个公式简单粗暴,比信号书上好看的多,当然信号书上会给你这么一个公式:
$$y[n]=\sum_{a=-\infty}^{a=+\infty} x_1[a]x_2[n-a]$$
你会发现这两个公式说的是同一个东西,但是,却会给出不同的计算卷积的方法。
信号书会告诉你卷积计算要分以下三步:

翻转
平移
求和

但是卷积算法的初衷真的是这样的吗?笔者所理解的卷积是两个影响因子互相叠加的过程。

第一个例子

现在你有两堆棍子,每根棍子的长度可能相同,可能不同,现在问,我分别从这两堆中拿一根棍子出来,连接出长度为n的棍子的方法有多少种

通过处理我们可以得到这样两个序列:
$x_1[a]$表示第一堆中长度为$a$的棍子的个数。
$x_2[b]$表示第二堆中长度为$b$的棍子的个数。
用$y[n]$表示组合出来长度为$n$的方案数。
那么怎么求$y[n]$?显然,我们知道:$y[n]=\sum_{a+b=n} x_1[a]x_2[b]$。
这个过程就是离散域卷积。换句话说$y=x_1*x_2$。
反观这个例子,我们发现$y[n]$是$x_1$和$x_2$中合适的项不断贡献的结果。

第二个例子

乘法

乘法?想必大家都是会的,但是大家有想过竖式乘法到底是个怎样的过程吗?没错,这就是个非常典型的卷积过程。
我们还是从贡献的角度来谈,在纸上画画若干位乘以若干位的过程,就会发现如果不考虑加法进位,那么最后加法的过程其实就是将合适的项的贡献值叠加起来。
笔者想这就是卷积的名字的来源吧。

第三个例子

多项式乘以多项式

这和乘法的想法是一样的,每两个项的系数积都被叠加到了其指数和的对应项中。

连续域

离散与连续的联系就在以下两点上

求和与积分
差分和微分

为了便于书写公式,连续域我采用信号书上的写法:
$$\int_{-\infty}^{+\infty} f(\tau)g(t-\tau)d\tau$$
这个公式表征凡是两个序列中下标相加为$t$的值都会对卷积结果中的$t$有贡献。

第四个例子

秋千

大家都玩过秋千,现在不考虑复杂的力学,我们假设秋千的摆动幅度仅仅由冲量(就是推的那一下)和时间决定,并且摆动幅度正比于冲量(换句话说就是你用3倍的力量推一下,秋千的摆幅也会是普通力量的3倍)。
现在定义$x(t)$表示在$t$时刻,用$x(t)$的力道推一下。当然既然是连续时间,那么就是一直推,不停的推。
$h(t)$表示用标准的力道在时刻$0$推一下,秋千的摆动幅度随时间变化规律。
$y(t)$表示在$t$时刻秋千的摆动幅度。
想象一下$y(t)$是由哪些东西贡献出来的:

如果我在时刻2用3的力道推了一下秋千,$x(2)=3$
这时产生一个独立于其他推的影响,$x(2)h(t-2)$
这个影响会影响整个时间域
每个时刻的推都会产生这种影响

通过上述的思考过程,我们就能得到$$y(t)=\int_{-\infty}^{+\infty} x(\tau)h(t-\tau)d\tau$$


计算方法

对于计算机来说,没有连续的概念,计算都是针对离散的。当然可以暴力计算,不过复杂度是$O(n^2)$的。对于卷积来说,我们可以使用快速傅里叶算法来计算,复杂度是O(nlogn),这个留到以后再讲。


未涉及的内容

循环卷积
我也不知道