深入浅出理解卷积运算

article/2025/10/24 10:13:49

提起卷积运算相信大家都不陌生,这是一种很常见的运算。我们在学习《信号与系统》时就一直在和卷积打交道,在后来的一些课程中也有卷积运算的身影,比如《自动控制原理现代部分》中的卷积定理等。
在学习《信号与系统》时我们知道了卷积的定义,对于两个函数 f ( x ) f(x) f(x) g ( x ) g(x) g(x),他们的卷积 f ∗ g ( n ) f*g(n) fg(n) 的公式如下:
连续形式: f ∗ g ( n ) = ∫ − ∞ + ∞ f ( τ ) ∗ g ( n − τ ) d τ \mathrm{f} * \mathrm{~g}(n)=\int_{-\infty}^{+\infty} f(\tau) * g(n-\tau) d \tau f g(n)=+f(τ)g(nτ)dτ //n为实数
离散形式: f ∗ g ( n ) = ∑ τ = − ∞ + ∞ f ( τ ) ∗ g ( n − τ ) / / n , τ \mathrm{f} * \mathrm{~g}(n)=\sum_{\tau=-\infty}^{+\infty} f(\tau) * g(n-\tau) \quad / / \mathrm{n}, \tau f g(n)=τ=+f(τ)g(nτ)//n,τ为正整数
通过如上公式可以看到,卷积其实就是将一个函数 先进行翻转(公式中体现为 − τ -\tau τ − n -n n)再向右平移 n n n N N N的长度后得到函数 g ∗ g^* g,再让 g ∗ g^* g f f f进行累积求和或相乘求积分。通过分析我们已经知道了卷积的运算方法,也知道了卷积计算名字的由来:‘卷’就是对 进行的翻转和平移过程,就像卷纸巾一样,‘积’就是积求和或相乘求积分的过程。
在这里插入图片描述
我们对于卷积的理解一般就是这样了。但是卷积运算的意义究竟是什么呢?对于函数 g ( x ) g (x) g(x)为什么要进行翻转后在平移的操作呢?平移的长度 n n n代表着什么意义呢?带着这样的问题,我在网络上查阅了一些资料,最终写出一些体会与大家分享,来回答这三个问题。
一:卷积运算的意义是什么?
我们先抛开运算过程中对 g g g所作的翻转和平移过程,设 g g g作了翻转和平移得到函数 g ∗ g^* g g ∗ g^* g f f f所做的运算其实可以理解为 函数在 函数上的加权叠加。从信号的角度上来讲,也就是说将 f f f函数( f f f 一般在信号中是指输入信号, g g g在信号中一般指响应函数)上各个选定的时间点上按照 g ∗ g* g所规定的权值进行加权叠加。如下图所示,假设 g ( n ) g(n) g(n)未知, g ∗ ( n ) = e n g^*(n)=e^n g(n)=en,为一个衰减函数,则对应相乘累加后的卷积: f ∗ g ( n ) = f ( 0 ) + f ( 1 ) ∗ e − 1 + f ( 2 ) ∗ e − 2 + f ( 3 ) ∗ e − 3 + f ( 4 ) ∗ e − 4 + f ( 5 ) ∗ e − 5 + f ( 6 ) ∗ e − 6 + f ( 7 ) ∗ e − 7 + f ( 8 ) ∗ e − 8 + f ( 9 ) ∗ e − 9 + f ( 10 ) ∗ e − 10 + ⋯ + f ( n ) ∗ e − n \begin{array}{l} f * g(n)=f(0)+f(1) * e^{-1}+f(2) * e^{-2}+f(3) * e^{-3}+ \\ f(4) * e^{-4}+f(5) * e^{-5}+f(6) * e^{-6}+f(7) * e^{-7}+f(8) * \\ e^{-8}+f(9) * e^{-9}+f(10) * e^{-10}+\cdots+f(n) * e^{-n} \end{array} fg(n)=f(0)+f(1)e1+f(2)e2+f(3)e3+f(4)e4+f(5)e5+f(6)e6+f(7)e7+f(8)e8+f(9)e9+f(10)e10++f(n)en公式中的结果就是 f f f信号各时间点采集值的加权和。
在这里插入图片描述
二:为什么要对 g g g进行翻转后在平移的操作及平移的长度 n n n代表着什么意义?
沿用上一个问题中的举例,首先输入信号 f f f离散后的图像如下图的红色轨迹,对于这个输入信号, f ( 0 ) f(0) f(0)表示 t = 0 t=0 t=0时刻的信号, f ( 1 ) f(1) f(1)表示 t = 1 t=1 t=1时刻的信号,。。。 f ( 10 ) f(10) f(10)表示 t = 10 t=10 t=10时刻的信号,也是图中最后进入的信号,也就是最新的信号。而途中的响应函数 g g g离散后如下图的黑色轨迹,是一个指数衰减函数,其物理意义是信号经过响应函数后随着时间的流逝会不断衰减,如 t = 0 t=0 t=0时输入信号 f ( 0 ) f(0) f(0) t = 1 t=1 t=1时刻衰减为 f ( 0 ) ∗ e − 1 f(0)*e^{-1} f(0)e1 ,在 t = 3 t=3 t=3时刻衰减为 f ( 0 ) ∗ e − 3 f(0)*e^{-3} f(0)e3 , t = 1 t=1 t=1时刻的信号在 t = 2 t=2 t=2时刻时衰减为 f ( 1 ) ∗ e − 1 f(1)*e^{-1} f(1)e1,最终在 t = n t=n t=n的时刻求得所有采集到的输入信号经过时间衰减后的输出和 F ( n ) F(n) F(n)。这个输出 F ( n ) F(n) F(n)的值受到在 t = 0 t=0 t=0时刻到 t = n t=n t=n时刻之间所有采集到的输入信号的影响,只是随着时间的流逝,越早采集的信号对当前的输出影响就越小。
在这里插入图片描述

