用DFT计算线性卷积

两有限长序列之间的卷积

我们知道,两有限长序列之间的卷积可以用圆周卷积代替,假设两有限长序列的长度分别为\(M\)和\(N\),那么卷积后的长度为\(L=M+N-1\),那么用圆周卷积计算线性卷积的具体过程为:

  1. 首先将两序列在尾部补零,延拓成长度为L=M+N-1的序列
  2. 将两序列进行圆周卷积,卷积后的结果即为线性卷积的结果

  而圆周卷积的实现可以通过下图实现

现讨论\(X[k]\)的\(IDFT\)使用\(DFT\)实现
\[
x[n]=\frac{1}{N}\sum_{n=0}^{N-1}X[k]W_N^{-kn}=\frac{1}{N}(\sum_{n=0}^{N-1}X^{*}[k]W_N^{kn})^{*}\rightarrow \frac{1}{N}(DFT\{X^{*}[k]\})^{*}
\]
上图可以改进为

所以线性卷积可以完全使用\(DFT\)实现,而\(DFT\)可以使用其快速算法\(FFT​\)大大降低计算量。

有限长序列与无限长序列卷积

或者说有限长序列与另一长度远大于其长度的序列进行卷积,如果按照上面直接用\(DFT\)计算的话,有两个问题。

  1. 必须知道无限长序列的全部元素,才能进行计算
  2. 用DFT计算卷积可能还不如直接进行卷积运算来得快

为解决上述的问题,可以将无限长序列划分为短序列,将短序列与有限长序列进行卷积,然后对结果进行处理,主要由两种方法:重叠相加法和重叠保留法。

重叠相加法

假设有限长序列\(h[n]\)的长度为\(M\),无限长序列\(x[n]\)将其以长度\(N\)进行分割,则
\[
x[n]=\sum_{m=-\infty}^{\infty}x_m[n-mN]
\]
其中
\[
x_m[n]=\begin{cases}
x[n+mN], &0 \leq n \leq N-1\\
0, &其他
\end{cases}
\]
\(x_m[n]\)表示将划分的第\(m\)段的起点移到原点。如下

则卷积
\[
\begin{aligned}
y[n]=h[n]*x[n]&=\sum_{l=-\infty}^{\infty}h[l]x[n-l]\\
&=\sum_{l=-\infty}^{\infty}h[l]\sum_{m=-\infty}^{\infty}x_m[n-l-mN]\\
&=\sum_{m=-\infty}^{\infty}\sum_{l=-\infty}^{\infty}h[l]x_m[n-l-mN]\\
&=\sum_{m=-\infty}^{\infty}h[n]*x_m[n-mN]
\end{aligned}
\]
记\(y_m[n]=h[n]*x_m[n]\),则上式可写为
\[
y[n]=\sum_{m=-\infty}^{\infty}y_m[n-mN]
\]

该式表示卷积结果等于\(h[n]\)与\(x_m[n]\)卷积,然后将这些卷积结果移位相加。

可知\(mN\backsim mN+M-2\)共\(M-1\)点是重叠的,这些点要加起来,所以具体算法是:将\(x[n]\)以\(N\)为长度划分为若干组\(x_m[n]\),将这些组分别与\(h[n]\)进行卷积得到\(y_m[n]\),然后将这些卷积结果进行移位,重叠部分要相加,这就是重叠相加法。

上述提到的\(x_m[n]\)与\(h[n]\)的卷积,均可使用上面提到的\(DFT\)实现。

重叠保留法

同样将\(x[n]\)以长度\(N\)进行划分,一般取\(N>M\),这时以\(N\)点进行圆周卷积。实际卷积的长度\(l=N+M-1\),由圆周卷积与线性卷积的关系,知圆周卷积的后\(2N-l=N-M+1\)个点与线性卷积的结果是一致的。


\[
x_m[n]=\begin{cases}x[n+mL], &0 \leq n \leq N-1 \\
0, &其他\end{cases}
\]

将\(x_m[n]\)与\(h[n]\)进行\(N\)点圆周卷积得到\(y_m[n]\),只取后\(N+M-1\)个点,其余重叠的前\(M-1\)个点舍弃(保留)。然后进行移位相加,得到的结果就是进行线性卷积的结果。

由上图知,要使得到的结果表示\(y[n]\),应使得\(L-M-2=N-2+1 \Rightarrow L=N-M+1\)

同理上面提到的圆周卷积均可用\(DFT\)进行实现。

最新文章

  1. 【微服务】SpringBoot、SpringCloud相关
  2. BZOJ3294: [Cqoi2011]放棋子
  3. Linux基础知识(一)
  4. 页面加载完毕执行多个JS函数
  5. HTML5—canvas绘制图形(1)
  6. ubuntu Error mounting /dev/sda6 at /media/xxx...
  7. [转]XModem协议
  8. PSO:利用PSO+ω参数实现对一元函数y = sin(10*pi*x) ./ x进行求解优化,找到最优个体适应度—Jason niu
  9. Ubuntu下安装git
  10. 区块链入门(5)Truffle 项目实战,Solidity IDE, 智能合约部署
  11. 数组长度为len,数组元素的范围是0到len-1,找出数组的重复元素
  12. 【转】Sqlserver将数据从一个表插入到另一个表
  13. forward reference前向引用,gloal values and local values全局变量和局部变量,recursive function递归函数
  14. html5的理解
  15. 如何解决win10关机状态下,按键盘会自动开机的问题
  16. Unity中UGUI之Canvas属性解读版本一
  17. cmake源码包安装后的卸载问题
  18. Opencv2教程一:图像变换之阈值二值threshold
  19. ASP.NET MVC 学习笔记(三),排序加查找
  20. python学习之老男孩python全栈第九期_day016作业

热门文章

  1. spring bean 的作用域
  2. C#泛型应用及原理
  3. 2020ICPC 博弈题 纳新一百的石子游戏
  4. scss(sass)
  5. [linux] Ubuntu18.04 安装mysql密码不对
  6. H5实现查看图片和删除图片的效果
  7. arcgis中的Join(合并连接)和Relate(关联连接)
  8. Flask 教程 第十七章:Linux上的部署
  9. bugku 管理员系统
  10. Nuxt的路由配置以及传参