使用内核进行规范化的平滑处理

时间:2018-07-25 17:59:52

标签: python numpy kernel convolution smoothing

我正在尝试平滑嘈杂的一维物理信号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 $。这种方法看起来很简单,并且可以正常化,但是将内核卷积本身除以“正确”还是建议对卷积/内核进行标准化的方法呢?

基于一个简单的示例,它看起来保持积分大致相同,但是振幅不再如下面所示那样一致,这有点问题,因为我想在去除噪声的同时保持平滑信号:

原文:

Raw data

平滑:

Smoothed data

当我相对于box_size减少length时,幅度得到了改善,但这使信号噪声增大。降低std_norm似乎也有助于降低噪声,但这会影响幅度。我的问题归结为决定如何为大小为std_norm的给定噪声信号box_norm选择最佳的ylength,以便在降低噪声的同时保持物理输出声音(即,平滑后的信号幅度在某种程度上与原始信号一致,并且平滑后的曲线下的积分也非常相似)。我在这里应用了高斯内核,但是希望对任何任意内核有一个通用的方法。

0 个答案:

没有答案