用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\)进行实现。

14 用DFT计算线性卷积的更多相关文章

  1. MATLAB GUI设计(线性卷积和循环卷积的比较--笔记)

    原创循环卷积代码,转载需注明出处 线性卷积与循环卷积的比较 实验目的和要求 掌握循环卷积和线性卷积的原理,与理论分析结果比较,加深理解循环卷积与线性卷积之间的关系. 实验内容和步骤 1) 已知两序列X ...

  2. DFT计算过程详解

    DFT计算过程详解 平时工作中,我们在计算傅里叶变换时,通常会直接调用Matlab中的FFT函数,或者是其他编程语言中已经为我们封装好的函数,很少去探究具体的计算过程,本文以一个具体的例子,向你一步一 ...

  3. (原+转)使用opencv的DFT计算卷积

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5462665.html 参考网址: http://blog.csdn.net/lichengyu/art ...

  4. Opencv 实现图像的离散傅里叶变换(DFT)、卷积运算(相关滤波)

    我是做Tracking 的,对于速度要求非常高.发现傅里叶变换能够使用. 于是学习之. 核心: 最根本的一点就是将时域内的信号转移到频域里面.这样时域里的卷积能够转换为频域内的乘积! 在分析图像信号的 ...

  5. matlab中的卷积——filter,conv之间的区别

    %Matlab提供了计算线性卷积和两个多项式相乘的函数conv,语法格式w=conv(u,v),其中u和v分别是有限长度序列向量,w是u和v的卷积结果序列向量. %如果向量u和v的长度分别为N和M,则 ...

  6. C++ Opencv 傅里叶变换的代码实现及关键函数详解

    一.前言 最近几天接触了图像的傅里叶变换,数学原理依旧不是很懂,因此不敢在这里妄言.下午用Opencv代码实现了这一变换,有一些经验心得,愿与大家分享. 二.关键函数解析 2.1copyMakeBor ...

  7. 深度学习算子优化-FFT

    作者:严健文 | 旷视 MegEngine 架构师 背景 在数字信号和数字图像领域, 对频域的研究是一个重要分支. 我们日常"加工"的图像都是像素级,被称为是图像的空域数据.空域数 ...

  8. 卷积、矩阵乘积、高斯模糊滤波(降噪)、空域计算(2D卷积计算)、频域计算(FFT)的理解

    矩阵乘积:对应行列对应元素相乘的和组成新的矩阵 两个矩阵的乘法仅当第一个矩阵A的列数和另一个矩阵B的行数相等时才能定义.如A是m×n矩阵和B是n×p矩阵,它们的乘积C是一个m×p矩阵 并将此乘积记为: ...

  9. 数学之路-python计算实战(20)-机器视觉-拉普拉斯算子卷积滤波

    拉普拉斯算子进行二维卷积计算,线性锐化滤波 # -*- coding: utf-8 -*- #线性锐化滤波-拉普拉斯算子进行二维卷积计算 #code:myhaspl@myhaspl.com impor ...

随机推荐

  1. Python_内置函数和匿名函数

    楔子 在讲新知识之前,我们先来复习复习函数的基础知识. 问:函数怎么调用? 函数名() 如果你们这么说...那你们就对了!好了记住这个事儿别给忘记了,咱们继续谈下一话题... 来你们在自己的环境里打印 ...

  2. SQL Server经典sql语句大全(转)

    一.基础1.说明:创建数据库CREATE DATABASE database-name2.说明:删除数据库drop database dbname3.说明:备份sql server--- 创建 备份数 ...

  3. C. Grid game 思维+问题转化

    C. Grid game 思维+问题转化 题意 每当有一行或者一列方格的时候,都可以消气这一行或者这一列,一共有两种形状的方块,一种是横的两个,一种是竖着的两个,按时间顺序放在4*4的格子里面,问怎么 ...

  4. 【C语言】一堆数组中存放了10个小于100的整数,请编程对所有数据按照从小到大的顺序进行排序,若个位数相等,则按照十位从小到大的顺序排序,输出排序后的结果

    分析:取余,判断个位是否相等,利用冒泡法排序 #include <stdio.h> int main() { ] = { ,,,,,,,,, };/*数组*/ int i, j, k; ; ...

  5. [CF]Round510

    由于我的codeforces的帐号登不上,所以我错过了这场比赛,只好赛后再抄题解自己做. A Benches 最大的情况就是所有人都挤在那个人最多的长椅上,最小的情况是所有人尽量平均的坐. #incl ...

  6. DB技能数据库里把技能伤害调整

    1. MagID 技能代号 2. MagName 技能名称 3. Effect Type 效果类型(使用技能时角色的动作效果) 4. Effect 效果(技能产生的动画效果) 5. Spell 每次耗 ...

  7. 7_1 除法(UVa725)<选择合适的枚举对象>

    如果把数字0到9分配成2个整数(各五位数),现在请你写一支程序找出所有的配对使得第一个数可以整除第二个数,而且商为N(2<=N<=79),也就是:abcde / fghijk = N这里每 ...

  8. spring 的异步处理

    1.先解析几个类的用法 1.1  java.lang.annotation.Annotation @Target(ElementType.FIELD) @Retention(RetentionPoli ...

  9. SpringMVC的三种处理器适配器

    SpringMVC具有三种处理器适配器,他们分别是BeanNameUrlHandlerMapping.SimpleControllerHandlerAdapter.ControllerClassNam ...

  10. 【 SSH 实例】使用ssh开发的简单项目

    简单的员工管理项目,使用spring.struts1.hibernate开发 applicationContext.xml <?xml version="1.0" encod ...