我正在尝试平滑嘈杂的一维物理信号y
,同时保留信号幅度与其单位之间的对应关系。我正在应用高斯核,并根据其自身的积分对高斯本身进行标准化。
import numpy.random
import matplotlib.pyplot as plt
import numpy as np
from scipy.integrate import quad
#Gaussian kernel (not normalized here)
def gaussian(x, sigma):
return np.exp(-(x/sigma)**2/2)
#convolution
def smooth(y,box_pts):
x = (np.linspace(-box_pts/2.,box_pts/2.,box_pts + 1)) #Gaussian centred on 0
std_norm = 3. #3. is an arbitrary value for normalizing the sigma
sigma = box_pts/std_norm
integral = quad(gaussian, x[0], x[-1], args=(sigma))[0]
box = gaussian(x, sigma)/integral
y_smooth = np.convolve(y,box,mode='same')
return y_smooth
box_size = 10
length = 100
y = numpy.random.randn(length)
y_smooth = smooth(y,box_size)
plt.plot(y)
plt.show()
plt.plot(y_smooth)
plt.show()
在此示例中,y
是我要平滑的信号,box_pts
是高斯核在转换时应用的宽度或区域。为了规范我的卷积,我仅将高斯积分本身除以。由于高斯具有一定的宽度(由box_pts
给出),并且比y
的物理轴在此间隔之外为零,因此我将高斯归一化为非零的区域而不是$-\ infty $到$ \ infty $。这种方法看起来很简单,并且可以正常化,但是将内核卷积本身除以“正确”还是建议对卷积/内核进行标准化的方法呢?
基于一个简单的示例,它看起来保持积分大致相同,但是振幅不再如下面所示那样一致,这有点问题,因为我想在去除噪声的同时保持平滑信号:
原文:
平滑:
当我相对于box_size
减少length
时,幅度得到了改善,但这使信号噪声增大。降低std_norm
似乎也有助于降低噪声,但这会影响幅度。我的问题归结为决定如何为大小为std_norm
的给定噪声信号box_norm
选择最佳的y
和length
,以便在降低噪声的同时保持物理输出声音(即,平滑后的信号幅度在某种程度上与原始信号一致,并且平滑后的曲线下的积分也非常相似)。我在这里应用了高斯内核,但是希望对任何任意内核有一个通用的方法。