卷积

卷积

维基百科,自由的百科全书

跳转至: 导航、 搜索

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

图示方形脉冲波和指数衰退的脉冲波的卷积(后者可能出现于 RC电路中),同样地重叠部份面积就相当于 "t" 处的卷积。注意到因为 "g" 是对称的,所以在这两张图中,反射并不会改变它的形状。

泛函分析中,卷积(捲積)、旋積摺積,是通过两个函数f 和g 生成第三个函数的一种数学算子,表征函数f与经过翻转和平移的g 的重叠部分的累积。如果将参加卷积的一个函数看作区间指示函数,卷积还可以被看作是“滑动平均”的推广。

目录
简单介绍

卷积是分析数学中一种重要的运算。设:  f(x) ,g(x)\mathbb{R}上的两个可积函数,作积分:

 \int_{-\infty}^{\infty} f(\tau) g(x - \tau)\, \mathrm{d}\tau

可以证明,关于几乎所有的 x \in (-\infty,\infty) ,上述积分是存在的。这样,随着 x 的不同取值,这个积分就定义了一个新函数h(x),称为函数f 与g 的卷积,记为h(x)=(f*g)(x)。我们可以轻易验证:(f * g)(x) = (g * f)(x),并且(f * g)(x) 仍为可积函数。这就是说,把卷积代替乘法,L^1(R^1) 空间是一个代数,甚至是巴拿赫代数

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

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

卷积的概念还可以推广到数列、测度以及广义函数上去。

定义

函数f 与g 的卷积记作f * g,它是其中一个函数翻转并平移后与另一个函数的乘积的积分,是一个对平移量的函数。

(f * g )(t) = \int f(\tau) g(t - \tau)\, d\tau

积分区间取决于f 与g 的定义域

对于定义在离散域的函数,卷积定义为

(f * g)[m] = \sum_n {f[n] g[m - n]}

图解卷积

  1. 首先将两个函数都用\tau来表示。
  2. 对其中一个函数做水平翻转: g(\tau) →g(-\tau).
  3. 加上一个时间偏移量,让 g(t-\tau) 能沿着 \tau 轴滑动。
  4. t从-∞滑动到+∞。两函数交会时,计算交会范围中两函数乘积的积分值。 换句话说,我们是在计算一个滑动的的加权平均值。也就是使用g(-\tau).当做加权函数,来对f(\tau)取加权平均值。
最后得到的波形(未包含在此图中)就是fg的卷积。

如果f(t)是一个单位脉冲,我们得到的乘积就是g(t)本身,称为冲激响应 。

Convolution3.PNG

计算卷积的方法

当  f[n]  为有限长度  N  ,  g[n]  为有限长度  M  的信号,计算卷积 f[n]*g[n] 有三种主要的方法,分别为 1.直接计算(Direct Method) 2.快速傅里叶转换(FFT) 和 3.分段卷积 (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 快速傅里叶转换(FFT)
  • 概念:由于两个离散信号在时域(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 分段卷积(sectioned convolution)
  • 概念: 将  f[n]  切成好几段,每一段分别和  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小。

应用时机

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

以下根据  f[n]  和  g[n]  的长度(  N, M  )分成5类,并列出适合使用的方法:

  1.  M  为一非常小的整数 - 直接计算
  2.  M \ll N  - 快速傅里叶转换
  3.  M \approx N  - 分段卷积
  4.  M \gg N  - 快速傅里叶转换
  5.  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 ,所需总乘法量: 快速傅里叶转换 = 分段卷积 < 直接计算。故,此时选择使用分段卷积来计算卷积最适合。
多元函数卷积

按照翻转、平移、积分的定义,还可以类似的定义多元函数上的积分:

(f * g )(t_1,t_2,\cdots,t_n) = \int\int\cdots\int 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
性质

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

交换律
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为任意实数(或复数)。

微分定理
\mathcal{D}(f * g) = \mathcal{D}f * g = f * \mathcal{D}g \,

其中Df 表示f微分,如果在离散域中则是指差分算子,包括前向差分与后向差分两种:

  • 前向差分:\mathcal{D}^+f(n) = f(n+1) - f(n)
  • 后向差分:\mathcal{D}^-f(n) = f(n) - f(n-1)
卷积定理

卷积定理指出,函数卷积的傅里叶变换是函数傅里叶变换的乘积。即,一个域中的卷积相当于另一个域中的乘积,例如时域中的卷积就对应于频域中的乘积。

 \mathcal{F}(f * g) = \mathcal{F} (f) \cdot \mathcal{F} (g)

其中\mathcal{F}(f)表示f 的傅里叶变换

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

利用卷积定理可以简化卷积的运算量。对于长度为n的序列,按照卷积的定义进行计算,需要做2n-1组对位乘法,其计算复杂度\mathcal{O}(n^2);而利用傅里叶变换将序列变换到频域上后,只需要一组对位乘法,利用傅里叶变换的快速算法之后,总的计算复杂度为\mathcal{O}(n\log n)。这一结果可以在快速乘法计算中得到应用。

在群上的卷积

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

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

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

应用

卷积在工程和数学上都有很多应用:

  • 统计学中,加权的滑动平均是一种卷积。
  • 概率论中,两个统计独立变量X与Y的和的概率密度函数是X与Y的概率密度函数的卷积。
  • 声学中,回声可以用源声与一个反映各种反射效应的函数的卷积表示。
  • 电子工程与信号处理中,任一个线性系统的输出都可以通过将输入信号与系统函数(系统的冲激响应)做卷积获得。
  • 物理学中,任何一个线性系统(符合叠加原理)都存在卷积。
参见
外部链接
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值