卷积

在泛函分析中，卷积（convolution），或译为叠积、褶积或旋积，是透过两个函数$f$和$g$生成第三个函数的一种数学算子，表征函数$f$与经过翻转和平移的$g$的乘积函数所围成的曲边梯形的面积。如果将参加卷积的一个函数看作区间的指示函数，卷积还可以被看作是“滑动平均”的推广。

## 定义

卷积是数学分析中一种重要的运算。设：$f(t)$和$g(t)$是实数$\mathbb{R}$上的两个可积函数，定义二者的卷积$(f * g)(t)$为如下特定形式的积分变换：

$$(f * g)(t) \triangleq \int_{-\infty}^{\infty} f(\tau) g(t - \tau)\, \mathrm{d}\tau$$

$(f * g)(t)$仍为可积函数，并且有着：

$$(f * g)(t) \triangleq \int_{-\infty}^\infty f(t - \tau) g(\tau)\, d\tau = (g * f)(t)$$

函数$f$和$g$，如果只支撑在$[0, \infty]$之上，则积分界限可以截断为：

$(f * g )(t) = \int_{0}^{t} f(\tau) g(t - \tau)\, d\tau \quad$对于$\ f, g : [0, \infty) \to \mathbb{R}$

对于两个得出复数值的多元实变函数，可以定义二者的卷积为如下形式的多重积分：

$$\begin{align} (f * g)(t_1,t_2,\cdots,t_n) &\triangleq \int\int\cdots\int_{\Reals^n} f(\tau_1,\tau_2,\cdots,\tau_n) g(t_1 - \tau_1,t_2 - \tau_2,\cdots,t_n - \tau_n,)\, d\tau_1 d\tau_2 \cdots d\tau_n \\ <pre> &\triangleq \int_{\Reals^n} f(\tau)g(t-\tau)\,d^n\tau </pre> \end{align}$$

卷积有一个通用的工程上的符号约定：

$$f(t) * g(t) \triangleq \underbrace{\int_{-\infty}^\infty f(\tau) g(t - \tau)\, d\tau}_{(f * g )(t)}$$

它必须被谨慎解释以避免混淆。例如：$f(t) * g(t- t_0)$等价于$(f*g) (t - t_0)$，而$f(t - t_0)*g(t - t_0)$却实际上等价于$(f*g)(t - 2 t_0)$。

## 历史

卷积运算的最早使用出现在达朗贝尔于1754年出版的《宇宙体系的几个要点研究》中对泰勒定理的推导之中。还有西尔维斯特·弗朗索瓦·拉克鲁瓦，将$\int f(u)\cdot g(x - u) \, du$类型的表达式，用在他的1797年–1800年出版的著作《微分与级数论文》中。此后不久，卷积运算出现在皮埃尔-西蒙·拉普拉斯、约瑟夫·傅里叶和西梅翁·泊松等人的著作中。这个运算以前有时叫做“Faltung”（德语中的折叠）、合成乘积、叠加积分或卡森积分。

“卷积”这个术语早在1903年就出现了，然而其定义在早期使用中是相当生僻的，直到1950年代或1960年代之前都未曾广泛使用。

## 简介

如果$f$和$g$都是在Lp 空间$L^1(\Reals^n)$内的勒贝格可积函数，则二者的卷积存在，并且在这种情况下$f * g$也是可积的。这是托内利定理的结论。对于在$L^1$中的函数在离散卷积下，或更一般的对于在任何群的上的卷积，这也是成立的。同样的，如果$f \in L^1(\Reals^n)$而$g \in L^p(\Reals^n)$，这里的$1 \le p \le \infty$，则$f * g \in L^p(\Reals^n)$，并且其Lp 范数间有着不等式：

$$\|{f}* g\|_p\le \|f\|_1\|g\|_p$$

在$p=1$的特殊情况下，这显示出$L^1$是在卷积下的巴拿赫代数（并且如果$f$和$g$几乎处处非负则两边间等式成立）。

卷积与傅里叶变换有着密切的关系。例如两函数的傅里叶变换的乘积等于它们卷积后的傅里叶变换，利用此一性质，能简化傅里叶分析中的许多问题。

由卷积得到的函数$f*g$，一般要比$f$和$g$都光滑。特别当$g$为具有紧支集的光滑函数，$f$为局部可积时，它们的卷积$f * g$也是光滑函数。利用这一性质，对于任意的可积函数$f$，都可以简单地构造出一列逼近于$f$的光滑函数列$f_s$，这种方法称为函数的光滑化或正则化。

函数$f(t)$和$g(t)$的互相关$(f \star g)(\tau)$，等价于$f(-\tau)$的共轭复数$\overline{f(-\tau)}$与$g(\tau)$的卷积：

$$(f \star g)(\tau) \triangleq \int_{-\infty}^{\infty} \overline{f(t-\tau)} g(t)\,dt = \overline{f(-\tau)} * g(\tau)$$

这里的$\tau$叫做移位（displacement）或滞后（lag）。

