我需要使用高斯执行卷积,但是高斯的宽度需要改变。我不进行传统的信号处理,而是需要根据设备的分辨率获取完美的概率密度函数 (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 的高斯分布。现在假设我的决心实际上varysover 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)
但这不起作用,因为范数函数需要宽度值,而不是函数。从某种意义上说,我需要我的卷积函数是一个 2D 数组,其中我对原始 PDF 中的每个点都有不同的涂抹高斯,它仍然是一个 1D 数组。
那么有没有办法用函数来做到这一点alreadyPython 中定义的?我自己编写了一些代码来执行此操作......但我想确保我不仅仅是重新发明了轮子。
提前致谢!
Matt