Savitzky-Golay卷积平衡算法原理,以及MATLAB的实现

Savitzky-Golay卷积平衡算法是移动平滑算法的改进,又称为移动窗口最小二乘多项式平滑,最初是由Savitzky和Golay在1964年提出,被广泛应用于数据流平滑去噪,最大特点是在滤波的同时可以确保信号的形状,宽度不变。
使用平滑滤波器对信号滤波时,实际上拟合了信号中的低频成分,而将高频成分平滑出去,如果噪声在高频段,那么滤波的结果就是去除了噪声,如果噪声在低频段,那么滤波的结果就是留下了噪声,是一种低通滤波器。SG平滑滤波的效果随着选取窗口的不同而不同。
拉曼光谱的原理
在这里插入图片描述
原理中的关键是利用最小二乘求出常数项系数C,他的求解方式可以看博客介绍最小二乘法和惩罚最小二乘法原理,在这篇博客中我另B=(XT * X)-1 *XT。B为滤波系数矩阵,由且仅由X矩阵决定,根据系数矩阵即可获得S-G平滑拟合方程。
系数矩阵B的MATLAB实现代码为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function [ filter_matrix ] = S_Gtest(  n,k )
%S-G 平滑一般方法-n点k-1次平滑
%Input: -n,滤波带宽,即原始数据点个数,一般要求为奇数
%       -k,拟合多项式最高次幂+1
%Output:-S-G滤波系数矩阵
m=(n-1)/2;
X=[];
for i=0:(n-1)
    for j=0:(k-1)
        X(i+1,j+1)=power(i-m,j);
    end
end
filter_matrix=X*inv(X'*X)*X';
end

然后再主函数中调用,测试数据可以从这里下载,我提供的测试数据数2048个。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
y11=S_Gtest(21,4);
y12=zeros(1,2048);
for j=0:2027
   temp_X= y10(1+j:21+j)';
   hgg=(y11*temp_X);
   hgd=hgg(11);
   y12(1,11+j)=hgd-20;
end
ysg = sgolayfilt(y10,5,7)-10;
figure
plot(y10)
hold on
plot(ysg,'k')
plot(y12,'b');
legend('污染信号','原始信号','MATLAB提供sgolayfilt','s-g21*4平衡滤波')

通过窗口的不断向前平滑,实现对整个波形噪声的去除,得出如下的图形,为了方便观察我把数据上下平移,在这里插入图片描述
MATLAB实现的效果图
在这里插入图片描述
从图中可以看出窗口在21时去噪效果已经很好,一般来说窗口值越大越平衡,缺点就是左右两端没有实现去噪。