对于单位脉冲函数$\delta(t)$和某个函数$h(t)$，二者得到的卷积就是$h(t)$本身，此$h(t)$被称为冲激响应：

$$(\delta * h)(t) = \int_{-\infty}^\infty \delta(\tau) h(t - \tau)\, d\tau = h(t)$$

在连续时间线性非时变系统中，输出信号$y(t)$被描述为输入信号$x(t)$与冲激响应$h(t)$的卷积：

$$y(t) = (x * h)(t) \ \triangleq \ \int\limits_{-\infty}^{\infty} x(t - \tau)\cdot h(\tau) \, \mathrm{d}\tau = \int\limits_{-\infty}^\infty x(\tau)\cdot h(t - \tau) \,\mathrm{d}\tau$$

两个独立的随机变量$U$和$V$，每个都有一个概率密度函数，二者之和的概率密度，是它们单独的密度函数的卷积：

$$f_{U+V}(x) = \int_{-\infty}^\infty f_U(y) f_V(x - y)\,dy = \left( f_{U} * f_{V} \right) (x)$$

## 图解

- 已知右侧第一行图中两个函数$f(t)$和$g(t)$。#首先将两个函数都用约束变量$\tau$来表示，并将$g(\tau)$翻转至纵轴另一侧，从而得到右侧第二行图中$f(\tau)$和$g(-\tau)$。#向函数$g(-\tau)$增加一个时间偏移量$t$，得到函数$g(-(\tau-t))=g(t-\tau)$。$t$不是常数而是自由变量，当$t$取不同值时，$g(t-\tau)$能沿着$\tau$轴“滑动”。如果$t$是正值，则$g(t-\tau)$等于$g(-\tau)$沿着$\tau$轴向右（朝向$+\infty$）滑动数量$t$。如果$t$是负值，则$g(t-\tau)$等价于$g(-\tau)$向左（朝向$-\infty$）滑动数量$|t|$。#让$t$从$-\infty$变化至$+\infty$，当两个函数交会时，计算交会范围中两个函数乘积的积分值。换句话说，在时间$t$，计算函数$f(\tau)$经过权重函数$g(t - \tau)$施以权重后其下的面积。右侧第三、第四和第五行图中，分别是$t=0$、$t=2.5$和$t=5.5$时的情况，从$t > 1$时开始有交会，例如在第四行图中，$\tau=0$则$g(t-\tau)=g(2.5)$，$\tau=1.5$则$g(t-\tau)=g(1)$，对于$\tau \notin [0, 1.5]$有着$f(\tau)g(t-\tau)=0$。:最后得到的波形（未包含在此图中）就是$f$和$g$的卷积。｜

<image>

两个矩形脉冲波的卷积。其中函数$g$首先对$\tau=0$反射，接着平移$t$，成为$g(t-\tau)$。那么重叠部分的面积就相当于$t$处的卷积，其中横坐标代表待变量$\tau$以及新函数$f\ast g$的自变量$t$。｜

<image>

矩形脉冲波和指数衰减脉冲波的卷积（后者可能出现于RC电路中），同样地重叠部分面积就相当于$t$处的卷积。注意到因为$g$是对称的，所以在这两张图中，反射并不会改变它的形状。｜

<image>

## 周期卷积

两个$T$周期的函数$h_{_T}(t)$和$x_{_T}(t)$的“周期卷积”定义为：

$$\int_{t_0}^{t_0+T} h_{_T}(\tau) x_{_T}(t - \tau)\,d\tau$$

这里的$t_0$是任意参数。

任何绝对可积分函数$s(t)$，都可以通过求函数$s(t)$的所有整数倍$P$的平移的总和，从而制作出具有周期$P$的周期函数 $s_{_P}(t)$，这叫做周期求和：

$$s_{_P}(t) \triangleq \sum_{m=-\infty}^\infty s(t + mP) = \sum_{m=-\infty}^\infty s(t - mP), \quad m \in \mathbb{Z}$$

对于无周期函数$h$与$x$，其周期$T$的周期求和分别是$h_{_T}(t)$与$x_{_T}(t)$，$h$与$x$的周期卷积，可以定义为$h(t)$与$x_{_T}(t)$的常规卷积，或$x(t)$与$h_{_T}(t)$的常规卷积，二者都等价于$h_{_T}(t)$与$x_{_T}(t)$的周期积分：

$$(h *x_{_T})(t) \ \triangleq\ \ \int_{-\infty}^\infty h(\tau) x_{_T}(t - \tau)\,d\tau \ = \ \int_{t_0}^{t_0+T} h_{_T}(\tau) x_{_T}(t - \tau)\,d\tau$$

$$(h *x_{_T})(t) = (x * h_{_T})(t)$$

圆周卷积是周期卷积的特殊情况，其中函数$h$和$x$二者的非零部分，都限定在区间$[0,T]$之内，此时的周期求和称为“周期延拓”。$h *x_{_T}$中函数$x_{_T}$可以通过取非负余数的模除运算表达为“圆周函数”：

