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

标签 python scipy convolution

我正在尝试对音频样本进行一些(反)卷积。 我有一个样本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

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

非常感谢, 奥马尔

最佳答案

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])

应用反卷积:

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/

相关文章:

python - 如何按正确的列位置重新排序字段?

python - 从按钮将数据输入到 Entry 小部件

python - Django 多对一关系过滤器集

python - 在 Jupyter 笔记本上禁用下载

deep-learning - mask r-cnn的AP、AP50、AP70是什么意思?

python - 使用 Python 将指数修正高斯曲线拟合到数据

python - 如何在集群上启用 MPI 的应用程序中使用 scipy.weave.inline?

python - 如何根据自定义概率密度函数(Python)生成随机数?

python - opencv 中使用 4D 内核进行图像卷积

neural-network - 在pytorch中执行卷积(不互相关)