2

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

这是代码:

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

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

ValueError: in1 and in2 should have the same rank

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

非常感谢,奥马尔

4

2 回答 2

3

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

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

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

文档字符串显示了一个使用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.])

当然,你不会总是得到这么好的结果。

于 2013-06-12T13:09:46.123 回答
0

返回矩阵的rank(x)秩。换句话说,它包含的维度数。调用前请检查s和的秩是否相同。否则,您将收到您引用的异常。fsignal.convolve()

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

于 2013-06-12T11:39:03.340 回答