快速卷积
2015-08-04 13:18
204 查看
快速卷积(FastConvolution)原文地址:Fast Convolution。吐血的翻译水平。
2015.08.03
快速卷积
1.5版:2004年07月21日下午12点格林尼治时间
Douglas L. Jones
这项工作是由连结项目(The Connexions Project)提供,并由知识共享署名许可(Creative Commons Attribution)授权。
摘要
用快速傅立叶变换(FFT)实现卷积的快速计算。
快速卷积
1 快速循环卷积
由相当于
得
可以表示为
。
复杂度
卷积法的复杂度
N2次复数相乘。
N(N – 1)次复数相加。
快速傅立叶变换的复杂度
3 FFTs + N次乘法(3个傅立叶变换加上N次乘法)。
次复数相乘。
次复数相加。
如果
能被提前计算,通过FFT实现卷积计算的复杂度将只会有2 FFts + N次乘法。
2 快速线性卷积
DFT1能实现循环卷积。要实现线性卷积,必须用填补0序列的方式使得卷积后循环迂回部分为0。要想通过快速循环卷积得到线性卷积,必须用0补齐DFTs的长度到
Figure 1
Figure 2
Figure 3
选择一个N(通常是2的指数且刚好大于L+ M – 1)通过离散傅立叶变换来实现快速卷积
注意:与循环卷积相比,在DFTs2中添加了更多的0。尽管如此,与直接计算法相比,复杂度仍旧会节约
。
2015.08.04
3 运行卷积
对于一个时域的滤波器程序,如果或者
,就有高效的方法来快速计算卷积。
3.1 重叠保留(OLS)方法
一个长度为M的滤波器和一个信号
的长度为N的部分作循环卷积时,计算结果的前M – 1部分数据为
参与计算部分后M
– 1部分数据,因此计算结果是不正确的。然而,对于结果的
部分,所发生的卷积为线性卷积,这部分计算是正确的。因此,对于长度为N的循环卷积中,只有N – M + 1部分的计算结果是正确的。
重叠保留法(The Over-Save Method):将一个长信号序列分成N块连续的信号序列,每块信号序列的前M – 1部分跟前一块信号序列的后M – 1重叠(第一块信号序列前可补M – 1个0)。然后再用滤波器
来做循环卷积,将每次循环卷积的结果的前M – 1部分去掉,并依次将每次卷积结果连接在一块就能得到正确的
。
计算长度为N的信号序列所耗复杂度相当于计算2nFFT(假设提前计算了H(k))+2FFTs以及N次乘法
次复数乘法
次复数加法
对于M元,直接卷积时的每次输出都有M – 1次加法。对于一个给定的M,通过寻找操作次数最小时的N值来使得计算过程最优。一般来说,最优的N值处于
。
3.2 重叠相加(OLA)方法
为长度为L的信号序列块添加M – 1个0。以重叠M – 1的部分的方式连续相加每一个序列,以去掉循环卷积时所重叠的M – 1部分而得到线性卷积。这个操作的复杂度为:2个长度N = L + M – 1的FFTs,每输出L点的M元的M – 1次加法;基本跟OLS方法的复杂度相同。
Figure 4
Figure 5
Figure 6
[math translate note]
[2015.08.04-13:18]
相关文章推荐
- git 问题
- 玲珑杯Unity开发心得——游戏中暂停及积分显示GUI
- 重学java23种设计模式(12)代理模式
- iOS UIScrollView里面添加UIView,有时候y相差20
- windows下修改mysql的数据库数据文件路径
- Get vertical scrollbar width and example
- string引用传递的特殊性
- trie树Java实现
- JS中"||"操作符的用法
- 我所理解的马
- 共振峰估计基础
- 如何记忆网络掩码和位数的对应关系
- 手势识别器
- Spark入门三部曲之第二步Spark开发环境搭建
- myeclipse导入java EE 5 Library
- IOS布局
- 大数据:通过Mesos、Docker和Go,使用300行代码创建一个分布式系统
- 一个不小心引发的问题,installation failed invalid argument
- 23种设计模式搞笑解释
- PIM-SM