使用scipy.signal在Python中进行卷积和反卷积

时间:2013-06-12 10:59:29

标签: python scipy convolution

我正在尝试与音频样本进行一些(de)卷积。 我有一个样本 s 和相同的样本,并在其上添加了一些过滤器 s_f 。两个样本都表示为numpy数组。 我想对它们进行去卷积以获得代表隔离滤波器 f 的数组。一旦我这样做,我应该能够使用 s f 的卷积重现 s_f

以下是代码:

f = signal.deconvolve(s, s_f)
convolved = signal.convolve(s, f)

但是,我在第二行收到以下错误:

ValueError: in1 and in2 should have the same rank

有谁知道我在这里做错了什么?

非常感谢, 奥马尔

2 个答案:

答案 0 :(得分:3)

deconvolve返回两个数组,商和余数。所以试试:

f, r = signal.deconvolve(s, s_f)

很长一段时间,deconvolve没有正确的文档字符串,但它在github的主分支中有一个:https://github.com/scipy/scipy/blob/master/scipy/signal/signaltools.py#L731

docstring显示了使用deconvolve的示例。这是另一个(sigscipy.signalnpnumpy):

要解卷积的信号为z,滤波器系数为filter

In [9]: z
Out[9]: 
array([  0.5,   2.5,   6. ,   9.5,  11. ,  10. ,   9.5,  11.5,  10.5,
         5.5,   2.5,   1. ])

In [10]: filter = np.array([0.5, 1.0, 0.5])

申请deconvolve

In [11]: q, r = sig.deconvolve(z, filter)

In [12]: q
Out[12]: array([ 1.,  3.,  5.,  6.,  5.,  4.,  6.,  7.,  1.,  2.])

将过滤器应用到q以验证我们是否返回z

In [13]: sig.convolve(q, filter)
Out[13]: 
array([  0.5,   2.5,   6. ,   9.5,  11. ,  10. ,   9.5,  11.5,  10.5,
         5.5,   2.5,   1. ])

通过施工,这是一个非常干净的例子。余数为零:

In [14]: r
Out[14]: array([ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.])

当然,你不会总是得到如此好的结果。

答案 1 :(得分:0)

rank(x)返回矩阵的等级。换句话说,它包含的维数。在致电s之前,请检查fsignal.convolve()的排名是否相同。否则,您将收到引用的例外情况。

我不知道为什么反卷积可能会返回比给定输入更多维度的东西。这需要我没有时间深入调查。