用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. Tomcat创建项目

    查看项目信息 index.jsp默认首页 更新资源自动部署不用重启服务器,要用debug的方式启动 更新java代码和更新资源自动部署不用重启服务器,要用debug的方式启动

  2. 一、centos7更改网卡名称eth0

    异步赠书:10月Python畅销书升级 [线路图]人工智能到底学什么?! 程序员10月书讯 每周荐书(京东篇):618取胜之道.质量保障.技术解密) Centos7更改网卡名称Eth0 标签: Cen ...

  3. OpenCV函数 重映射

    重映射是什么意思? 把一个图像中一个位置的像素放置到另一个图片指定位置的过程. 为了完成映射过程, 有必要获得一些插值为非整数像素坐标,因为源图像与目标图像的像素坐标不是一一对应的. 我们通过重映射来 ...

  4. 安装apache ActiveMQ

    笔者环境 操作系统centos 6.9 java jdk 1.8 activemq版本 5.15.9 a)安装activemq需要jdk 环境,这里使用的是 jdk 1.8 yum安装jdk比较简单, ...

  5. php对字符串的操作

    php最文字的处理很是强大,之前一直云里雾里,这次学习一下. 1,' 与 ”的区别 <?php //双引号中的特殊字符会被解析 echo "你好\t我好";echo &quo ...

  6. python中GraphViz's executables not found的解决方法以及决策树可视化

    出现GraphViz's executables not found报错很有可能是环境变量没添加上或添加错地方. 安装pydotplus.graphviz库后,开始用pydotplus.graph_f ...

  7. JQuery/JS插件 jsTree加载树,预先加载,初始化时加载前三级节点,当展开第三级节点时 就加载该节点下的所有子节点

    jsTree加载树, 初始化时 加载前三级节点, 当展开第三级节点时 就加载该节点下的所有子节点 html: <!DOCTYPE html> <html> <head&g ...

  8. springboot jar文件打zip包运行linux环境中

    1.添加打包配置文件 1.1  assembly.xml <assembly xmlns="http://maven.apache.org/plugins/maven-assembly ...

  9. 吴裕雄 python 机器学习——多项式贝叶斯分类器MultinomialNB模型

    import numpy as np import matplotlib.pyplot as plt from sklearn import datasets,naive_bayes from skl ...

  10. Codeforces 1315B Homecoming (二分)

    After a long party Petya decided to return home, but he turned out to be at the opposite end of the ...