快速卷积介绍

快速卷积是一种使用快速傅里叶变换(FFT)来有效计算两个序列(信号、函数等)卷积的方法。快速卷积对于数字信号处理、图像处理、音频处理等领域至关重要,因为它大大提高了计算卷积的效率。

卷积的概念

卷积是一种数学运算符,用于两个函数(信号)的合成。在信号处理中,卷积可以表示为:
( f ∗ g ) [ n ] = ∑ m = − ∞ ∞ f [ m ] ⋅ g [ n − m ] (f * g)[n] = \sum_{m=-\infty}^{\infty} f[m] \cdot g[n - m] (fg)[n]=m=f[m]g[nm]
其中, f f f g g g 是两个序列,( * ) 表示卷积运算。这种计算对于序列的每一个点,需要将一个序列翻转并且平移,然后与另一个序列相乘,最后将乘积求和得到结果序列的对应点的值。

快速傅里叶变换(FFT)

快速傅里叶变换是一种算法,能够快速计算序列的离散傅里叶变换(DFT)及其逆变换。DFT将时域(或空间域)信号转换为频域信号,而逆DFT(IDFT)则将频域信号转换回时域。FFT的一个关键特点是其复杂度是 O ( N log ⁡ N ) O(N \log N) O(NlogN),相比直接计算的 O ( N 2 ) O(N^2) O(N2) 要小得多。

快速卷积的步骤