因此,输入信号f通过与g函数进行某种运算后可以得到输出 F ( n ) F(n) F(n) 。而这之间的运算关系是怎样的呢?通过上述分析我们假设要求取 F ( 5 ) F(5) F(5),即 t = 5 t=5 t=5时刻及之前所有采集到的信号的一个加权求和。按照分析: F ( 5 ) = f ( 0 ) ∗ e − 5 + f ( 1 ) ∗ e − 4 + f ( 2 ) ∗ e − 3 + f ( 3 ) ∗ e − 2 + f ( 4 ) ∗ e − 1 + f ( 5 ) \begin{array}{l} F(5)=\\f(0) * e^{-5}+f(1) * e^{-4}+f(2) * e^{-3}+f(3) * e^{-2}+f(4) * e^{-1}+f(5) \end{array} F(5)=f(0)e5+f(1)e4+f(2)e3+f(3)e2+f(4)e1+f(5)因为 f ( 0 ) f(0) f(0)是最早采集到的信号,故其衰减的最为厉害,权值也最小。将其中的权值用响应函数 g g g来表示,则 F ( 5 ) = f ( 0 ) ∗ g ( 5 ) + f ( 1 ) ∗ g ( 4 ) + f ( 2 ) ∗ g ( 3 ) + f ( 3 ) ∗ g ( 2 ) + f ( 4 ) ∗ g ( 1 ) + f ( 5 ) ∗ g ( 0 ) = f ( 0 ) ∗ g ( 5 − 0 ) + f ( 1 ) ∗ g ( 5 − 1 ) + f ( 2 ) ∗ g ( 5 − 2 ) + f ( 3 ) ∗ g ( 5 − 3 ) + f ( 4 ) ∗ g ( 5 − 4 ) + f ( 5 ) ∗ g ( 5 − 5 ) = ∑ τ = 0 5 f ( τ ) ∗ g ( 5 − τ ) \begin{array}{l} F(5)=\\f(0) * g(5)+f(1) * g(4)+f(2) * g(3)+f(3) * g(2)+ f(4) * g(1)+f(5) * g(0)\\=\\ f(0) * g(5-0)+f(1) * g(5-1)+f(2) * g(5-2)+ f(3) * g(5-3)+f(4) * g(5-4)+f(5) * g(5-5) \\=\\\sum_{\tau=0}^{5} f(\tau) * g(5-\tau) \end{array} F(5)=f(0)g(5)+f(1)g(4)+f(2)g(3)+f(3)g(2)+f(4)g(1)+f(5)g(0)=f(0)g(50)+f(1)g(51)+f(2)g(52)+f(3)g(53)+f(4)g(54)+f(5)g(55)=τ=05f(τ)g(5τ)看到这个公式大家有没有一点熟悉的感觉,没错这个式子 F ( 5 ) = s u m τ = 0 5 f ( τ ) ∗ g ( 5 − τ ) F(5)=sum_{\tau=0}^{5} f(\tau) * g(5-\tau) F(5)=sumτ=05f(τ)g(5τ)和卷积运算的离散形式 ∑ τ = − ∞ + ∞ f ( τ ) ∗ g ( n − τ ) \sum_{\tau=-\infty}^{+\infty} f(\tau) * g(n-\tau) τ=+f(τ)g(nτ)几乎一模一样,只是把 n n n取了整数5。
看到这里可能大家已经隐约知道了卷积运算中对g进行翻转和平移的作用,为了让大家更直观的看到翻转和平移作用,引用知乎博主palet的解释:
在这里插入图片描述
首先这是给定的输入信号 f f f和指数衰减响应函数 g g g 。为了达到上文提到的加权求和的效果,当取T(也就是上文的 n n n)=10时, f ( t ) f(t) f(t) g ( t ) g(t) g(t)的累积对应关系如下图所示:
在这里插入图片描述
如上图所示,对于 t = 10 t=10 t=10时刻最新的信号采集值 f ( 10 ) f(10) f(10)是完全没有衰减的,因此与 g ( 0 ) = 1 g(0)=1 g(0)=1相乘,对于其它时刻的对应也如上分析,最终得到最近10个输入信号的采集值加权叠加的结果,具体请参看第二个问题的第二段。
这样的对应关系看起来十分复杂,因此我们对 g ( t ) g(t) g(t)进行一些处理,首先进行翻转,翻转后 f ( t ) f(t) f(t)与$g(-t) $的乘积对应关系如下图:
在这里插入图片描述

