当前位置: 首页 > news >正文

深入浅出理解卷积的概念

前言

在信号处理中,卷积是一种必学的数学计算技巧。但是由于在学习卷积的过程中需要不断接触许多较为复杂的公式,本人在学习卷积的过程中发现网上虽然有很多关于卷积的通俗解释,但是关于不少细节上仍然缺少通俗易懂的例子,初学者学习完后或许会出现一知半解的情况,故写下此文章用通俗易懂的方式解释卷积。

常见数学形式

连续卷积

对于两个连续函数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(fh)(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](fh)[n]=k=f[k]h[nk]

卷积数学公式的简单理解

在深入理解卷积之前,只需简单记住:卷积其实就是在以时间为自变量的函数图像上一个原地不动的系统响应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]=kx[k]h[nk]

  • 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[nk]
  • 对应动画:红色反转核[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]=kx[nk]h[k]

  • 固定核h[k]h[k]h[k](索引 k=0,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[nk]:当k=0k=0k=0时是当前输入x[n]x[n]x[n]k=1k=1k=1时为上一时刻输入x[n−1]x[n−1]x[n1],以此类推。
  • 对应动画:蓝色反转数据[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](xh)[n]=kx[k]h[nk]=kx[nk]h[k]=(hx)[n]

视角一反转的是卷积核,视角二反转的是数据。无论哪一种,实质都是相同的加权和,只是观察坐标的选择不同。

理解卷积过程

设想我们需要设计一个系统,它对每一个新的输入样本,都按照一套固定的处理步骤来加工过去的数据。

比如有三个步骤:

  1. 取出当前最新的数据,乘以权重 a
  2. 取出上一个数据,乘以权重 b
  3. 取出再上一个数据,乘以权重 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[n1]上,第一个元素aaa落在x[n−2]x[n−2]x[n2]上,于是计算出来的结果是:

c⋅x[n]+b⋅x[n−1]+a⋅x[n−2] c⋅x[n]+b⋅x[n−1]+a⋅x[n−2]cx[n]+bx[n1]+ax[n2]

这完全颠倒了我们想要的操作:最新的输入被最旧的步骤处理,最旧的输入反而被最新的步骤处理。

问题出在哪里?——清单的顺序和时间的顺序是反的

这就好比一个工厂赚钱,正常流程是制造→\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[n1]上,第三个ccc落在x[n−2]x[n−2]x[n2]上,结果正是我们想要的:

a⋅x[n]+b⋅x[n−1]+c⋅x[n−2] a⋅x[n]+b⋅x[n−1]+c⋅x[n−2]ax[n]+bx[n1]+cx[n2]

这个“反转步骤清单”的动作,就是卷积运算中的核反转

因为现实中的因果系统只能根据过去和现在的输入产生输出,不可能预知未来,所以处理步骤必须按从新到旧的顺序作用(最新数据乘第一个权重,较早数据乘后面的权重)。而我们人类习惯按时间增长的顺序列出步骤(从旧到新),这就必然导致我们在直接使用清单时,需要先将它反转。

这种必然性也自然衍生出两种观察方式:

  • 视角一:数据不动,把步骤清单反转后得到的核序列,在数据轴上从过去滑向现在,每覆盖一段就完成一次处理。
  • 视角二:核固定不动,把整个数据序列反转(让最新样本对准第一个权重),然后整体平移,等价地实现同样的加权。
http://www.gsyq.cn/news/1611538.html

相关文章:

  • 告别锁竞争:用C++11的concurrentqueue重构你的生产者消费者模型(附完整代码)
  • 一天一个Python库:tomlkit - 轻松解析和操作TOML配置
  • Python基础:三元表达式极简写法与高阶嵌套、场景避坑指南
  • 基于51/STM32单片机分贝仪检测 噪音等级声音采集(设计源文件+万字报告+讲解)(支持资料、图片参考_降重降ai)
  • 终极指南:如何安全备份微信聊天记录的技术方案解析
  • AKShare:金融数据接口的架构哲学与实践反思
  • SPT-AKI Profile Editor:逃离塔科夫离线服务器存档修改终极指南
  • 【VMware网络专家20年压箱底笔记】:多虚拟机通信必须绕开的4个致命陷阱(第3个连vCenter日志都不报错)
  • SSLsplit与OpenSSL深度集成:全面支持RSA、DSA、ECDSA密钥实战指南
  • 大数据相关专业哪个最适合普通家庭孩子:2026年选专业,别只盯“高大上”,要看能不能落地
  • 几句话概括,MySQL 半同步中,after_commit 与 after_sync 有什么区别
  • go: Fail-Fast Pattern
  • 万能遥控器app,各类家具都可用,推荐安装!
  • 【MES】自研MES采集设备数据的坑
  • 2026主流EPC项目协同平台横向选型与避坑评测
  • NET 安装 Aspose.Email for Python - Outlook SDK 安装
  • Qt阅读器-缩略图
  • 基于STM32单片机火灾报警系统 智能楼宇 烟雾温度火焰防盗无线2(设计源文件+万字报告+讲解)(支持资料、图片参考_降重降ai)
  • LLM喂文件神器-讲讲开源文件转换工具 file2md
  • 10 种 RAG 模式
  • 你的 Agent 架构选错了:越复杂的 Agent 系统,越可能走向失败
  • Spring AI + RAG
  • 告别Keil律师函!手把手教你用VSCode+GNU Arm+STM32CubeMX搭建免费单片机开发环境(Windows版)
  • 深智微:华润微官方授权代理商,如何让型号、库存交期与项目交付协同推进
  • 操作系统缓存机制深度解析:从页缓存到内存映射,超越Redis的性能优化之道
  • 行测申论试卷|公务员申论刷题|数量关系备考
  • Qt——文本绘制技巧
  • 气泡特效的核心在于BubbleEffect类,它继承自Manim的Animation类,通过重写关键方法来实现气泡的上升、变大和透明度变化效果。
  • 你的输出第一行肯定和我不一样,且每次运行的输出肯定不一样。
  • — 一款针对 IT 团队开发的文档管理系统,基于 Golang 开发,内置项目管理,用户管理,权限管理等功能,可以用来储存日常接口文档,数据库字典,手册说明等文档。功能特色: