假设信号数组如下,使用overlap-add方法计算线性卷积

a = [1, 3, -1, 2, 5, 3, -2, -4, -2, 1]
h = [1, 2, -1]

step1: 分组

根据h长度划分a
h长度为3,每3个一分,将a分为4组,如下:

[
[1, 3, -1],
[2, 5, 3],
[-2, -4, -2],
[1,0,0]
]

最后一个数组不够补零处理。

step2: 补零

h的长度为3,M=3
a被划分的长度为3, L=3
所以每个block补零后的长度应该为
N = L + M − 1 N=L+M-1 N=L+M−1
N = 5

补零后

[
[1, 3, -1, 0, 0],    # block 0
[2, 5, 3, 0, 0],     # block 1
[-2, -4, -2, 0, 0],  # block 2
[1,0,0, 0, 0]        # block 3
]

step 3: 计算线性卷积

这里有个tricky小技巧,将h转换为用于计算卷积的矩阵:

将h补零到长度5, 即 [1, 2, -1, 0, 0],然后每次向右移动一位。

[
[1, 2, -1, 0, 0],
[0, 1, 2, -1, 0],
[ 0, 0, 1, 2, -1],
[-1, 0,0,1, 2],
[2,-1, 0,0,1]
]

转置一下,得到用于计算卷积的矩阵h_matrix

[
[  1  0  0  -1  2]
[  2  1  0  0  -1]
[ -1  2  1  0  0]
[ 0  -1  2  1  0]
[ 0  0  -1  2  1]
]

然后用次矩阵每次乘block
所以

y[0] =  h_matrix * block 0 = [ 1, 5, 4, -5, 1]
y[1] =  h_matrix * block 1 = [ 2, 9, 11, 1, -3]
y[2] =  h_matrix * block 2 = [ -2, -8, -8, 0, 2]
y[3] =  h_matrix * block 3 = [ 1, 2, -1, 0, 0]

step 4: Overlap-add计算

M-1部分做overlap-add计算

1, 5, 4, -5, 12, 9, 11, 1, -3-2, -8, -8, 0, 21, 2, -1, 0, 0
--------------------------------------------------------
1, 5, 4, -3, 10, 11,-1,-11,-8, 1, 4, -1, 0, 0

计算的结果长度 = 10(a的长度)+ 2 (M-1) =12

示例代码如下