翻转之后乘积的对应关系似乎看起了有了一些规则,但依旧有些不易观察,之后对 g ( − t ) g(-t) g(t)进行长度为T(上文的 n n n)的右移得到 g ( T − t ) g(T-t) g(Tt),其对应关系变为了下图:
在这里插入图片描述
通过这张图后可以很清晰的看见 f ( t ) f(t) f(t) g ( T − t ) g(T-t) g(Tt)的乘积对应关系。又因为 f ( t ) f(t) f(t)是实际的输入信号,其在 t t t的负半轴是没有数值的,因此 f ( t ) f(t) f(t) g ( t ) g(t) g(t)做卷积运算也就是 f ( t ) f(t) f(t) g ( T − t ) g(T-t) g(Tt)做整个数轴上的累积运算时与作 ( 0 , T ) (0,T) (0,T)的累积运算结果是相同的。因此可以得出卷积运算满足了信号指数衰减求和的结果。大家应该也明白了卷积运算在信号处理上的物理意义。同时大家也能够明白了平移长度 n n n所代表的意义了, n n n代表的就是积分的x轴长度或者累加的次数,在信号上就是当前已采集输入信号值的次数。
本文主要分享的是卷积运算在信号处理上的一些物理意义,希望能够帮助读者更好的理解卷积运算。但实际上卷积运算在很多其他的地方也有很大的作用,比如图像识别中的边缘提取,卷积神经网络等等,有兴趣的话大家可以自行去了解。


http://chatgpt.dhexx.cn/article/qA5nuAUw.shtml

相关文章

卷积计算——1. 关于卷积的基本概念

文章目录 卷积的基本概念卷积运算公式交换律分配律结合律数乘结合律 卷积核代码的基本框架 卷积的基本概念 卷积,是一个强有力的数学工具,在计算机领域中有很多非常不错的运用,能产生很多意想不到的效果和输出。 数学上,其连续函…

数(3)相关运算和卷积运算

目录 相关运算 卷积运算 连续信号 离散信号 卷积性质 卷积定理 (参考其他多篇博客,学习自用,侵删) 相关运算 相关运算是两个序列的相似性比较的一种数学运算。 公式里面的序列,可能是实数,可能是复数…

各种卷积方式的最全讲解

文章目录 一:卷积的定义二:标准卷积1.1D卷积Ⅰ:一维Full卷积Ⅱ:一维Same卷积Ⅲ:一维Valid卷积Ⅳ:三种一维卷积的相互关系 2.2D卷积3.3D卷积 三:转置卷积四:Separable卷积五&#xff…

深度学习(一):卷积运算

一、卷积核与池化: 1.1 卷积核(Convolutional): 将输入图像中一个小区域中像素加权平均后成为输出图像中的每个对应像素,其中权值由一个函数定义,这个函数称为卷积核(滤波器)。 一般可以看作对某个局部的…

深度学习-图解卷积运算

卷积神经网络(Convolutional Neural Network,CNN)针对全连接网络 的局限做出了修正,加入了卷积层(Convolution层)和池化层(Pooling 知 层)。 CNN被广泛应用于图像识别、语音识别等各…

【svg文字路径动画,让文字沿着路径动起来】

最近项目里面用到了这个文字路径动画,不得不说确实挺好玩的,如果有需要的小伙伴可以参考! 代码片段 由于公司之前项目里也用到过,但是我是第一次写,所以第一时间还是先看看前辈是怎么处理的,借鉴一下长长…

Qml路径动画-PathAnimation

Qml中的PathAnimation可以让目标沿着一个指定路径运行。 PathAnimation的属性 anchorPoint:使用"x,y"来指定运动的锚定点。orientation:指定控制目标对象沿着路径运动的旋转策略。path属性的类型为Path,选择你要构造的路径。 sta…

