Savitzky-Golay滤波器基本原理

本文介绍Savitzky-Golay滤波器基本原理。

Savitzky-Golay滤波器(简称为S-G滤波器)被广泛地运用于数据平滑去噪,它是一种在时域内基于局域多项式最小二乘法拟合的滤波方法。这种滤波器最大的特点在于在滤除噪声的同时确保信号的形状,宽度不变。S-G滤波器滤波的效果和选取窗口宽度,多项式阶次有关。基于这种滤波器的特点,它在光谱分析(平滑滤波)中经常使用。

1.基本原理

S-G滤波器本质上属于FIR滤波器,我们知道设计FIR滤波器关键在于求得滤波器系数。对于S-G滤波器其系数即为多项式前的常系数,下面对其作简单推导。

设滤波器窗口宽度为L=2k+1,即以中心点s前后k个数据作为滤波器的窗口,多项式阶次为n。

\begin{bmatrix} x_{s-k} \\ \vdots \\ x_{s-1} \\ x_{s} \\x_{s+1} \\ \vdots \\x_{s+k} \end{bmatrix}= \begin{bmatrix} b_{0}+b_{1}(t_{s}-k\Delta t)+b_{2}(t_{s}-k\Delta t)^{2}+\cdots+b_{n}(t_{s}-k\Delta t)^{n} \\ \vdots \\ b_{0}+b_{1}(t_{s}-1\Delta t)+b_{2}(t_{s}-1\Delta t)^{2}+\cdots+b_{n}(t_{s}-1\Delta t)^{n} \\ b_{0}+b_{1}(t_{s}-0\Delta t)+b_{2}(t_{s}-0\Delta t)^{2}+\cdots +b_{n}(t_{s}-0\Delta t)^{n} \\ b_{0}+b_{1}(t_{s}+1\Delta t)+b_{2}(t_{s}+1\Delta t)^{2}+\cdots +b_{n}(t_{s}+1\Delta t)^{n} \\ \vdots \\ b_{0}+b_{1}(t_{s}+k\Delta t)+b_{2}(t_{s}+k\Delta t)^{2}+\cdots+b_{n}(t_{s}+k\Delta t)^{n} \end{bmatrix} = \begin{bmatrix} a_{0}+a_{1}(-k)+a_{2}(-k)^{2}+\cdots+a_{n}(-k)^{n} \\ \vdots \\a_{0}+a_{1}(-1)+a_{2}(-1)^{2}+\cdots+a_{n}(-1)^{n} \\ a_{0}+a_{1}(0)+a_{2}(0)^{2}+\cdots+a_{n}(0)^{n} \\ a_{0}+a_{1}(1)+a_{2}(1)^{2}+\cdots+a_{n}(1)^{n} \\ \vdots \\ a_{0}+a_{1}(k)+a_{2}(k)^{2}+\cdots+a_{n}(k)^{n} \end{bmatrix}

进而,

x=\begin{bmatrix} 1 & -k & (-k)^{2} & \cdots & (-k)^{n}\\ 1 & \vdots & \vdots & \ddots & \vdots \\ 1 & -2 & (-2)^{2} & \cdots & (-2)^{n}\\ 1 & -1 & (-1)^{2} & \cdots & (-1)^{n}\\ 1 & 0 & 0 & 0 & 0 \\ 1 & 1 & (1)^{2} & \cdots & (1)^{n}\\ 1 & 2 & (2)^{2} & \cdots & (2)^{n}\\ 1 & \vdots & \vdots & \ddots & \vdots \\ 1 & k & (k)^{2} & \cdots & (k)^{n} \end{bmatrix}\begin{bmatrix} a_{0} \\ \vdots \\ a_{n} \end{bmatrix}= Ha

H为范德蒙矩阵,经推导x的预测值

\hat{x}=H(H^{T}H)^{-1}H^{T}x=Bx

其中

1)B为与输入x无关的矩阵,也就是S-G滤波器系数

2)矩阵的行数由窗口宽度L决定,为L行

3)矩阵的列数由多项式阶次n决定,为n+1列

2.适用范围

S-G平滑滤波器通常用于“平滑”频率跨度(无噪声)较大的含噪信号。它们也被称为数字平滑多项式滤波器或最小二乘平滑滤波器。在某些应用中,S-G滤波器的性能优于标准平均值 FIR 滤波器,后者往往会将高频成分随噪声一起滤除。S-G滤波器在保留高频信号分量方面更为有效,但在抑制噪声方面不太成功

S-G滤波器在对含噪数据帧进行多项式拟合时能够最小化最小二乘误差,从这个意义上而言,它们是最优的滤波器。

3.应用

1)滤波器系数求解

这里以窗口宽度为11,阶次为4为例。

在matlab中命令行输入:

order=4;
framelen=11;
v=-5:1:5;
A = fliplr(vander(v));
A=A(1:framelen,1:order+1);
B=A*inv(A'*A)*A';

在matlab中有专门设计S-G滤波器的命令,这里我们对比一下2个值,在命令行输入:

order=4;
framelen=11;
b = sgolay(order,framelen);

经过比较,这2个值是相等的。

注意:

a)矩阵B或b中间行向量(第6行)即为S-G滤波器的滤波器系数

b)矩阵B或b其他行在处理信号边缘(最左侧及最右侧)有用

2)信号边缘的采样值处理

a)采用sgolayfilt对信号进行处理

sgolayfilt是matlab内置的对输入信号进行S-G滤波的命令,这里以此为参考,对比信号边缘是否处理的差异。

order = 4;
framelen = 11;

lx = 36;
x = randn(lx,1);

sgf = sgolayfilt(x,order,framelen);

plot(x,':')
hold on
plot(sgf,'.-')
legend('signal','sgolay')

输出结果:

b)直接使用滤波器系数进行滤波

这里使输入信号和滤波器系数卷积(FIR)进行滤波。

m = (framelen-1)/2;

B = sgolay(order,framelen);

steady = conv(x,B(m+1,:),'same');

plot(steady)
legend('signal','sgolay','steady')

输出结果:

可见,直接使用滤波器系数进行滤波,在信号边缘滤波效果并不好,和matlab内置的滤波器命令也有差异。

c)对信号边缘进行处理

靠近信号边缘的采样无法放在对称窗的中心,必须区别对待

为了确定启动瞬变,对 B 的前 (framelen-1)/2 行与信号的前 framelen 个采样执行矩阵乘法。

ybeg = B(1:m,:)*x(1:framelen);

为了确定终止瞬变,对 B 的最后 (framelen-1)/2 行与信号的最后 framelen 个采样执行矩阵乘法。

yend = B(framelen-m+1:framelen,:)*x(lx-framelen+1:lx);

将瞬变部分与稳态部分连接起来以生成完整信号。

cmplt = steady;
cmplt(1:m) = ybeg;
cmplt(lx-m+1:lx) = yend;

plot(cmplt)
legend('signal','sgolay','steady','complete')
hold off

输出结果:

可见,经过信号边缘进行处理后,和sgolayfilt滤波后的曲线重合。

4.实现

采用Eigen库,可容易实现:

1)范德蒙矩阵生成及相关矩阵运算(主要求B)

2)卷积运算或FIR滤波

也可以使用matlab或其他工具生成滤波器系数,再使用FIR滤波器进行滤波器(注意信号边缘的处理)。这里就不做过多介绍。

本文介绍了Savitzky-Golay滤波器基本原理。

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值