$$x_{_T}(t) = x(t_{\mathrm{mod}\ T}), \quad t\in\mathbb{R}$$

而积分的界限可以缩简至函数$h$的长度范围$[0,T]$：

$$(h *x_{_T})(t) = \int_{0}^{T} h(\tau) x((t - \tau)_{\mathrm{mod}\ T})\ d\tau$$

## 离散卷积

<image>

对于定义在整数$\mathbb{Z}$上且得出复数值的函数$f[n]$和$g[n]$，离散卷积定义为：

$$(f * g)[n]\ \ \triangleq \ \sum_{m=-\infty}^{\infty} {f[m] g[n-m]} = \sum_{m=-\infty}^\infty f[n-m]\, g[m]$$

这里一样把函数定义域以外的值当成零，所以可以扩展函数到所有整数上（如果本来不是的话）。两个有限序列的卷积的定义，是将这些序列扩展成在整数集合上有限支撑的函数。在这些序列是两个多项式的系数之时，这两个多项式的普通乘积的系数，就是这两个序列的卷积。这叫做序列系数的柯西乘积。

当$g[n]$的支撑集为有限长度的$\{-M,-M+1,\dots,M-1,M\}$之时，上式会变成有限求和：

$$(f*g)[n]=\sum_{m=-M}^M f[n-m]g[m]$$

### 多维离散卷积

<image>

类似于一维情况，使用星号表示卷积，而维度体现在星号的数量上，$M$维卷积就写为$M$个星号。下面是$M$维信号的卷积的表示法：

$$y(n_1,n_2,...,n_{_M})=h(n_1,n_2,...,n_{_M})* \overset{M}{\cdots} *x(n_1,n_2,...,n_{_M})$$

对于离散值的信号，这个卷积可以直接如下这样计算：

$$\sum_{k_1=-\infty}^{\infty} \sum_{k_2=-\infty}^{\infty}...\sum_{k_{_M}=-\infty}^{\infty} h(k_1,k_2,...,k_{_M})x(n_1-k_1,n_2-k_2,...,n_{_M}-k_{_M})$$

结果的离散多维卷积所支撑的输出区域，基于两个输入信号所支撑的大小和区域来决定。

<image>

### 离散周期卷积

<image>

对于离散序列和一个参数$N$，无周期函数$h$和$x$的“周期卷积”是为：

$$(h * x_{_N})[n] \ \triangleq \ \sum_{m=-\infty}^\infty h[m] \underbrace{x_{_N}[n-m]}_{\sum_{k=-\infty}^\infty x[n -m -kN]} \ = \ \sum_{m=0}^{N-1} \left(\sum_{k=-\infty}^\infty {h}[m - kN]\right) x_{_N}[n - m]$$

这个函数有周期$N$，它有最多$N$个唯一性的值。$h$和$x$的非零范围都是$[0, N-1]$的特殊情况叫做圆周卷积：

$$(h * x_{_N})[n] = \sum_{m=0}^{N-1} h[m] x_{_N}[n - m] = \sum_{m=0}^{N-1} h[m] x[(n - m)_\bmod{N}]$$

离散圆周卷积可简约为矩阵乘法，这里的积分变换的核函数是循环矩阵:

$$\begin{bmatrix} y_0 \\ y_1 \\ \vdots \\ y_{_{N-1}}\end{bmatrix} = <pre> \begin{bmatrix} h_0 & h_{_{N-1}} & \cdots & h_{1} \\ h_1 & h_0 & \cdots & h_2 \\ \vdots & \vdots & \ddots & \vdots \\ h_{_{N-1}} & h_{_{N-2}} & \cdots & h_{0} \end{bmatrix} \begin{bmatrix} x_0 \\ x_1 \\ \vdots \\ x_{_{N-1}}\end{bmatrix}$$

圆周卷积最经常出现的快速傅里叶变换的实现算法比如雷德算法之中。

## 性质

### 代数

各种卷积算子都满足下列性质：

交换律：$$f * g = g * f \,$$

结合律：$$f * (g * h) = (f * g) * h \,$$

分配律：$$f * (g + h) = (f * g) + (f * h) \,$$

数乘结合律：$$a (f * g) = (a f) * g = f * (a g) \,$$

其中$a$为任意实数（或复数）。

复数共轭：$$\overline{f * g} = \overline{f} * \overline{g}$$

微分有关：$$(f * g)' = f' * g = f * g'$$

积分有关：如果$F(t) = \int^t_{-\infty} f(\tau) d\tau$，并且$G(t) = \int^t_{-\infty} g(\tau) \, d\tau$，则有：

$$(F * g)(t) = (f * G)(t) = \int^t_{-\infty}(f * g)(\tau)\,d\tau$$

### 积分

如果$f$和$g$是可积分函数，则它们在整个空间上的卷积的积分，简单的就是它们积分的乘积：

$$\int_{\Reals^n}(f * g)(t) \, d^nt=\left(\int_{\Reals^n}f(t) \, d^nt\right) \left(\int_{\Reals^n}g(t) \, d^nt\right)$$