dotween路径移动_Unity---DOTween插件学习(3)---获取数据、协程、路径动画

[Toc] 本文及系列参考于Andy老师的DOTween系列 欢迎大家关注**Andy老师** 10、获取数据 类方法 返回所有暂停的动画,没有则返回null var list DOTween.PausedTweens(); 返回所有真正播放的动画,没有则返回null var list DOTween.PlayingTweens(); 获取…

houdini:固定朝向的路径动画

涉及节点:follow path 一、模型准备 路径、朝向的物体,以及运动的物体,一共三个 二、follow path 节点 原来xxxx是一个属性,现在好像必须在创建路径动画的时候就选择xxx了 下面请紧跟我的步骤 steep1:点击follow p…

Dotween运动曲线与路径动画

Dotween运动曲线与路径动画 Dotween--运动曲线内置的运动曲线AnimationCurve Dotween--路径动画一:设置一个数组存放位置坐标二:直接写出自己想要到的坐标 Dotween–运动曲线 想要理解Dotwenn的运动曲线,最重要的一步就是要理解坐标的的含义,这里看图讲…

AE路径动画

动画效果预览 一、AI跑道汽车 注:绘制完成后,给需要作动效的部位进行单独新建图层并命名; ctrl c,ctrlf原位粘贴 二、导入AE 具体导入方法请查看此文: AE动画导入/导出_TING糖的博客-CSDN博客AE导入/导出方式http…

Cinemachine教程 | Unity中如何制作路径动画?

摘要:在Unity中制作路径动画是有挺多方式的,基于Cinemachine的Dolly Path是一个简单便捷的方法,咱们来快速的学习一下吧! 洪流学堂,让你快人几步。你好,我是跟着大智(VX: zhz11235)学Unity的萌新&#xff0…

Android实现 曲线路径动画

本文参考 https://www.jianshu.com/p/fea4d1f6512a 概述 近期碰到曲线动画的实现问题,写本文记录下。 动画类似“剑与远征”游戏的金币动画,动画路径如下图: 思路 通过贝塞尔曲线计算出x和y的位置(各个点的位置需要自己微调&am…

WPF实现路径动画

让目标沿着一条给定的路径移动&#xff0c;使用DoubleAnimationUsingPath类实现。实现如下。 点击鼠标移动 实现代码如下&#xff1a;界面XAML <Grid x:Name"LayoutRoot"> <Grid.Resources> <PathGeometry x:Key"movingPath…

Houdini:最小白的路径动画

涉及节点&#xff1a;curve、constraints、follow path 涉及知识&#xff1a;路径动画、约束 提一嘴maya的路径动画&#xff1a;在constrain-->motion paths -->attach motion path中 一、模型准备 一个模型和一个curve曲线&#xff0c;分别在两个geometry里面&#…

UE5蓝图时间轴摄影机路径动画

1. 新建蓝图类Actor 2. 蓝图里添加Spline和Camera组件&#xff0c;另外添加一个Scene场景组件&#xff0c;可以把Camera拖到Scene的子级&#xff0c;这样做可以让Camera在沿着路径运动的时候自由更改旋转方向 3. 打开关卡蓝图&#xff0c;首先按键获取MovingLine的Camera视角&a…

html5 路径运动,探秘神奇的运动路径动画 Motion Path

CSS 中有一个非常有意思的模块 -- CSS Motion Path Module Level 1,翻译过来也就是运动路径。本文将对 motion path 一探究竟,通过本文,你可以了解到:什么是 CSS motion path 使用 CSS motion path 制作简单路径动画 使用 CSS motion path 制作复杂路径动画 什么是 CSS Mot…

canvas绘制折线路径动画

最近有读者加我微信咨询这个问题&#xff1a; 其中的效果是一个折线路径动画效果&#xff0c;如下图所示&#xff1a; 要实现以上路径动画&#xff0c;一般可以使用svg的动画功能。或者使用canvas绘制&#xff0c;结合路径数学计算来实现。 如果用canvas来绘制&#xff0c…

路径动画

工作日记&#xff0c;最近做项目遇到一个有意思的动画效果&#xff0c;路径动画&#xff0c;做一个demo&#xff0c;方便以后查阅&#xff0c;也供初学者借鉴&#xff01; 效果如下图&#xff1a; 效果分两步&#xff1a; 第一步是把书翻开&#xff0c;是一个贞动画&#xf…

openlayers实现路径动画

实现效果如下 主要代码 import {Feature} from ol; import {LineString, Point} from ol/geom; import {Icon, Stroke, Fill, Style} from ol/style; import {getVectorContext} from ol/render;// 路径动画图层 let traceSource new VectorSource({}); let moveLayer new…