我正在尝试对音频样本进行一些(反)卷积。 我有一个样本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
有人知道我在这里做错了什么吗?
非常感谢, 奥马尔
最佳答案
deconvolve
返回两个数组:商和余数。所以尝试一下:
f, r = signal.deconvolve(s, s_f)
很长一段时间以来,deconvolve
都没有合适的文档字符串,但它在 github 上的 master 分支中有一个:https://github.com/scipy/scipy/blob/master/scipy/signal/signaltools.py#L731
文档字符串显示了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])
应用反卷积
:
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.])
当然,您不会总是得到这么好的结果。
关于python - 使用 scipy.signal 在 Python 中进行卷积和反卷积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17063775/