这是富比尼定理的结果。如果$f$和$g$只被假定为非负可测度函数，根据托内利定理，这也是成立的。

### 微分

在一元函数情况下，$f$和$g$的卷积的导数有着：

$$\frac{d}{dt}(f * g) = \frac{df}{dt} * g = f * \frac{dg}{dt}$$

这里的$\frac{d}{dt}$是微分算子。更一般的说，在多元函数的情况下，对偏导数也有类似的公式：

$$\frac{\partial}{\partial t_i}(f * g) = \frac{\partial f}{\partial t_i} * g = f * \frac{\partial g}{\partial t_i}$$

这就有了一个特殊结论，卷积可以看作“光滑”运算：$f$和$g$的卷积可微分的次数，是$f$和$g$的总数。

这些恒等式成立的严格条件，为$f$和$g$是绝对可积分的，并且至少二者之一有绝对可积分（$L^1$）弱导数，这是Young卷积不等式的结论。

在离散情况下，差分算子$\Delta[f](n) = f(n+1)-f(n)$满足类似的关系：

$$\Delta(f * g) = (\Delta f) * g = f * (\Delta g)$$

## 卷积定理

卷积定理指出，在适当的条件下，两个函数（或信号）的卷积的傅里叶变换，是它们的傅里叶变换的逐点乘积。更一般的说，在一个域（比如时域）中的卷积等于在其他域（比如频域）逐点乘法。

设两个函数$g(x)$和$h(x)$，分别具有傅里叶变换$G(s)$和$H(s)$：

$$\begin{align} G(s) &\triangleq \mathcal{F}\{g\}(s) = \int_{-\infty}^{\infty}g(x) e^{-i 2 \pi s x} \, dx, \quad s \in \mathbb{R}\\ H(s) &\triangleq \mathcal{F}\{h\}(s) = \int_{-\infty}^{\infty}h(x) e^{-i 2 \pi s x} \, dx, \quad s \in \mathbb{R} \end{align}$$

这里的$\mathcal{F}$算子指示傅里叶变换。

卷积定理声称：

$$\mathcal{F}\{g * h\}(s) = G(s) H(s) , \quad s \in \mathbb{R}$$

$$\mathcal{F}\{g \cdot h\}(s) = G(s)*H(s), \quad s \in \mathbb{R}$$

应用逆傅里叶变换$\mathcal{F}^{-1}$产生推论：

$$(g * h)(s) = \mathcal{F}^{-1}\{G\cdot H\} , \quad s \in \mathbb{R}$$

$$(g \cdot h)(s) = \mathcal{F}^{-1} \{G * H\} , \quad s \in \mathbb{R}$$

这里的算符$\, \cdot \,$指示逐点乘法。

这一定理对拉普拉斯变换、双边拉普拉斯变换、Z变换、梅林变换和Hartley变换等各种傅里叶变换的变体同样成立。在调和分析中还可以推广到在局部紧致的阿贝尔群上定义的傅里叶变换。

### 周期卷积

对于周期为$P$的函数$g_{_P}(x)$和$h_{_P}(x)$，可以被表达为二者的周期求和：

$$\begin{align} g_{_P}(x)\ &\triangleq \sum_{m=-\infty}^{\infty} g(x-mP), \quad m \in \mathbb{Z}\\ h_{_P}(x)\ &\triangleq \sum_{m=-\infty}^{\infty} h(x-mP), \quad m \in \mathbb{Z} \end{align}$$

它们的傅里叶级数系数为：

$$\begin{align} <pre> G[k] &\triangleq \mathcal{F}\{g_{_P}\}[k] = \frac{1}{P} \int_P g_{_P}(x) e^{-i 2\pi k x/P} \, dx, \quad k \in \mathbb{Z} \\ H[k] &\triangleq \mathcal{F}\{h_{_P}\}[k] = \frac{1}{P} \int_P h_{_P}(x) e^{-i 2\pi k x/P} \, dx, \quad k \in \mathbb{Z} \end{align}$$

这里的$\mathcal{F}$算子指示傅里叶级数积分。

逐点乘积$g_{_P}(x)\cdot h_{_P}(x)$的周期也是$P$，它的傅里叶级数系数为：

$$\mathcal{F}\{g_{_P}\cdot h_{_P}\}[k] = (G*H)[k]$$

周期卷积$(g_{_P} * h)(x)$的周期也是$P$，周期卷积的卷积定理为：

$$\mathcal{F}\{g_{_P} * h\}[k] =\ P\cdot G[k]\ H[k]$$

### 离散卷积

对于作为两个连续函数采样的序列$g[n]$和$h[n]$，它们具有离散时间傅里叶变换$G(s)$和$H(s)$：

$$\begin{align} G(s) &\triangleq \mathcal{F}\{g\}(s) = \sum_{n=-\infty}^{\infty} g[n]\cdot e^{-i 2\pi s n}\;, \quad s \in \mathbb{R} \\ H(s) &\triangleq \mathcal{F}\{h\}(s) = \sum_{n=-\infty}^{\infty} h[n]\cdot e^{-i 2\pi s n}\;, \quad s \in \mathbb{R} \end{align}$$

