深入浅出理解卷积的概念

📅 2026/7/1 1:53:43
深入浅出理解卷积的概念
前言在信号处理中卷积是一种必学的数学计算技巧。但是由于在学习卷积的过程中需要不断接触许多较为复杂的公式本人在学习卷积的过程中发现网上虽然有很多关于卷积的通俗解释但是关于不少细节上仍然缺少通俗易懂的例子初学者学习完后或许会出现一知半解的情况故写下此文章用通俗易懂的方式解释卷积。常见数学形式连续卷积对于两个连续函数f(t)f(t)f(t)和h(t)h(t)h(t)其卷积定义为(f∗h)(t)∫−∞∞f(τ) h(t−τ) dτ (f * h)(t) \int_{-\infty}^{\infty} f(\tau) \, h(t - \tau) \, d\tau(f∗h)(t)∫−∞∞​f(τ)h(t−τ)dτ离散卷积对于两个离散序列f[n]f[n]f[n]和h[n]h[n]h[n]其卷积定义为(f∗h)[n]∑k−∞∞f[k] h[n−k] (f * h)[n] \sum_{k-\infty}^{\infty} f[k] \, h[n - k](f∗h)[n]k−∞∑∞​f[k]h[n−k]卷积数学公式的简单理解在深入理解卷积之前只需简单记住卷积其实就是在以时间为自变量的函数图像上一个原地不动的系统响应h(t)h(t)h(t)(连续形式)、h[n]h[n]h[n](离散形式)与一个反转的未经处理的输入序列f(t)f(t)f(t)(连续形式)、f[n]f[n]f[n](离散形式)相乘后乘积的累加。以上概念只需简单记住就行后续会围绕以上概念解释卷积。卷积的运算流程卷积的数学公式看着复杂其实如果能结合图像理解的话会简单很多。视角一数据不动反转的核滑动直觉把卷积核想象成一个固定好顺序的“操作序列”例如最新的输入乘h[0]h[0]h[0]、前一个乘h[1]h[1]h[1]、再前一个乘h[2]h[2]h[2]…。为了让这个序列按时间正序作用在数据上我们需要先将核反转然后让它像一列反向滑过的窗口依次覆盖数据。数学公式y[n]∑kx[k]h[n−k] y[n] \sum_{k} x[k]h[n - k]y[n]k∑​x[k]h[n−k]x[k]x[k]x[k]是固定不动的信号通常索引 k 从 0 开始。h[k]h[k]h[k]先被反转变成h[−k]h[−k]h[−k]再平移 n形成滑动窗口h[n−k]h[n−k]h[n−k]。对应动画红色反转核[h[2], h[1], h[0]]从左向右滑过蓝色数据。视角二核不动反转的数据滑动直觉把卷积核视为一个“固定的接收器”每一时刻我们只关心当前输入x[n]x[n]x[n]对准h[0]h[0]h[0]。为了同时看到多个过去的输入我们把整个数据序列反转然后整体滑动让当前时刻的样本x[n]x[n]x[n]正好对准h[0]h[0]h[0]更早的样本则依次对准h[1]h[1]h[1],h[2]h[2]h[2]…。数学公式y[n]∑kx[n−k]h[k] y[n] \sum_{k} x[n - k]h[k]y[n]k∑​x[n−k]h[k]固定核h[k]h[k]h[k]索引 k0,1,2… 对应权重h[0]h[0]h[0],h[1]h[1]h[1],h[2]h[2]h[2]。反转后的数据为x[n−k]x[n−k]x[n−k]当k0k0k0时是当前输入x[n]x[n]x[n]k1k1k1时为上一时刻输入x[n−1]x[n−1]x[n−1]以此类推。对应动画蓝色反转数据[x[4], x[3], x[2], x[1], x[0]]从左向右滑动使x[n]x[n]x[n]始终对准红色的 h[0]。为何两种视角等价—— 交换律卷积的交换律保证了两种顺序的积分/求和结果完全相同(x∗h)[n]∑kx[k]h[n−k]∑kx[n−k]h[k](h∗x)[n] (x*h)[n] \sum_{k} x[k]h[n - k] \sum_{k} x[n - k]h[k] (h*x)[n](x∗h)[n]k∑​x[k]h[n−k]k∑​x[n−k]h[k](h∗x)[n]视角一反转的是卷积核视角二反转的是数据。无论哪一种实质都是相同的加权和只是观察坐标的选择不同。理解卷积过程设想我们需要设计一个系统它对每一个新的输入样本都按照一套固定的处理步骤来加工过去的数据。比如有三个步骤取出当前最新的数据乘以权重 a取出上一个数据乘以权重 b取出再上一个数据乘以权重 c如果按照自然的时间方向我们会把步骤列表写成步骤清单[a,b,c] 步骤清单[a,b,c]步骤清单[a,b,c]因为现实都是因果系统所以实际情况是将步骤c最新数据对齐的。所以步骤 a 是处理最旧的数据步骤 c 才是处理最新的数据。现在当我们把这个清单直接“扣”在数据序列上做逐点相乘再求和时会发生什么清单的最后一个元素ccc会落在当前最新的数据x[n]x[n]x[n]上第二个元素bbb落在x[n−1]x[n−1]x[n−1]上第一个元素aaa落在x[n−2]x[n−2]x[n−2]上于是计算出来的结果是c⋅x[n]b⋅x[n−1]a⋅x[n−2] c⋅x[n]b⋅x[n−1]a⋅x[n−2]c⋅x[n]b⋅x[n−1]a⋅x[n−2]这完全颠倒了我们想要的操作最新的输入被最旧的步骤处理最旧的输入反而被最新的步骤处理。问题出在哪里——清单的顺序和时间的顺序是反的。这就好比一个工厂赚钱正常流程是制造→\to→包装→\to→发货。但是此时步骤流程反了原材料还没制造就寄出去了已经包装好的产品又回炉重造了。为了让步骤清单按照正确的时间关系作用在数据上我们必须将步骤清单反转变成[c,b,a] [c,b,a][c,b,a]反转后未反转前的第一个元素aaa就会落在当前数据x[n]x[n]x[n]上第二个bbb落在x[n−1]x[n−1]x[n−1]上第三个ccc落在x[n−2]x[n−2]x[n−2]上结果正是我们想要的a⋅x[n]b⋅x[n−1]c⋅x[n−2] a⋅x[n]b⋅x[n−1]c⋅x[n−2]a⋅x[n]b⋅x[n−1]c⋅x[n−2]这个“反转步骤清单”的动作就是卷积运算中的核反转。因为现实中的因果系统只能根据过去和现在的输入产生输出不可能预知未来所以处理步骤必须按从新到旧的顺序作用最新数据乘第一个权重较早数据乘后面的权重。而我们人类习惯按时间增长的顺序列出步骤从旧到新这就必然导致我们在直接使用清单时需要先将它反转。这种必然性也自然衍生出两种观察方式视角一数据不动把步骤清单反转后得到的核序列在数据轴上从过去滑向现在每覆盖一段就完成一次处理。视角二核固定不动把整个数据序列反转让最新样本对准第一个权重然后整体平移等价地实现同样的加权。