【问题标题】:A question about deconvolution of a signal using Python scipy关于使用 Python scipy 对信号进行反卷积的问题
【发布时间】:2021-01-31 02:34:26
【问题描述】:

我正在尝试学习一些信号处理,特别是使用 Python。这是我编写的示例代码。

import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import deconvolve

a = np.linspace(-1,1,50)
b = np.linspace(-1,1,50)**2
c = np.convolve(a,b,mode='same')
quotient,remainder = deconvolve(c,b);
plt.plot(a/max(a),"g")
plt.plot(b/max(b),"r")
plt.plot(c/max(c),"b")
plt.plot(remainder/max(remainder),"k")
#plt.plot(quotient/max(quotient),"k")

plt.legend(['a_original','b_original','convolution_a_b','deconvolution_a_b'])

在我的理解中,卷积数组的反卷积应该返回完全相同的数组“a”,因为我使用“b”作为过滤器。如下图所示,显然不是这种情况。

我不确定我对反卷积的数学理解是否错误,或者代码是否有问题。非常感谢任何帮助!

【问题讨论】:

    标签: python scipy signal-processing convolution deconvolution


    【解决方案1】:

    您正在使用mode='same',这似乎与 scipy deconvolve 不兼容。试试mode='full',应该会更好。

    这里是更正的代码:

    import numpy as np
    import matplotlib.pyplot as plt
    from scipy.signal import deconvolve
    
    a = np.linspace(-1,1,50)
    b = np.linspace(-1,1,50)**2
    c = np.convolve(a,b,mode='full')
    quotient,remainder = deconvolve(c,b)
    plt.plot(a,"g")
    plt.plot(b,"r")
    plt.plot(c,"b")
    plt.plot(quotient,"k")
    plt.xlim(0,50)
    plt.ylim(-6,2)
    
    plt.legend(['a_original','b_original','convolution_a_b','deconvolution_c_b'])
    
    

    【讨论】:

    • 您的代码非常适合这种情况。但是,我将收到并且必须使用的实际数据不会真正使用 mode='full'。任何想法为什么 mode ='same' 是一个问题?我真的对此感到困惑。
    • 本身并不是一个问题,只是 scipy deconvolve 函数不支持它 - 如果这对您来说是一个大问题,您应该推出自己的卷积/反卷积函数(没那么难,看看怎么做,我认为大多数实现都是基于快速傅里叶变换(FFT)的)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-26
    • 1970-01-01
    • 2013-06-08
    • 2019-05-03
    • 1970-01-01
    相关资源
    最近更新 更多