这里的$\mathcal {F}$算子指示离散时间傅里叶变换（DTFT）。

离散卷积的卷积定理为：

$$\mathcal{F}\{g * h\}(s) =\ G(s) H(s)$$

### 离散周期卷积

对于周期为$N$的序列$g_{_N}[n]$和$h_{_N}[n]$：

$$\begin{align} g_{_N}[n]\ &\triangleq \sum_{m=-\infty}^{\infty} g[n-mN], \quad m,n \in \mathbb{Z} \\ h_{_N}[n]\ &\triangleq \sum_{m=-\infty}^{\infty} h[n-mN], \quad m,n \in \mathbb{Z} \end{align}$$

相较于离散时间傅里叶变换$G(s)$和$H(s)$的周期是$1$，它们是按间隔$1/N$采样$G(s)$和$H(s)$，并在$N$个采样上进行了逆离散傅里叶变换（DFT-1或IDFT）的结果。

离散周期卷积$(g_{_N} * h)[n]$的周期也是$N$。离散周期卷积定理为：

$$\mathcal{F}\{g_{_N} * h\}[k] =\ \underbrace{\mathcal{F}\{g_{_N}\}[k]}_{G(k/N)} \cdot \underbrace{\mathcal{F}\{h_{_N}\}[k]}_{H(k/N)}, \quad k,n \in \mathbb{Z}$$

这里的$\mathcal{F}$算子指示长度$N$的离散傅里叶变换（DFT）。

它有着推论：

$$(g_{_N} * h)[n] =\ \mathcal{F}^{-1}\{\mathcal{F}\{g_{_N}\} \cdot \mathcal{F}\{h_{_N}\}\}$$

对于其非零时段小于等于$N$的$g$和$h$，离散圆周卷积的卷积定理为：

$$(g_{_N} * h)[n] =\ \mathcal{F}^{-1}\{\mathcal{F}\{g\} \cdot \mathcal{F}\{h\}\}$$

## 推广

卷积的概念还可以推广到数列、测度以及广义函数上去。函数$f,g$是定义在$\mathbb{R}^n$上的可测函数（measurable function），$f$与$g$存在卷积并记作$f * g$。如果函数不是定义在$\mathbb{R}^n$上，可以把函数定义域以外的值都规定成零，这样就变成一个定义在$\mathbb{R}^n$上的函数。

若G是有某m 测度的群（例如豪斯多夫空间上哈尔测度下局部紧致的拓扑群），对于G上m-勒贝格可积的实数或复数函数f和g，可定义它们的卷积：

$$(f * g)(x) = \int_G f(y)g(xy^{-1})\,dm(y) \,$$

对于这些群上定义的卷积同样可以给出诸如卷积定理等性质，但是这需要对这些群的表示理论以及调和分析的彼得-外尔定理。

## 离散卷积的计算方法

计算卷积$f[n]*g[n]$有三种主要的方法，分别为

- 直接计算（Direct Method）
- 快速傅立叶转换（FFT）
- 分段卷积（sectioned convolution）

方法1是直接利用定义来计算卷积，而方法2和3都是用到了FFT来快速计算卷积。也有不需要用到FFT的作法，如使用数论转换。

### 方法1：直接计算

- 作法：利用卷积的定义

$$y[n] = f[n]*g[n] = \sum_{m=0}^{M-1} f[n-m]g[m]$$

- 若$f[n]$和$g[n]$皆为实数信号，则需要$MN$个乘法。
- 若$f[n]$和$g[n]$皆为更一般性的复数信号，不使用复数乘法的快速算法，会需要$4MN$个乘法；但若使用复数乘法的快速算法，则可简化至$3MN$个乘法。

因此，使用定义直接计算卷积的复杂度为$O(MN)$。

### 方法2：快速傅立叶转换

- 概念：由于两个离散信号在时域（time domain）做卷积相当于这两个信号的离散傅立叶转换在频域（frequency domain）做相乘：

$$y[n] = f[n]*g[n] \leftrightarrow Y[f] = F[f]G[f]$$

可以看出在频域的计算较简单。

- 作法：因此这个方法即是先将信号从时域转成频域：

$$F[f] = DFT_P(f[n]), G[f] = DFT_P(g[n])$$

于是

$$Y[f] = DFT_P(f[n])DFT_P(g[n])$$

最后再将频域信号转回时域，就完成了卷积的计算：

$$y[n] = IDFT_P{DFT_P(f[n])DFT_P(g[n])}$$

总共做了2次DFT和1次IDFT。

- 特别注意DFT和IDFT的点数$P$要满足$P \ge M+N-1$。
- 由于DFT有快速算法FFT，所以运算量为$O(P\log_{2}P)$
- 假设$P$点DFT的乘法量为$a$，$f[n]$和$g[n]$为一般性的复数信号，并使用复数乘法的快速算法，则共需要$3a + 3P$个乘法。

### 方法3：分段卷积

