使用overlap-add方法计算两个信号的卷积示例
假设信号数组如下,使用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方法计算两个信号的卷积示例相关推荐
- 使用overlap-add方法计算两个信号的卷积示例(在频域计算卷积)
之前已经写过一篇使用overlap-add方法计算两个信号的卷积示例 本篇将卷积部分的计算从时域改为频域,基本操作步骤不变 示例代码如下: import numpy as npdef get_bloc ...
- 图算法(十四):关联预测算法(Link Prediction)【适用场景:用于社交网上的好友推荐、关系预测等】【给定两个节点,根据Jaccard度量方法计算两个节点的相似程度,预测他们之间的紧密关系】
一.概述 关联预测算法(Link Prediction)给定两个节点,根据Jaccard度量方法计算两个节点的相似程度,预测他们之间的紧密关系. 适用场景:关联预测算法(Link Prediction ...
- 信号与系统:利用Matlab实现两个信号的卷积
在泛函分析中,卷积.旋积或摺积(英语:Convolution)是通过两个函数f 和g 生成第三个函数的一种数学算子,表征函数f 与g经过翻转和平移的重叠部分函数值乘积对重叠长度的积分.卷积积分是一种特 ...
- 利用CASS使用三种方法计算两期土方
软件及数据准备:南方CASS9.1:开挖前后的坐标高程数据dat格式. 计算方法:方格网网法.三角网法.断面法. 首先,绘出计算的范围线,注意开挖前后范围线一般相同.为了方便后续的三种方法计算,先生成 ...
- 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)的意思是:幅值为 ...
- 快速得到两个集合的并集java_Java 程序计算两个集合的并集
Java 程序计算两个集合的并集 在此示例中,我们将学习计算Java中两个集合的并集. 要理解此示例,您应该了解以下Java编程主题: 示例1:使用addAll()计算两个集合的并集 示例import ...
- Java教程交集_Java 程序计算两个集合的交集
Java 程序计算两个集合的交集 在此示例中,我们将学习计算Java中两个集合的交集. 要理解此示例,您应该了解以下Java编程主题: 示例1:计算两个集合的交集 示例import java.util ...
- java 月份间隔_java计算两个日期之间相隔的月份(向下取整)
最近需求里面有个需要计算两个日期之间相隔的月份,写起来还挺繁琐,需要将各种情况都要考虑到,写了一个作为以后自己的工具吧. //获取哪一天 public static int getDay(Date d ...
- js计算两个时间戳之间的时间差(多少天、时、分、秒)
util.js 文件中 1.定义方法 //计算两个时间之间的时间差 多少天时分秒 function intervalTime(startTime,endTime) {// var timestamp= ...
最新文章
- FPGA之道(26)VHDL初始化
- C# VS2012操作word文档 (二).插入表格图片
- 三圆相交阴影部分面积_小学六年级图形面积的题很多家长都不会,一些初中生也未必会做...
- 高达82 fps的实时文本检测,华科AAAI2020提出可微分二值化模块
- 11.22Daily Scrum(2)
- (26)Verilog HDL循环语句:repeat
- jQuery 性能优化指南(2)
- Android 图片圆角的设置
- Python的学习必备基础知识总结
- java 整形数据类型_3.2Java基本数据类型之整型
- php导出excel列宽,PHP导出Excel 之 Spreadsheet_Excel_Writer
- 英雄联盟|王者|穿越火线 bgm AI配乐大赛分享
- Springboot---Model,ModelMap,ModelAndView
- 8行代码实现发微信撩妹(汉语哦)
- 2021年软考信息安全工程师下午真题(考生回忆版)
- TNMT新交通排行榜
- 基于DOA联合TDOA时间积累的二维GDOP仿真分析
- 联合办公格局已定?氪空间优客工场双雄争霸
- 你学会UI设计了吗?
- Android UI SVGA使用