线性卷积与循环卷积

在音频信号处理中,卷积是很常见的信号处理方式,例如fir滤波器,卷积的计算公式也非常简单,对于系统h和输入信号x,卷积的计算公式如下:

y(t)=∑m=0N−1x(t−m)h(m)y(t)=\sum\limits_{m=0}^{N-1}x(t-m)h(m)y(t)=m=0∑N−1​x(t−m)h(m)

这种普通的卷积也称为线性卷积,一个长为L的信号x和长为M的系统h进行卷积,相当于在x的前后做M-1个点的padding,然后再与h进行卷积运算,结果的长度为L+M+1

y(t)=[∑m=0N−1x(t−m)h(m)]RN(t)y(t) = [\sum\limits_{m=0}^{N-1}x(t-m)h(m)]R_N(t)y(t)=[m=0∑N−1​x(t−m)h(m)]RN​(t)
而一个N点循环卷积相当于将x和h做周期为N的延拓后进行卷积,然后再取其主值区间,得到的结果长度为N
我们定义x=[1,2,3,4]x=[1,2,3,4]x=[1,2,3,4]和h=[5,6,7,8]h=[5,6,7,8]h=[5,6,7,8],下面用一张示意图来表示线性卷积和圆周卷积的计算方式:

总结下来就是:
线性卷积:将x补零,反褶,然后滑动,与对应位置的h相乘求和
循环卷积:将x和h补零至N点,x逆时针平均分布在大圆上,h顺时针分布在小圆上,然后顺时针旋转大圆,与对应位置的h相乘求和
我们可以将卷积中每一步的滑动变换为矩阵乘法并行的进行卷积运算,对于循环卷积,将其变换为矩阵后是一个循环矩阵,我们利用python代码来求线性卷积和循环卷积:

import numpy as np
from scipy.linalg import toeplitzdef circular_convolve(x,h,N):c = np.pad(x,[0,N-len(x)],mode='constant')r = np.roll(c[::-1],1)x_c = toeplitz(c,r)h_c = np.pad(h,[0,N-len(h)],mode='constant')return np.dot(x_c,h_c)def convolve(x,h):L = len(x)M = len(h)N = L+M-1x_p = np.pad(x,[M-1,M-1],mode='constant')index = np.arange(M)[::-1][None, :] + np.arange(N)[:, None]return np.dot(x_p[index],h)

x = [5,6,7,8]
h = [1,2,3,4]
L=4print('线性卷积结果为:')
print(convolve(x,h))
print('循环卷积结果为:')
print(circular_convolve(x,h,L))

输出为:

线性卷积结果为:
[ 5 16 34 60 61 52 32]
循环卷积结果为:
[66 68 66 60]

卷积与FFT

虽然卷积的计算方法很简单,但是当x和h都很长的时候,卷积计算是非常耗费时间的。直接卷积运算的复杂度为O[N2]\mathcal{O}[N^2]O[N2],因此有必要找到比直接计算卷积更快的办法。
相信大家都知道时域的卷积等于频域的乘积这个定理,因此要计算时域的卷积,可以将时域信号转换为频域信号,进行乘积运算之后再将结果转换为时域信号,实现快速卷积。
在我之前的文章使用python实现基-2FFT、基-4FFT快速傅里叶变换算法中分析到,经过优化的FFT其运算的复杂度为O[NlogN]\mathcal{O}[NlogN]O[NlogN],显然通过FFT计算卷积要比直接计算快速得多。
不过由于FFT运算假设其所计算的信号为周期信号,因此通过FFT计算出的结果实际上是两个信号的循环卷积,而不是线性卷积。
使用numpy的fft来计算卷积:

import numpy as npx = [5,6,7,8]
h = [1,2,3,4]X = np.fft.rfft(x)
H = np.fft.rfft(h)
y = np.fft.irfft(X*H)print('fft计算卷积结果为:')
print(y)

输出为:

fft计算卷积结果为:
[66. 68. 66. 60.]

可以看到,将x和h变换到频域相乘,然后变换回时域的结果与循环卷积的结果一致。
如果需要使用FFT计算线性卷积,就需要对信号进行补零扩展,使得其长度长于线性卷积结果的长度。
对x和h进行补零,然后再进行fft:

import numpy as npx = [5,6,7,8]
h = [1,2,3,4]X = np.fft.rfft(x,n=7)
H = np.fft.rfft(h,n=7)
y = np.fft.irfft(X*H,n=7)print('fft计算卷积结果为:')
print(y)

输出为:

fft计算卷积结果为:
[ 5. 16. 34. 60. 61. 52. 32.]

可以看到,结果与线性卷积结果一致