下面是执行快速卷积的具体步骤:

  1. 零填充(Zero-padding)
  • 给定两个序列 f [ n ] f[n] f[n] g [ n ] g[n] g[n],我们首先要将它们扩展到至少 N + M − 1 N + M - 1 N+M1的长度,其中 N N N M M M 分别是 f f f g g g 的长度。
  • 这样做是为了避免卷积时的循环效应,并且能够在FFT中使用2的幂次大小,提高计算效率。
  1. 计算FFT
  • 对扩展后的序列 f [ n ] f[n] f[n] g [ n ] g[n] g[n] 分别计算FFT,得到它们的频域表示 F [ k ] F[k] F[k] G [ k ] G[k] G[k])。
  1. 频域乘法
  • 在频域中,将 F [ k ] F[k] F[k] G [ k ] G[k] G[k] 进行逐点乘法,得到 H [ k ] = F [ k ] ⋅ G [ k ] H[k] = F[k] \cdot G[k] H[k]=F[k]G[k]。这个步骤等价于时域中的卷积操作。
  1. 计算逆FFT(IFFT)
  • H [ k ] H[k] H[k] 进行IFFT,将频域的乘积结果转换回时域,得到序列 h [ n ] h[n] h[n],这是 ( f [ n ] ( f[n] (f[n] g [ n ] g[n] g[n]的卷积结果。
  1. 裁剪(Trimming)
  • 如果需要,对 h [ n ] h[n] h[n]进行裁剪,只保留有效的卷积结果,即前 ( N + M − 1 ( N + M - 1 (N+M1 个样本。

每一步操作的具体情况

  • 零填充 是为了满足FFT算法的需要,同时确保卷积结果不受边缘效应影响。
  • FFT 是快速卷积中最核心的步骤,它将大规模计算的复杂度从 O ( N 2 ) O(N^2) O(N2) 降低到 O ( N log ⁡ N ) O(N \log N) O(NlogN)
  • 点乘 在频域中执行是因为它等同于时域中的卷积,根据卷积定理,两个信号的卷积等于它们傅里叶变换的乘积。
  • IFFT 是必要的因为我们最终需要的是时域信号,而不是频域信号。
  • 裁剪 是因为FFT操作中引入的零填充并不是卷积的一部分,因此需要去除。

示例

让我们通过一个具体的例子来说明快速卷积的过程。假设我们有两个序列,分别是 ( f[n] ) 和 ( g[n] ),它们的值如下:
f [ n ] = 1 , 2 , 3 f[n] = {1, 2, 3} f[n]=1,2,3
g [ n ] = 4 , 5 g[n] = {4, 5} g[n]=4,5
为了进行快速卷积,我们将遵循以下步骤:

  1. 零填充(Zero-padding):
    首先,确定两个序列的长度,这里 f [ n ] f[n] f[n] 的长度为3, g [ n ] g[n] g[n]的长度为2。根据卷积的性质,卷积操作结果的长度将是 N f + N g − 1 = 3 + 2 − 1 = 4 N_f + N_g - 1 = 3 + 2 - 1 = 4 Nf+Ng1=3+21=4。所以我们至少需要对序列进行零填充以达到长度为4。但是,为了使用FFT的优势(特别是当序列长度为2的幂时),我们选择下一个更大的2的幂的长度,这里为4(已经是2的幂)。
    所以零填充后的序列为:
    f [ n ] = 1 , 2 , 3 , 0 f[n] = {1, 2, 3, 0} f[n]=1,2,3,0
    g [ n ] = 4 , 5 , 0 , 0 g[n] = {4, 5, 0, 0} g[n]=4,5,0,0
  2. 快速傅里叶变换(FFT):
    接下来,我们对两个序列进行FFT,得到它们的频域表示。这里使用 F [ k ] F[k] F[k] G [ k ] G[k] G[k] 表示FFT结果。
    使用某个FFT算法或者库函数得到了以下结果:
    F [ k ] = [ 6. + 0. j , − 2. − 2. j , 2. + 0. j , − 2. + 2. j ] F[k] = [ 6.+0.j, -2.-2.j, 2.+0.j, -2.+2.j] F[k]=[6.+0.j,2.2.j,2.+0.j,2.+2.j]
    G [ k ] = [ 9. + 0. j , 4. − 5. j , − 1. + 0. j , 4. + 5. j ] G[k] = [ 9.+0.j, 4.-5.j, -1.+0.j, 4.+5.j] G[k]=[9.+0.j,4.5.j,1.+0.j,4.+5.j]
  3. 频域乘法:
    现在,我们在频域中对 F [ k ] F[k] F[k] G [ k ] G[k] G[k] 进行逐点乘法。
    结果为: H [ k ] = F [ k ] ⋅ G [ k ] = [ 54. + 0. j , − 18. + 2. j , − 2. + 0. j , − 18. − 2. j ] H[k] = F[k] \cdot G[k] = [ 54.+0.j, -18.+2.j, -2.+0.j, -18.-2.j] H[k]=F[k]G[k]=[54.+0.j,18.+2.j,2.+0.j,18.2.j]
  4. 计算逆FFT(IFFT):
    然后,我们对 ( H[k] ) 进行逆FFT以转换回时域: h [ n ] = IFFT ( H [ k ] ) h[n] = \text{IFFT}(H[k]) h[n]=IFFT(H[k])
    得到的结果是 h [ n ] = [ 4. + 0. j , 13. + 0. j , 22. + 0. j , 15. + 0. j ] h[n] = [ 4.+0.j, 13.+0.j, 22.+0.j, 15.+0.j] h[n]=[4.+0.j,13.+0.j,22.+0.j,15.+0.j]
  5. 裁剪:
    由于我们知道最终的卷积长度应该为 N f + N g − 1 = 4 N_f + N_g - 1 = 4 Nf+Ng1=4,我们可以直接取 h [ n ] h[n] h[n] 的前4个值 [ 4. , 13. , 22. , 15. ] [ 4., 13., 22., 15.] [4.,13.,22.,15.]作为最终结果。

这里是一个使用Python中的numpy库来执行快速卷积操作的例子。numpy提供了FFT功能,使得这个过程相对直接。

import numpy as np# 定义两个序列
f = np.array([1, 2, 3])
g = np.array([4, 5])# 1. 零填充
# 序列的长度分别是3和2,卷积后的长度应该是3+2-1=4
# 我们对两个序列进行零填充以匹配这个长度
N = len(f) + len(g) - 1
f_padded = np.pad(f, (0, N - len(f)))
g_padded = np.pad(g, (0, N - len(g)))print(f'零填充后的 f: {f_padded}')
print(f'零填充后的 g: {g_padded}')# 2. 计算FFT
F = np.fft.fft(f_padded)
G = np.fft.fft(g_padded)print(f'FFT后的 F: {F}')
print(f'FFT后的 G: {G}')# 3. 频域乘法
H = F * Gprint(f'频域乘法后的 H: {H}')# 4. 计算逆FFT(IFFT)
h = np.fft.ifft(H)print(f'逆FFT后的 h: {h}')# 5. 裁剪 (由于我们使用了合适的零填充,所以这里不需要裁剪)
# 但是由于IFFT的结果可能包含非常小的虚部(由于计算误差),我们取实部
h_real = np.real(h)print(f'裁剪(取实部)后的 h: {h_real}')'''
零填充后的 f: [1 2 3 0]
零填充后的 g: [4 5 0 0]
FFT后的 F: [ 6.+0.j -2.-2.j  2.+0.j -2.+2.j]
FFT后的 G: [ 9.+0.j  4.-5.j -1.+0.j  4.+5.j]
频域乘法后的 H: [ 54.+0.j -18.+2.j  -2.+0.j -18.-2.j]
逆FFT后的 h: [ 4.+0.j 13.+0.j 22.+0.j 15.+0.j]
裁剪(取实部)后的 h: [ 4. 13. 22. 15.]
'''

这段代码首先导入numpy库,然后定义了两个序列fg。接下来,我们对这两个序列进行零填充以满足FFT计算,并且保证卷积结果的长度正确。然后,我们对这两个序列进行FFT,将它们转换到频域。在频域中,我们进行点乘操作,这相当于时域中的卷积。接着,我们对乘积进行逆FFT操作,将结果转换回时域。最后一步,我们通常需要裁剪掉结果中的额外零,但由于我们初始时就使用了正确的长度,这里不需要额外裁剪。我们只取实部,因为IFFT可能会产生非常小的虚数部分,这通常是由于计算中的舍入误差。

结论

快速卷积是一个在工业和科研中非常有用的工具。它利用FFT大大加速了卷积计算,特别是对于大规模数据。然而,它也引入了需要考虑的因素,比如零填充和边界效应,以及在某些实时系统中FFT可能引入的延迟。尽管如此,快速卷积在许多领域仍然是首选的计算方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/707672.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

让AI给你写代码,初体验(二)-写一个flask应用

这里我们准备让AI做一个稍微复杂一点任务,写一个前后应用,具体: 前台用html输入股票代码,后台通过akshare的接口程序获取该股票的实时价格,然后返回显示在html 我们先用AI对话看一下,AI会给我们什么编码建…

Flink Catalog

1.Flink侧创建 按照SQL的解析处理流程在Parse解析SQL以后,进入执行流程——executeInternal。   其中有个分支专门处理创建Catalog的SQL命令 } else if (operation instanceof CreateCatalogOperation) {return createCatalog((CreateCatalogOperation) operatio…

[多进程] 进程间通信-笔记

文章目录 创建进程的方法Linuxforkexecsystem Windowscreateprocessshellexecutesystem 进程间通信方法管道(Pipe)管道的种类特点 通过文件通信内存映射(文件映射)匿名映射 共享内存 信号量(或者锁)消息队列Windows消息队列Linux…

finedance 测试笔记

目录 依赖库: 预测流程: 音乐wav切割120帧 general_all.py改进 smplx 学习笔记: 依赖库: import pickle5 as picklepypi尚pickle5最高python版本3.7: pickle5 PyPI 解决方法,改为 import pickle …

cpp基础学习笔记01

C和C的区别 1.语言类型:C 是一种过程性编程语言,着重于以函数为基础的结构化编程;而 C 是一种多范式编程语言,支持面向对象编程(OOP)和泛型编程等多种编程范式。 2.对象模型:C 支持类和对象的概…

switch其他知识点

1.default的位置在整体输出语句中,放哪都可以; 省略的话结果会不显示; 2.case穿透,还是比较好理解的,因为缺少break导致会把下面的也打印,结果是输出多个 3.switch新特性:是用->减号和大于…

Mysql <=> 安全等于

<> 安全等于&#xff0c;为NULL安全的等值比较运算符&#xff08;NULL-safe equal&#xff09;&#xff0c;该操作符作用类似“”。 区别为当符号两边出现NULL值时&#xff0c;操作符会返回NULL&#xff0c;而<>会返回1&#xff08;两边操作数都为NULL时&#xff…

柯桥会计培训学校,会计职称考试,考中级会计怎么证明工作年限?

中级会计考试是会计从业人员的重要考试之一&#xff0c;对于中级考生来说&#xff0c;工作年限证明是必不可少的一步。因此&#xff0c;在考中级会计之前&#xff0c;需要对如何证明工作年限进行了解和掌握。 为大家整理了工作年限证明相关信息&#xff0c;一起来看看吧~ 一、…

Rocky Linux 运维工具 ls

一、ls 的简介 ​​ls​ 用于列出当前目录下的文件和目录&#xff0c;以及它们的属性信息。通过 ​ls​命令可以查看文件名、文件大小、创建时间等信息&#xff0c;并方便用户浏览和管理文件。 二、ls 的参数说明 序号参数描述1-a显示所有文件&#xff0c;包括以 ​.​开头的…

java单元测试技巧

Test装饰器指定断言类型 在JUnit 4中&#xff0c;你可以使用expected属性在Test注解中声明期望的异常类型。如&#xff1a; Test(expected Exception.class) public void testSqlSessionFactoryBeanWithNullDataSource() throws Exception {

5G双域快网

目录 一、业务场景 二、三类技术方案 2.1、专用DNN方案 2.2、ULCL方案&#xff1a;通用/专用DNNULCL分流 2.3、 多DNN方案-定制终端无感分流方案 漫游场景 一、业务场景 初期双域专网业务可划分为三类业务场景&#xff0c;学校、政务、文旅等行业均已提出公/专网融合访问需…

Spring MVC HandlerAdapter原理解析

在Spring MVC框架中&#xff0c;HandlerAdapter&#xff08;处理器适配器&#xff09;是一个非常重要的组件&#xff0c;它负责调用处理器&#xff08;Handler&#xff09;来处理客户端的请求。HandlerAdapter在请求处理流程中起到了桥梁的作用&#xff0c;连接了DispatcherSer…

【DDD】学习笔记-领域驱动设计对持久化的影响

资源库的实现 如何重用资源库的实现&#xff0c;以及如何隔离领域层与基础设施层的持久化实现机制&#xff0c;具体的实现还要取决于开发者对 ORM 框架的选择。Hibernate、MyBatis、jOOQ 或者 Spring Data JPA&#xff08;当然也包括基于 .NET 的 Entity Framework、NHibernat…

Acwing周赛记录

很难得参加一次周赛hhhhh这次参加的是第144场周赛&#xff0c;一共有三道题 AcWing 5473. 简单数对推理 给定两个整数数对&#xff0c;每个数对都包含两个 1∼9 之间的不同整数。 这两个数对恰好包含一个公共数&#xff0c;即恰好有一个整数同时包含于这两个数对。 给定这两…

选择排序,冒泡排序,插入排序,快速排序及其优化

目录 1 选择排序 1.1 原理 1.2 具体步骤 1.3 代码实现 1.4 优化 2 冒泡排序 2.1 原理 2.2 具体步骤 2.3 代码实现 2.4 优化 3 插入排序 3.1 原理 3.2 具体步骤 3.3 代码实现 3.4 优化 4. 快速排序 4.1 原理 4.2 具体步骤 4.3 代码实现 4.4 优化 为了讲…

linux动态库加载相关

linux下动态库搜索规则 (1)编译目标代码时指定的动态库搜索路径,也就是RPATH&#xff1b; (2)环境变量LD_LIBRARY_PATH指定的动态库搜索路径&#xff1b; (3)配置文件/etc/ld.so.conf中指定的动态库搜索路径&#xff1b;配置完毕后需运行ldconfig命令生效&#xff1b; (4)默…

Linux课程四课---Linux开发环境的使用(vim编辑器的相关)

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

【MySQL】内置函数 -- 详解

一、日期函数 日期&#xff1a;年月日时间&#xff1a;时分秒 1、获得年月日 2、获得时分秒 3、获得时间戳 4、在日期的基础上加日期 5、在日期的基础上减去时间 6、计算两个日期之间相差多少天 7、获得当前时间 ⚪练习 &#xff08;1&#xff09;记录生日 &#xff08;2&…

视频监控简史

安防系统中,视频监控始终是重头戏,是安防系统的核心。 目录 一、起步 二、模拟时代 三、数字时代 四、嵌入式存储 五、视频编码器 六、全数字化监控

Flask入门一(介绍、Flask安装、Flask运行方式及使用、虚拟环境、调试模式、配置文件、路由系统)

文章目录 一、Flask介绍二、Flask创建和运行1.安装2.快速使用3.Flask小知识4.flask的运行方式 三、Werkzeug介绍四、Jinja2介绍五、Click CLI 介绍六、Flask安装介绍watchdog使用python--dotenv使用&#xff08;操作环境变量&#xff09; 七、虚拟环境介绍Mac/linux创建虚拟环境…