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时去噪效果已经很好,一般来说窗口值越大越平衡,缺点就是左右两端没有实现去噪。