如何使用可变宽度高斯在python中执行卷积?

时间:2013-09-04 21:21:01

标签: python signal-processing resolution convolution probability-density

我需要使用高斯执行卷积,但高斯的宽度需要改变。我不是在进行传统的信号处理,而是根据设备的分辨率,我需要采用完美的概率密度函数(PDF)和“涂抹”它。

例如,假设我的PDF作为尖峰/增量函数开始。我将其建模为非常窄的高斯。在通过我的设备运行后,它将根据一些高斯分辨率被涂抹掉。我可以使用scipy.signal卷积函数来计算它。

    import numpy as np
    import matplotlib.pylab as plt

    import scipy.signal as signal
    import scipy.stats as stats

    # Create the initial function. I model a spike
    # as an arbitrarily narrow Gaussian
    mu = 1.0 # Centroid
    sig=0.001 # Width
    original_pdf = stats.norm(mu,sig)

    x = np.linspace(0.0,2.0,1000) 
    y = original_pdf.pdf(x)
    plt.plot(x,y,label='original')


    # Create the ``smearing" function to convolve with the
    # original function.
    # I use a Gaussian, centered at 0.0 (no bias) and
    # width of 0.5
    mu_conv = 0.0 # Centroid
    sigma_conv = 0.5 # Width
    convolving_term = stats.norm(mu_conv,sigma_conv)

    xconv = np.linspace(-5,5,1000)
    yconv = convolving_term.pdf(xconv)

    convolved_pdf = signal.convolve(y/y.sum(),yconv,mode='same')

    plt.plot(x,convolved_pdf,label='convolved')
    plt.ylim(0,1.2*max(convolved_pdf))
    plt.legend()
    plt.show()

这一切都没问题。但现在假设我的原始PDF不是尖峰,而是一些更广泛的功能。例如,具有sigma = 1.0的高斯。现在假设我的分辨率实际上 varys 超过x:在x = 0.5时,拖尾函数是高斯函数,sigma_conv = 0.5,但在x = 1.5时,拖尾函数是高斯函数,sigma_conv = 1.5。并且假设我知道我的涂抹高斯的x依赖的函数形式。天真地,我以为我会将上面的行更改为

    convolving_term = stats.norm(mu_conv,lambda x: 0.2*x + 0.1)

但这不起作用,因为norm函数需要宽度值,而不是函数。在某种意义上,我需要我的卷积函数是一个二维数组,我的原始PDF中的每个点都有一个不同的模糊高斯,它仍然是一维数组。

有没有办法在Python中定义函数已经?我有一些代码可以做到这一点,我自己写了....但我想确保我不仅仅重新发明了轮子。

提前致谢!

马特

1 个答案:

答案 0 :(得分:6)

问题,简而言之:
如何与非静态内核进行卷积,例如,为数据中的不同位置改变宽度的高斯,并为Python做一个现有的工具?

答案,排序:
很难证明是否定的,但我认为用非平稳内核执行卷积的函数不存在于scipy或numpy中。无论如何,正如你所描述的那样,它可以很好地进行矢量化,所以你也可以做一个循环或编写一些自定义的C代码。

可能对你有用的一个技巧是,不是用位置改变内核大小,而是用反比例拉伸数据(即,在你想要高斯的地方)将基数宽度设为0.5,将数据拉伸到2x)。这样,您可以对数据执行单个变形操作,使用固定宽度Gaussian的标准卷积,然后将数据解压缩到原始比例。

这种方法的优点是它易于编写,并且完全被矢量化,因此运行起来可能相当快。

变形数据(例如使用插值方法)会导致精度损失,但如果选择的东西使得数据总是在初始变形操作中扩展而不是减少,那么损失应该是最小的。 / p>