- 概念：将$f[n]$切成好几段（section），每一段分别和$g[n]$做卷积后，再将结果相加。
- 作法：先将$f[n]$切成每段长度为$L$的区段（$L > M$），假设共切成S段：

$$f[n](n=0,1,...,N-1) \to f_1[n], f_2[n], f_3[n], ..., f_S[n] (S= \left \lceil \frac{N}{L} \right \rceil)$$

Section 1: $f_1[n] = f[n] , n=0,1,...,L-1$

Section 2: $f_2[n] = f[n+L], n=0,1,...,L-1$

$$\vdots$$

Section r: $f_r[n] = f[n+(r-1)L], n=0,1,...,L-1$

$$\vdots$$

Section S: $f_S[n] = f[n+(S-1)L], n=0,1,...,L-1$

$f[n]$为各个section的和

$f[n] = \sum_{r=1}^{S} f_r[n+(r-1)L]$。

因此。

$y[n] = f[n]*g[n] = \sum_{r=1}^{S} \sum_{m=0}^{M-1} f_r[n+(r-1)L-m]g[m]$。

每一小段作卷积则是采用方法2，先将时域信号转到频域相乘，再转回时域：

$y[n] = IDFT( \sum_{r=1}^{S} \sum_{m=0}^{M-1} DFT_P(f_r[n+(r-1)L-m])DFT_P(g[m])), P \ge M+L-1$。

- 总共只需要做$P$点FFT $2S+1$次，因为$g[n]$只需要做一次FFT。
- 假设$P$点DFT的乘法量为$a$，$f[n]$和$g[n]$为一般性的复数信号，并使用复数乘法的快速算法，则共需要$(2S+1)a+3SP$个乘法。
- 运算量：$\frac{N}{L}3(L+M-1)[\log_{2}(L+M-1)+1]$
- 运算复杂度：$O(N)$，和$N$呈线性，较方法2小。
- 分为 Overlap-Add 和 Overlap-Save 两种方法。

分段卷积: Overlap-Add

欲做$x[n]*h[n]$的分段卷积分，$x[n]$ 长度为 $N <pre>$，$h[n]$ 长度为 $M$,

Step 1: 将$x[n]$每 $L$ 分成一段

Step 2: 再每段 $L$ 点后面添加 $M-1$ 个零，变成长度 $L+M-1$

Step 3: 把 $h[n]$ 添加 $L-1$个零，变成长度 $L+M-1$的 $h'[n]$

Step 4: 把每个 $x[n]$ 的小段和 $h'[n]$ 做快速卷积，也就是$IDFT_{L+M-1}\{{DFT_{L+M-1}(x[n])DFT_{L+M-1}(h'[n])} \}$，每小段会得到长度 $L+M-1$ 的时域讯号

Step 5: 放置第 $i$ 个小段的起点在位置 $L\times i$ 上, $i=0, 1, ...,\lceil \frac{N}{L} \rceil-1$

Step 6: 会发现在每一段的后面 $M-1$ 点有重叠，将所有点都相加起来，顾名思义 Overlap-Add，最后得到结果

举例来说:

$x[n]=[1, 2, 3, 4, 5, -1, -2, -3, -4, -5, 1, 2, 3, 4, 5]$, 长度 $N=15$

$h[n]=[1, 2, 3]$, 长度 $M=3$

令 $L=5$

<image>

- xn和hn

令 $L=5$ 切成三段，分别为 $x_0[n], x_1[n], x_2[n]$, 每段填 $M-1$ 个零，并将 $h[n]$ 填零至长度 $L+M-1$

<image>

- 分段xn

将每一段做$IDFT_{L+M-1}\{{DFT_{L+M-1}(x[n])DFT_{L+M-1}(h'[n])} \}$

<image>

- 分段运算结果

若将每小段摆在一起，可以注意到第一段的范围是 $0\thicksim6$，第二段的范围是 $5\thicksim 11$，第三段的范围是 $10\thicksim 16$，三段的范围是有重叠的

<image>

- 合并分段运算结果

最后将三小段加在一起，并将结果和未分段的卷积做比较，上图是分段的结果，下图是没有分段并利用快速卷积所算出的结果，验证两者运算结果相同。

<image>

- 结果比较图

分段卷积: Overlap-Save

欲做$x[n]*h[n]$的分段卷积分，$x[n]$ 长度为 $N <pre>$，$h[n]$ 长度为 $M$,

Step 1: 将 $x[n]$ 前面填 $M-1$ 个零

Step 2: 第一段 $i=0$, 从新的 $x[n]$ 中 $L\times i- (M-1)\times i$ 取到 $L\times (i+1)- (M-1)\times i -1$ 总共 $L$ 点当做一段，因此每小段会重复取到前一小段的 $M-1$ 点，取到新的一段全为零为止

Step 3: 把 $h[n]$ 添加 $L-M$ 个零，变成长度 $L$ 的 $h'[n]$

Step 4: 把每个 $x[n]$ 的小段和 $h'[n]$ 做快速卷积，也就是$IDFT_{L}\{{DFT_{L}(x[n])DFT_{L}(h'[n])} \}$，每小段会得到长度 $L$ 的时域讯号

