我正在尝试与音频样本进行一些(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
有谁知道我在这里做错了什么?
非常感谢, 奥马尔
答案 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
的示例。这是另一个(sig
是scipy.signal
而np
是numpy
):
要解卷积的信号为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
之前,请检查f
和signal.convolve()
的排名是否相同。否则,您将收到引用的例外情况。
我不知道为什么反卷积可能会返回比给定输入更多维度的东西。这需要我没有时间深入调查。