卷积(转自wiki百科)
维基百科,自由的百科全书
图示两个方形脉冲波的卷积。其中函数 "g" 首先对 反射,接着平移 "t" ,成为 。那么重叠部份的面积就相当于 "t" 处的卷积,其中横坐标代表待积变量 以及新函数 的自变量 "t" 。
图示方形脉冲波和指数衰退的脉冲波的卷积(后者可能出现于 RC电路中),同样地重叠部份面积就相当于 "t" 处的卷积。注意到因为 "g" 是对称的,所以在这两张图中,反射并不会改变它的形状。
在泛函分析中,卷积(捲積)、旋積或摺積,是通过两个函数f 和g 生成第三个函数的一种数学算子,表征函数f 与经过翻转和平移的g 的重叠部分的累积。如果将参加卷积的一个函数看作区间的指示函数,卷积还可以被看作是“滑动平均”的推广。
目录
简单介绍
卷积是分析数学中一种重要的运算。设: ,是上的两个可积函数,作积分:
可以证明,关于几乎所有的 ,上述积分是存在的。这样,随着 的不同取值,这个积分就定义了一个新函数,称为函数 与 的卷积,记为。我们可以轻易验证:,并且 仍为可积函数。这就是说,把卷积代替乘法, 空间是一个代数,甚至是巴拿赫代数。
卷积与傅里叶变换有着密切的关系。例如两函数的傅里叶变换的乘积等于它们卷积后的傅里叶变换,利用此一性质,能简化傅里叶分析中的许多问题。
由卷积得到的函数 一般要比 和 都光滑。特别当 为具有紧支集的光滑函数, 为局部可积时,它们的卷积 也是光滑函数。利用这一性质,对于任意的可积函数 ,都可以简单地构造出一列逼近于 的光滑函数列 ,这种方法称为函数的光滑化或正则化。
卷积的概念还可以推广到数列、测度以及广义函数上去。
定义
函数f 与g 的卷积记作,它是其中一个函数翻转并平移后与另一个函数的乘积的积分,是一个对平移量的函数。
积分区间取决于f 与g 的定义域。
对于定义在离散域的函数,卷积定义为
图解卷积
- 首先将两个函数都用来表示。
- 对其中一个函数做水平翻转: →
- 加上一个时间偏移量,让 能沿着 轴滑动。
- 让t从-∞滑动到+∞。两函数交会时,计算交会范围中两函数乘积的积分值。换句话说,我们是在计算一个滑动的的加权平均值。也就是使用当做加权函数,来对取加权平均值。
- 最后得到的波形(未包含在此图中)就是f和g的卷积。
如果f(t)是一个单位脉冲,我们得到的乘积就是g(t)本身,称为冲激响应 。
计算卷积的方法
当 为有限长度 , 为有限长度 的信号,计算卷积 有三种主要的方法,分别为 1.直接计算(Direct Method) 2.快速傅里叶转换(FFT) 和 3.分段卷积 (sectioned convolution)。方法1是直接利用定义来计算卷积,而方法2和3都是用到了FFT来快速计算卷积。也有不需要用到FFT的作法,如使用数论转换。
方法1 直接计算
- 作法: 利用卷积的定义
- 若 和 皆为实数信号,则需要 个乘法。
- 若 和 皆为更一般性的复数信号,不使用复数乘法的快速算法,会需要 个乘法;但若使用复数乘法的快速算法,则可简化至 个乘法。
- 因此,使用定义直接计算卷积的复杂度为 。
方法2 快速傅里叶转换(FFT)
- 概念:由于两个离散信号在时域(time domain)做卷积相当于这两个信号的离散傅里叶转换在频域(frequency domain)做相乘:
- ,可以看出在频域的计算较简单。
- 作法: 因此这个方法即是先将信号从时域转成频域:
- ,于是
- ,最后再将频域信号转回时域,就完成了卷积的计算:
- 总共做了 2 次 DFT 和 1 次 IDFT。
- 特别注意 DFT 和 IDFT 的点数 要满足 。
- 由于 DFT 有快速算法 FFT,所以运算量为
- 假设 点 DFT 的乘法量为 , 和 为一般性的复数信号,并使用复数乘法的快速算法,则共需要 个乘法。
方法3 分段卷积(sectioned convolution)
- 概念: 将 切成好几段,每一段分别和 做卷积后,再将结果相加。
- 作法: 先将 切成每段长度为 的区段 (),假设共切成S段:
-
- Section 1:
-
- Section 2:
-
- Section r:
-
- Section S:
- ,为各个section的和
- 因此,
,
- 每一小段作卷积则是采用方法2,先将时域信号转到频域相乘,再转回时域:
。
- 总共只需要做 点 FFT 次,因为 只需要做一次FFT。
- 假设 点 DFT 的乘法量为 , 和 为一般性的复数信号,并使用复数乘法的快速算法,则共需要个乘法。
- 运算量:
- 运算复杂度: ,和 呈线性,较方法2小。
- 分为 Overlap-Add 和 Overlap-Save 两种方法。
分段卷积: Overlap-Add
欲做的分段卷积分, 长度为 , 长度为 ,
Step 1: 将每 分成一段
Step 2: 再每段 点后面添加 个零,变成长度
Step 3: 把 添加 个零,变成长度 的 h'[n]}
Step 4: 把每个 x[n]} 的小段和 h'[n]} 做快速卷积,也就是 IDFT_{L+M-1}\{{DFT_{L+M-1}(x[n])DFT_{L+M-1}(h'[n])}\}},每小段会得到长度 的时域信号
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}
x[n]和h[n]
令 L=5} 切成三段,分别为 x_{0}[n],x_{1}[n],x_{2}[n]}, 每段填 M-1} 个零,并将 填零至长度
分段x[n]
将每一段做 IDFT_{L+M-1}\{{DFT_{L+M-1}(x[n])DFT_{L+M-1}(h'[n])}\}}
分段运算结果
若将每小段摆在一起,可以注意到第一段的范围是 0\thicksim 6} ,第二段的范围是 5\thicksim 11},第三段的范围是 10\thicksim 16},三段的范围是有重叠的
合并分段运算结果
最后将三小段加在一起,并将结果和未分段的卷积做比较,上图是分段的结果,下图是没有分段并利用快速卷积所算出的结果,验证两者运算结果相同。
结果比较图
分段卷积: Overlap-Save
欲做 x[n]*h[n]}的分段卷积分, x[n]} 长度为 N}, 长度为 M},
Step 1: 将 x[n]} 前面填 M-1} 个零
Step 2: 第一段 i=0}, 从新的 中 取到 总共 点当做一段,因此每小段会重复取到前一小段的 点,取到新的一段全为零为止
Step 3: 把 添加 L-M} 个零,变成长度 的
Step 4: 把每个 的小段和 做快速卷积,也就是,每小段会得到长度 的时域信号
Step 5: 对于每个小段,只会保留末端的 点,因此得名 Overlap-Save
Step 6: 将所有保留的点合再一起,得到最后结果
举例来说:
, 长度
, 长度
令
x[n]和h[n]
将 前面填 个零以后,按照 Step 2 的方式分段,可以看到每一段都重复上一段的 点
分段x[n]
再将每一段做以后可以得到
分段运算结果
保留每一段末端的 点,摆在一起以后,可以注意到第一段的范围是 ,第二段的范围是,第三段的范围是},第四段的范围是,四段的范围是没有重叠的
合并分段运算结果
将结果和未分段的卷积做比较,下图是分段的结果,上图是没有分段并利用快速卷积所算出的结果,验证两者运算结果相同。
结果比较图
至于为什么要把前面 M-1} 丢掉?
以下以一例子来阐述:
, 长度,
, 长度,
第一条蓝线代表 轴,而两条蓝线之间代表长度,是在做快速卷积时的周期
x[n]和h[n]
当在做快速卷积时,是把信号视为周期,在时域上为循环卷积分,
而在一开始前 点所得到的值,是 和 内积的值,
然而 这 个值应该要为零,以往在做快速卷积时长度为 时不会遇到这些问题,
而今天因为在做快速卷积时长度为 才会把这 点算进来,因此我们要丢弃这 点内积的结果
循环卷积
为了要丢弃这 M-1} 点内积的结果,位移 h[-n]} M-1} 点,并把位移以后内积合的值才算有效。
位移以后内积
应用时机
以上三种方法皆可用来计算卷积,其差别在于所需总体乘法量不同。基于运算量以及效率的考量,在计算卷积时,通常会选择所需总体乘法量较少的方法。
以下根据 和 的长度( )分成5类,并列出适合使用的方法:
- 为一非常小的整数 - 直接计算
- - 快速傅里叶转换
- - 分段卷积
- - 快速傅里叶转换
- 为一非常小的整数 - 直接计算
基本上,以上只是粗略的分类。在实际应用时,最好还是算出三种方法所需的总乘法量,再选择其中最有效率的方法来计算卷积。
例子
Q1: 当 ,适合用哪种方法计算卷积?
Ans:
- 方法1: 所需乘法量为
- 方法2: ,而2016点的DFT最少乘法数 ,所以总乘法量为
- 方法3:
- 若切成 8 块(),则。选,则总乘法量为 ,比方法1和2少了很多。
- 但是若要找到最少的乘法量,必须依照以下步骤
- (1)先找出 : 解 :
- (2)由 算出点数在 附近的DFT所需最少的乘法量,选择DFT的点数
- (3)最后由 算出
- 因此,
- (1)由运算量对 的偏微分为0而求出
- (2),所以选择101点 DFT 附近点数乘法量最少的点数 或 。
- (3-1)当 ,总乘法量为 。
- (3-2)当 ,总乘法量为 。
- 由此可知,切成 20 块会有较好的效率,而所需总乘法量为 21480。
- 因此,当,所需总乘法量: 分段卷积 < 快速傅里叶转换 < 直接计算。故,此时选择使用分段卷积来计算卷积最适合。
Q2: 当 ,适合用哪种方法计算卷积?
Ans:
- 方法1: 所需乘法量为
- 方法2: ,选择1026点 DFT 附近点数乘法量最少的点数,。
-
- 因此,所需乘法量为
-
- 方法3:
-
- (1)由运算量对 的偏微分为0而求出
- (2),所以选择7点 DFT 附近点数乘法量最少的点数 或 或 。
- (3-1)当 ,总乘法量为 。
- (3-2)当 ,总乘法量为 。
- (3-3)当 ,总乘法量为 。
- 由此可知,切成 171 块会有较好的效率,而所需总乘法量为 5476。
-
- 因此,当,所需总乘法量: 分段卷积 < 直接计算 < 快速傅里叶转换。故,此时选择使用分段卷积来计算卷积最适合。
- 虽然当 是个很小的正整数时,大致上适合使用直接计算。但实际上还是将3个方法所需的乘法量都算出来,才能知道用哪种方法可以达到最高的效率。
Q3: 当 ,适合用哪种方法计算卷积?
Ans:
- 方法1: 所需乘法量为
- 方法2: ,选择1026点 DFT 附近点数乘法量最少的点数,。
-
- 因此,所需乘法量为
-
- 方法3:
-
- (1)由运算量对 的偏微分为0而求出
- (2),所以选择1623点 DFT 附近点数乘法量最少的点数 。
- (3)当 ,总乘法量为 。
- 由此可知,此时切成一段,就跟方法2一样,所需总乘法量为 44232。
-
- 因此,当,所需总乘法量: 快速傅里叶转换 = 分段卷积 < 直接计算。故,此时选择使用分段卷积来计算卷积最适合。
多元函数卷积
按照翻转、平移、积分的定义,还可以类似的定义多元函数上的积分:
性质
各种卷积算子都满足下列性质:
其中Df 表示f的微分,如果在离散域中则是指差分算子,包括前向差分与后向差分两种:
- 前向差分:
- 后向差分:
卷积定理
卷积定理指出,函数卷积的傅里叶变换是函数傅里叶变换的乘积。即,一个域中的卷积相当于另一个域中的乘积,例如时域中的卷积就对应于频域中的乘积。
其中表示f 的傅里叶变换。
这一定理对拉普拉斯变换、双边拉普拉斯变换、Z变换、Mellin变换和Hartley变换(参见Mellin inversion theorem)等各种傅里叶变换的变体同样成立。在调和分析中还可以推广到在局部紧致的阿贝尔群上定义的傅里叶变换。
利用卷积定理可以简化卷积的运算量。对于长度为的序列,按照卷积的定义进行计算,需要做组对位乘法,其计算复杂度为;而利用傅里叶变换将序列变换到频域上后,只需要一组对位乘法,利用傅里叶变换的快速算法之后,总的计算复杂度为。这一结果可以在快速乘法计算中得到应用。
在群上的卷积
若 G 是有某 m 测度的群(例如豪斯多夫空间上哈尔测度下局部紧致的拓扑群),对于G 上 m-勒贝格可积的实数或复数函数f 和g,可定义它们的卷积:
对于这些群上定义的卷积同样可以给出诸如卷积定理等性质,但是这需要对这些群的表示理论以及调和分析的彼得-外尔定理。
应用
卷积在工程和数学上都有很多应用:
- 统计学中,加权的滑动平均是一种卷积。
- 概率论中,两个统计独立变量X与Y的和的概率密度函数是X与Y的概率密度函数的卷积。
- 声学中,回声可以用源声与一个反映各种反射效应的函数的卷积表示。
- 电子工程与信号处理中,任一个线性系统的输出都可以通过将输入信号与系统函数(系统的冲激响应)做卷积获得。
- 物理学中,任何一个线性系统(符合叠加原理)都存在卷积。
参见
外部链接
- PlanetMath上Convolution的资料。
- Visual convolution Java Applet
- Lecture notes, Jian-Jiun Ding (2013), Advanced Digital Signal Processing
卷积(转自wiki百科)的更多相关文章
- 专业仿百度百科,维基wiki百科网站开发建设
专业仿百度百科,维基wiki百科网站开发建设,有需要的朋友可以欢迎私聊我 提供一站式服务:联系QQ:8582-36016(私聊),微信:lianweikj 电话:186-7597-7935 支持终端: ...
- Surf特征提取分析
Surf特征提取分析 Surf Hessian SIFT 读"H.Bay, T. Tuytelaars, L. V. Gool, SURF:Speed Up Robust Features[ ...
- Github开源人脸识别项目face_recognition
Github开源人脸识别项目face_recognition 原文:https://www.jianshu.com/p/0b37452be63e 译者注: 本项目face_recognition是一个 ...
- [Machine Learning] logistic函数和softmax函数
简单总结一下机器学习最常见的两个函数,一个是logistic函数,另一个是softmax函数,若有不足之处,希望大家可以帮忙指正.本文首先分别介绍logistic函数和softmax函数的定义和应用, ...
- [Computational Advertising] 计算广告学笔记之基础概念
因为工作需要,最近一直在关注计算广告学的内容.作为一个新手,学习计算广告学还是建议先看一下刘鹏老师在师徒网的教程<计算广告学>. 有关刘鹏老师的个人介绍:刘鹏现任360商业产品首席架构师, ...
- Hadoop HDFS 用户指南
This document is a starting point for users working with Hadoop Distributed File System (HDFS) eithe ...
- php根据地址的经纬度查询周围的城市例子
目前的工作是需要对用户的一些数据进行分析,每个用户都有若干条记录,每条记录中有用户的一个位置,是用经度和纬度表示的.还有一个给定的数据库,存储的是一些已知地点以及他们的经纬度,内有43W多条的数据.现 ...
- [Machine Learning & Algorithm] 决策树与迭代决策树(GBDT)
谈完数据结构中的树(详情见参照之前博文<数据结构中各种树>),我们来谈一谈机器学习算法中的各种树形算法,包括ID3.C4.5.CART以及基于集成思想的树模型Random Forest和G ...
- [Math] 常见的几种最优化方法
我们每个人都会在我们的生活或者工作中遇到各种各样的最优化问题,比如每个企业和个人都要考虑的一个问题“在一定成本下,如何使利润最大化”等.最优化方法是一种数学方法,它是研究在给定约束之下如何寻求某些因素 ...
随机推荐
- 学习excel的使用技巧二批量复制
1 选中要操作的部分 2 CTRL+G 打开定位 3 点击 定位条件 4 选择空值 5 输入=号 然后键盘的 方向键 向上 6 按住CTRL+回车 即可实现 批量复制
- 学习C++,应该循序渐进的看哪些书?
在某博客上看到的一个C++书籍阅读清单,可以参考下: 阶段 1<Essential C++>这是一本内容不多但很实用的C++入门书籍,强调快速上手与理解C++编程.本书主要围绕一系列逐渐复 ...
- Swift 通过运行时获取属性名列表
import UIKit //必须要有@objcMembers修饰符,否则获取到的成员属性为0 @objcMembers class Person: NSObject { var name: Stri ...
- leetcode39
public class Solution { List<IList<int>> list = new List<IList<int>>();//全部记 ...
- MYSQL性能优化(1)
优化步骤 1.show status 查询服务器状态运行信息 根据增删改查统计信息可以知道数据库是查询为主还是更新为主,各类型业务大致比例(更新操作 执行与回滚都会计数) 对于事务,可以通过Com_c ...
- JAVA中的配置文件XML
一:概念 1.XML Extensible markup Language 可拓展标记语言 2.功能:存储数据(配置文件,在网络中传输数据) 3.html和xml的区别 3.1xml标记全是自定义的 ...
- Install_WordPress_In_CentOS_7
1 – Install Apache Http Server# yum install httpd.x86_64 2 – Install php# yum install php.x86_64 3 – ...
- cmd中sudo以后显示password不能输入密码
文本界面还是图形界面下输入密码都不会有回显,这是为了安全考虑. 其实你不是不能输入密码只是你看不到而已,事实上你已经输入进去了,回车后就能看到效果了. 来源于:https://zhidao.baidu ...
- salt-api配置安装 以及使用
salt-api salt-api是我们通过restful-api调用salt-master的接口,且调用的时候必须通过认证才能调用,认证的用户为系统用户,下面就说说如何配置salt-api. 安装S ...
- node.js中使用socket.io + express进行实时消息推送
socket.io是一个websocket库,包含客户端的js和服务端的node.js,可以在不同浏览器和移动设备上构建实时应用. 一.安装 socket.io npm install socket. ...