线性卷积、循环卷积与FFT之间的关系相关推荐

  1. DFT,DTFT,DFS,FFT之间的关系以及序列补零和插值对频域的影响

    DFT,DTFT,DFS,FFT之间的关系 很多同学学习了数字信号处理之后,被里面的几个名词搞的晕头转向,比如DFT,DTFT,DFS,FFT,FT,FS等,FT和FS属于信号与系统课程的内容,是对连 ...

  2. 基于matlab实现信号的线性卷积与循环卷积

    系列文章目录 数字信号处理(DSP:Digital Signal Process)是电子通信领域非常重要的研究方向,博主汇总了数字信号处理(DSP)中常用的经典案例分析,主要基于算法分析.MATLAB ...

  3. 循环卷积和线性卷积(矩阵视角)

    文章目录 循环卷积 循环矩阵(Circulant Matrices) 循环矩阵与循环卷积的关系 线性卷积 循环卷积 循环矩阵(Circulant Matrices) C=[c0c1⋯cN−1cN−1c ...

  4. 01_家庭用电预测:线性回归算法(时间与功率功率与电流之间的关系)

    # 引入所需要的全部包 from sklearn.model_selection import train_test_split from sklearn.linear_model import Li ...

  5. 回归算法实例一:家庭用电预测——时间与功率、功率与电流、时间与电压之间的关系

    安装numpy:pip install --index https://pypi.mirrors.ustc.edu.cn/simple/ numpy 安装scipy:pip install --ind ...

  6. 线性卷积、循环卷积、周期卷积的定义、计算方法及三者之间的关系

    文章目录 前言 一.卷积的物理意义及性质 1. 物理意义 2. 卷积性质 二.线性卷积定义及计算方法 1. 定义公式 2. 适用范围 3. 计算方法 三.循环卷积定义及计算方法 1. 定义公式 2. ...

  7. 【数字信号处理】线性时不变系统 LTI “ 输入 “ 与 “ 输出 “ 之间的关系 ( LTI 系统单位脉冲响应 | 卷积 | 卷积推导过程 )

    文章目录 一.LTI 系统单位脉冲响应 二.卷积 一.LTI 系统单位脉冲响应 线性时不变系统 , 简称 " LTI " , 英文全称 Linear time-invariant ...

  8. 【数字信号处理】线性时不变系统 LTI “ 输入 “ 与 “ 输出 “ 之间的关系 ( 线性卷积起点定理推导过程 )

    文章目录 一.线性卷积起点定理推导过程 推导 [数字信号处理]线性时不变系统 LTI " 输入 " 与 " 输出 " 之间的关系 ( 线性卷积起点定理 | 左边 ...

  9. 【数字信号处理】线性时不变系统 LTI “ 输入 “ 与 “ 输出 “ 之间的关系 ( 线性卷积计算案例二 | 计算 卷积 )

    文章目录 一.线性卷积计算 案例二 一.线性卷积计算 案例二 给定如下两个序列 : x(n)={3,4,5}[−2,0]x(n) = \{ 3 , 4, 5 \}_{[-2,0]}x(n)={3,4, ...

最新文章

  1. 【微服务架构】SpringCloud之断路器(hystrix)
  2. mlcc激光雷达与相机外参标定初体验
  3. 拦截器和过滤器之间有很多相同之处,但是两者之间存在根本的差别
  4. 统计日志中ip访问次数并排序的三种方法
  5. Codeforces 991E. Bus Number (DFS+排列组合)
  6. B1928 日期差值
  7. 【Mysql】Mysql数据表区分大小写问题解决方案
  8. tomcat7 加载el表达式 报错 使用tomcat8得以解决
  9. 今日恐慌与贪婪指数为79 贪婪程度有所上升
  10. 学无止境,我还在进步
  11. 计算机思维导论在线作业答案,大学计算机计算思维导论第讲习题及解析.pdf
  12. mysql中YEARWEEK跨年引发的线上问题
  13. 大学生旅游风景主题dreamweaver网页设计大作业-陕西渭南HTML+CSS制作网页
  14. TFS2010安装图解
  15. linux中find查找文件和查找文件内容
  16. SecureCRT键盘无法输入
  17. 2.0 Mesh Beacon帧格式
  18. 人工智能 5.搜索树求解
  19. android 高德地图方向指向不变问题分析
  20. 公众号分享页面php,微信公众号网页分享功能开发的示例代码

热门文章

  1. 简书 u盘安装linux,U盘安装Ubuntu18.04
  2. Android 笔记 沉浸式状态栏设置及效果说明
  3. 无盘服务器的优缺点,网众无盘服务器建议
  4. 西西弗神话-我们终其一生最重要的是什么!!!
  5. 一张通往2030的“高铁票”:从无线网络到智能世界
  6. 计算机维修种子,【数据恢复,维护计算机,硬盘和分区,备份和还原
  7. 竞猜类游戏Fastwin遭黑客攻击背后:Block.one官方悄然做了重大更新
  8. 纳税服务系统【系统、子系统首页】
  9. 内存泄漏检测工具vmmap使用指南
  10. VS code 的简单入门使用方法(汇总版本)