概念
在音频信号处理中,卷积是很常见的信号处理方式,例如fir滤波器,卷积的计算公式也非常简单,对于输入信号 x ( t ) x(t) x(t)和系统 h ( t ) h(t) h(t),卷积的计算公式如下:
y ( t ) = ∑ m = 0 M x ( t − m ) h ( m ) y(t)=\sum_{m=0}^{M}x(t-m)h(m) y(t)=∑m=0Mx(t−m)h(m)
很明显这种方式需要我们完全知道输入信号 x ( t ) x(t) x(t)才能与 h ( t ) h(t) h(t)计算卷积,实际应用中我们不可能预先获得整个信号,全部输入完之后才开始计算,因为这会造成输出有很大的延时,实际应用中我们往往都是按帧进行音频信号处理,例如每10ms一帧进行处理,然后实时返回处理后的信号,这时候我们就需要根据音频每帧信号,进行分段卷积。
分段卷积根据方式不同,有重叠相加法和重叠保留法两种,下面分别介绍两种方法
重叠相加法
重叠相加法基本思想是将长序列 x ( t ) x(t) x(t)分为若干个子段 x k ( t ) x_k(t) xk(t),每个子段长为 L L L,然后每个子段 x k ( t ) x_k(t) xk(t)分别与长度为M的 h ( t ) h(t) h(t)进行卷积得到每段的卷积结果 y k ( t ) y_k(t) yk(t),每段卷积的结果长度为 L + M − 1 L+M-1 L+M−1,其中后 M − 1 M-1 M−1为重叠部分,将重叠的部分相加一起合并起来便得到结果 y k ( t ) y_k(t) yk(t),示意图如下:
为了看的更清楚,我们举一个最简单的例子:
我们定义 x k ( t ) = [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 ] x_k(t)=[0,1,2,3,4,5,6,7,8,9,10,11] xk(t)=[0,1,2,3,4,5,6,7,8,9,10,11]和 h ( t ) = [ 0 , 1 , 2 , 3 ] h(t)=[0,1,2,3] h(t)=[0,1,2,3]
使用python计算卷积:
import numpy
x = np.arange(12)
h = np.arange(4)
y = np.convolve(x,h)
输出如下:
x: [ 0 1 2 3 4 5 6 7 8 9 10 11]
h: [0 1 2 3]
y: [ 0 0 1 4 10 16 22 28 34 40 46 52 58 52 33]
我们将x分为3段,每段长为4:
x0 = x[0:4]
x1 = x[4:8]
x2 = x[8:12]
每段 x k ( t ) x_k(t) x