import numpy as npdef get_blocks(signal, block_length):a_length = len(signal)padding_length = block_length - 1segments = -(-a_length // block_length)result = np.zeros((segments, block_length + padding_length))for i in range(segments):b = signal[i * block_length: (i + 1) * block_length]p = block_length + padding_length - len(b)b = np.pad(b, (0, p), 'constant', constant_values=(0, 0))result[i] = breturn resultdef generate_convolve_matrix(h, length):m = np.zeros((length, length))if len(h) < length:h = np.pad(h, (0, length - len(h)), 'constant', constant_values=(0, 0))for i in range(length):m[i] = hh = np.roll(h, 1)m = np.transpose(m)return mdef convolve_blocks(blocks, h_matrix):result = np.zeros((blocks.shape[0], blocks.shape[1]))for i in range(blocks.shape[0]):result[i] = np.dot(h_matrix, blocks[i])return resultdef convolve_overlap_add(a, h):a_length = len(a)h_length = len(h)o_length = h_length-1blocks = get_blocks(a, h_length)length = blocks.shape[1]hm = generate_convolve_matrix(h, length)cb = convolve_blocks(blocks, hm)result = np.zeros(length * length)read_offset = 0overlap_add = np.zeros(length)for i in range(cb.shape[0]):if i == 0:result[0:length] = cb[i]read_offset = h_lengthelse:result[read_offset:read_offset + length] = overlap_add + cb[i]read_offset = read_offset + h_lengthoverlap_add = cb[i][h_length:]overlap_add = np.pad(overlap_add, (0, length - len(overlap_add)), 'constant', constant_values=(0, 0))return result[:a_length+o_length]a = np.asarray([1, 3, -1, 2, 5, 3, -2, -4, -2, 1])
h = np.asarray([1, 2, -1])c1 = convolve_overlap_add(a, h)
print('convolve_overlap_add:',c1)c2 = np.convolve(a, h)
print('np.convolve:', c2)

使用overlap-add方法计算两个信号的卷积示例相关推荐

  1. 使用overlap-add方法计算两个信号的卷积示例(在频域计算卷积)

    之前已经写过一篇使用overlap-add方法计算两个信号的卷积示例 本篇将卷积部分的计算从时域改为频域,基本操作步骤不变 示例代码如下: import numpy as npdef get_bloc ...

  2. 图算法(十四):关联预测算法(Link Prediction)【适用场景:用于社交网上的好友推荐、关系预测等】【给定两个节点,根据Jaccard度量方法计算两个节点的相似程度,预测他们之间的紧密关系】

    一.概述 关联预测算法(Link Prediction)给定两个节点,根据Jaccard度量方法计算两个节点的相似程度,预测他们之间的紧密关系. 适用场景:关联预测算法(Link Prediction ...

  3. 信号与系统:利用Matlab实现两个信号的卷积

    在泛函分析中,卷积.旋积或摺积(英语:Convolution)是通过两个函数f 和g 生成第三个函数的一种数学算子,表征函数f 与g经过翻转和平移的重叠部分函数值乘积对重叠长度的积分.卷积积分是一种特 ...

  4. 利用CASS使用三种方法计算两期土方

    软件及数据准备:南方CASS9.1:开挖前后的坐标高程数据dat格式. 计算方法:方格网网法.三角网法.断面法. 首先,绘出计算的范围线,注意开挖前后范围线一般相同.为了方便后续的三种方法计算,先生成 ...

  5. matlab 计算两个函数的卷积

    t11=0; t12=1; t21=0; t22=2; t1=t11:0.001:t12; ft1=2*rectpuls(t1-0.5, 1);%rectpuls(t1-0.5, 1)的意思是:幅值为 ...

  6. 快速得到两个集合的并集java_Java 程序计算两个集合的并集

    Java 程序计算两个集合的并集 在此示例中,我们将学习计算Java中两个集合的并集. 要理解此示例,您应该了解以下Java编程主题: 示例1:使用addAll()计算两个集合的并集 示例import ...

  7. Java教程交集_Java 程序计算两个集合的交集

    Java 程序计算两个集合的交集 在此示例中,我们将学习计算Java中两个集合的交集. 要理解此示例,您应该了解以下Java编程主题: 示例1:计算两个集合的交集 示例import java.util ...

  8. java 月份间隔_java计算两个日期之间相隔的月份(向下取整)

    最近需求里面有个需要计算两个日期之间相隔的月份,写起来还挺繁琐,需要将各种情况都要考虑到,写了一个作为以后自己的工具吧. //获取哪一天 public static int getDay(Date d ...

  9. js计算两个时间戳之间的时间差(多少天、时、分、秒)

    util.js 文件中 1.定义方法 //计算两个时间之间的时间差 多少天时分秒 function intervalTime(startTime,endTime) {// var timestamp= ...

最新文章

  1. FPGA之道(26)VHDL初始化
  2. C# VS2012操作word文档 (二).插入表格图片
  3. 三圆相交阴影部分面积_小学六年级图形面积的题很多家长都不会,一些初中生也未必会做...
  4. 高达82 fps的实时文本检测,华科AAAI2020提出可微分二值化模块
  5. 11.22Daily Scrum(2)
  6. (26)Verilog HDL循环语句:repeat
  7. jQuery 性能优化指南(2)
  8. Android 图片圆角的设置
  9. Python的学习必备基础知识总结
  10. java 整形数据类型_3.2Java基本数据类型之整型
  11. php导出excel列宽,PHP导出Excel 之 Spreadsheet_Excel_Writer
  12. 英雄联盟|王者|穿越火线 bgm AI配乐大赛分享
  13. Springboot---Model,ModelMap,ModelAndView
  14. 8行代码实现发微信撩妹(汉语哦)
  15. 2021年软考信息安全工程师下午真题(考生回忆版)
  16. TNMT新交通排行榜
  17. 基于DOA联合TDOA时间积累的二维GDOP仿真分析
  18. 联合办公格局已定?氪空间优客工场双雄争霸
  19. 你学会UI设计了吗?
  20. Android UI SVGA使用

热门文章

  1. 科学道德与学风-2021雨课堂答案-第6章
  2. 量子计算机中信息的基本单位,重磅!成功将“人造原子”量子位,稳定的用在量子计算机上!...
  3. 给网页的按钮添加快捷键
  4. python求二叉树高度_求二叉树高度代码报错,求大佬解答
  5. 1.2计算机系统层次结构
  6. 找不到合适的PPT模板?推荐三款模板素材库给你
  7. Spark Streaming通过Socket检测空气质量
  8. 论文笔记之Unipose
  9. 线性代数【7】 向量和线性相关性
  10. mysql sql查询超时排查