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