Step 5: 对于每个 $i$ 小段，只会保留末端的 $L-(M-1)$ 点，因此得名 Overlap-Save

Step 6: 将所有保留的点合再一起，得到最后结果

举例来说:

$x[n]=[1, 2, 3, 4, 5, 6,7, 8, 9, 10, 11, 12, 13, 14, 15]$, 长度 $N=15$

$h[n]=[1, 2, 3]$, 长度 $M=3$

令 $L=7$

<image>

- xn和hn

将 $x[n]$ 前面填 $M-1$ 个零以后，按照 Step 2 的方式分段，可以看到每一段都重复上一段的 $M-1$ 点

<image>

- 分段xn

再将每一段做 $IDFT_{L}\{{DFT_{L}(x[n])DFT_{L}(h'[n])} \}$以后可以得到

<image>

- 分段运算结果

保留每一段末端的 $L-(M-1)$ 点，摆在一起以后，可以注意到第一段的范围是 $0\thicksim 4$，第二段的范围是 $5\thicksim 9$，第三段的范围是 $10\thicksim 14$，第四段的范围是 $15\thicksim 16$，四段的范围是没有重叠的

<image>

- 合并分段运算结果

将结果和未分段的卷积做比较，下图是分段的结果，上图是没有分段并利用快速卷积所算出的结果，验证两者运算结果相同。

<image>

- 结果比较图

至于为什么要把前面 $M-1$ 丢掉?

以下以一例子来阐述:

$x[n]=[1, 2, 3, 4, 5, 6,7, 8, 9, 10]$, 长度 $L=10$。

$h[n]=[1, 2, 3, 4, 5]$, 长度 $M=5$,

第一条蓝线代表 $y$ 轴，而两条蓝线之间代表长度 $L$，是在做快速折积时的周期

<image>

- xn和hn

当在做快速折积时$IDFT_{L}\{{DFT_{L}(x[n])DFT_{L}(h'[n])} \}$，是把讯号视为周期 $L$，在时域上为循环折积分,

而在一开始前 $M-1$ 点所得到的值，是 $h[0], h[6], h[7], h[8], h[9]$ 和 $x[0], x[6], x[7], x[8], x[9]$ 内积的值。

然而 $h[6], h[7], h[8], h[9]$ 这 $M-1$ 个值应该要为零，以往在做快速折积时长度为 $L+M-1$ 时不会遇到这些问题。

而今天因为在做快速折积时长度为 $L$ 才会把这 $M-1$ 点算进来，因此我们要丢弃这 $M-1$ 点内积的结果

<image>

- 循环折积

为了要丢弃这 $M-1$ 点内积的结果，位移 $h[-n]$ $M-1$ 点，并把位移以后内积合的值才算有效。

<image>

- 位移以后内积

### 应用时机

以上三种方法皆可用来计算卷积，其差别在于所需总体乘法量不同。基于运算量以及效率的考量，在计算卷积时，通常会选择所需总体乘法量较少的方法。

以下根据$f[n]$和$g[n]$的长度（$N, M$）分成5类，并列出适合使用的方法：

- $M$为一非常小的整数 - 直接计算
- $M \ll N$ - 分段卷积
- $M \approx N$ - 快速傅里叶变换
- $M \gg N$ - 分段卷积
- $N$为一非常小的整数 - 直接计算

基本上，以上只是粗略的分类。在实际应用时，最好还是算出三种方法所需的总乘法量，再选择其中最有效率的方法来计算卷积。

### 例子

Q1：当$N = 2000, M = 17$，适合用哪种方法计算卷积?

Ans：

方法1：所需乘法量为$3MN = 102000$

方法2：$P \ge M+N-1 = 2016$，而2016点的DFT最少乘法数$a = 12728$，所以总乘法量为$3(a+P) = 44232$

方法3：

若切成8块（$S = 8$），则$L = 250, P \ge M+L-1=266$。选$P = 288$，则总乘法量为$(2S+1)a+3SP = 26632$，比方法1和2少了很多。

但是若要找到最少的乘法量，必须依照以下步骤

(1)先找出$L$:解$L$ : $\frac{\partial {\frac{N}{L}3(L+M-1)[\log_{2}(L+M-1)+1]}}{\partial L}=0$

(2)由$P \ge L+M-1$算出点数在$P$附近的DFT所需最少的乘法量，选择DFT的点数

(3)最后由$L = P+1-M$算出$L_{opt}$

因此。

(1)由运算量对$L$的偏微分为0而求出$L = 85$

(2)$P \ge L+M-1 = 101$，所以选择101点DFT附近点数乘法量最少的点数$P = 96$或$P = 120$。

(3-1)当$P = 96 \to a = 280, L = P+1-M = 80 \to S = 25$，总乘法量为$(2S+1)a+3SP = 21480$。

(3-2)当$P = 120 \to a = 380, L = P+1-M = 104 \to S = 20$，总乘法量为$(2S+1)a+3SP = 22780$。

由此可知，切成20块会有较好的效率，而所需总乘法量为21480。

- 因此，当$N = 2000, M = 17$，所需总乘法量：分段卷积<快速傅立叶转换<直接计算。故，此时选择使用分段卷积来计算卷积最适合。

Q2：当$N = 1024, M = 3$，适合用哪种方法计算卷积?

Ans：

方法1：所需乘法量为$3MN = 9216$

方法2：$P \ge M+N-1 = 1026$，选择1026点DFT附近点数乘法量最少的点数，$\to P = 1152, a = 7088$。

因此，所需乘法量为$3(a+P) = 24342$

方法3：

(1)由运算量对$L$的偏微分为0而求出$L = 5$

(2)$P \ge L+M-1 = 7$，所以选择7点DFT附近点数乘法量最少的点数$P = 8$或$P = 6$或$P = 4$。

(3-1)当$P = 8 \to a = 4, L = P+1-M = 6 \to S = 171$，总乘法量为$(2S+1)a+3SP = 5476$。

(3-2)当$P = 6 \to a = 4, L = P+1-M = 4 \to S = 256$，总乘法量为$(2S+1)a+3SP = 6660$。

(3-3)当$P = 4 \to a = 0, L = P+1-M = 2 \to S = 512$，总乘法量为$(2S+1)a+3SP = 6144$。

由此可知，切成171块会有较好的效率，而所需总乘法量为5476。

- 因此，当$N = 1024, M = 3$，所需总乘法量：分段卷积<直接计算<快速傅立叶转换。故，此时选择使用分段卷积来计算卷积最适合。
- 虽然当$M$是个很小的正整数时，大致上适合使用直接计算。但实际上还是将3个方法所需的乘法量都算出来，才能知道用哪种方法可以达到最高的效率。

Q3：当$N = 1024, M = 600$，适合用哪种方法计算卷积?

Ans：

方法1：所需乘法量为$3MN = 1843200$

方法2：$P \ge M+N-1 = 1623$，选择1026点DFT附近点数乘法量最少的点数，$\to P = 2016, a = 12728$。

因此，所需乘法量为$3(a+P) = 44232$

方法3：

(1)由运算量对$L$的偏微分为0而求出$L = 1024$

(2)$P \ge L+M-1 = 1623$，所以选择1623点DFT附近点数乘法量最少的点数$P = 2016$。

(3)当$P = 2016 \to a = 12728, L = P+1-M = 1417 \to S = 1$，总乘法量为$(2S+1)a+3SP = 44232$。

由此可知，此时切成一段，就跟方法2一样，所需总乘法量为44232。

- 因此，当$N = 1024, M = 600$，所需总乘法量：快速傅立叶转换 = 分段卷积<直接计算。故，此时选择使用分段卷积来计算卷积最适合。

## 应用

<image>

卷积在科学、工程和数学上都有很多应用：

- 代数中，整数乘法和多项式乘法都是卷积。
- 卷积神经网络应用了多重级联的卷积核心 (图像处理)，它被用于机器视觉和人工智能，尽管在多数情况下实际上用的是互相关而非卷积。
- 在非人工智能的图像处理中，用作图像模糊、锐化、边缘检测。
- 统计学中，加权的滑动平均是一种卷积。
- 概率论中，两个统计独立变量X与Y的和的概率密度函数是X与Y的概率密度函数的卷积。
- 声学中，回声可以用源声与一个反映各种反射效应的函数的卷积表示。
- 电子工程与信号处理中，任一个线性系统的输出都可以通过将输入信号与系统函数（系统的冲激响应）做卷积获得。
- 物理学中，任何一个线性系统（符合叠加原理）都存在卷积。

## 外部链接

- Earliest Uses: The entry on Convolution has some historical information.
- Convolution, on The Data Analysis BriefBook
- http://www.jhu.edu/~signals/convolve/index.html Visual convolution Java Applet
- http://www.jhu.edu/~signals/discreteconv2/index.html Visual convolution Java Applet for discrete-time functions
- https://get-the-solution.net/projects/discret-convolution discret-convolution online calculator
- https://lpsa.swarthmore.edu/Convolution/CI.html Convolution demo and visualization in javascript
- https://phiresky.github.io/convolution-demo/ Another convolution demo in javascript
- Lectures on Image Processing: A collection of 18 lectures in pdf format from Vanderbilt University. Lecture 7 is on 2-D convolution., by Alan Peters
- * https://archive.org/details/Lectures_on_Image_Processing
- Convolution Kernel Mask Operation Interactive tutorial
- Convolution at MathWorld
- Freeverb3 Impulse Response Processor : Opensource zero latency impulse response processor with VST plugins
- Stanford University CS 178 interactive Flash demo showing how spatial convolution works.
- A video lecture on the subject of convolution given by Salman Khan
- Example of FFT convolution for pattern-recognition (image processing)
- Intuitive Guide to Convolution A blogpost about an intuitive interpretation of convolution.