Python中使用scipy.sign的卷积和反卷积

2024-09-21 03:25:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试着用音频样本做一些卷积。 我有一个样本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

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

非常感谢, 奥马尔


Tags: 代码numpy过滤器signal错误数组音频卷积
2条回答

rank(x)返回矩阵的秩。换句话说,它包含的维数。在调用s之前,请检查fs的列组是否相同。否则你将收到一个例外,你报价。

我不知道反褶积为什么会返回比给定输入更多维数的数据。这需要更深入的调查,我没有时间。

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

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

很长一段时间以来,deconvolve没有一个正确的docstring,但是它在github的master分支中有一个:https://github.com/scipy/scipy/blob/master/scipy/signal/signaltools.py#L731

docstring显示了使用deconvolve的示例。还有一个(sigscipy.signal,而npnumpy):

要去卷积的信号是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.])

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

相关问题 更多 >

    热门问题