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.应用

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)直接使用滤波器系数进行滤波

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

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滤波后的曲线重合。

3.实现

采用Eigen库,可容易实现:

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

2)卷积运算或FIR滤波

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/533420.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MT3020 任务分配

思路:利用二分找到某个时间是满足“k个人可以完成” ,并且时间最小。 因为尽量让后面的人做任务,所以从后往前排任务(倒着分配)。从后往前遍历任务,如果此人加上这个任务超出之前求得的时间,就…

Qt5中使用QPrinter和QprintDialog类

学习Qt过程中,做一个简单的编辑器,其中需要使用到打印文本功能,在使用Qt printer时遇到了几个麻烦。 一、在使用到QPrinter和QprintDialog类时的附加处理 ①若是在qt creator中,需要在 (.pro)工程文件中加…

inner join和left semi join的联系和区别

参考:添加链接描述 添加链接描述 1 简介 LEFT SEMI JOIN (左半连接)是 IN/EXISTS 子查询的一种更高效的实现。 示例 可以改写为 2 特点 1、left semi join 的限制是, JOIN 子句中右边的表只能在 ON 子句中设置过滤条件&…

Python学习从0开始——项目一day01爬虫

Python学习从0开始——项目一day01爬虫 一、导入代码二、使用的核心库三、功能测试3.1初始代码3.2新建文件3.3代码调试 四、页面元素解析4.1网页4.2修改代码4.3子页面4.4修改代码 一、导入代码 在Inscode新建一个python类型的项目,然后打开终端,粘贴以下…

[通俗易懂]《动手学强化学习》学习笔记2-第2、3、4章

文章目录 前言小总结(前文回顾)第二章 多臂老虎机2.2.2形式化描述 第三章 马尔可夫决策过程3.6 占用度量 代码3.6 占用度量 定理2 第四章 动态规划算法4.3.3 策略迭代算法 代码 总结 前言 参考: 《动手学强化学习》作者:张伟楠&a…

使用 Docker 部署 Open-Resume 在线简历平台

1)Open-Resume 介绍 GitHub: https://github.com/xitanggg/open-resume Open-Resume 是一款功能强大的开源 简历生成器 和 简历解析器 。可以帮助我们快速的生成个人简历,并定制化不同的主题和布局风格。该项目的目标是为每个人提供免费的现…

Harmony鸿蒙南向驱动开发-UART

UART指异步收发传输器(Universal Asynchronous Receiver/Transmitter),是通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输。 两个UART设备的连接示意图如下,UART与其他模块一般用2线&a…

算法打卡day42|动态规划篇10| Leetcode 121. 买卖股票的最佳时机、122.买卖股票的最佳时机II

算法题 Leetcode 121. 买卖股票的最佳时机 题目链接:121. 买卖股票的最佳时机 大佬视频讲解:121. 买卖股票的最佳时机视频讲解 个人思路 这道题之前贪心算法做过,当然动规也能解决这道题 解法 贪心法 取最左最小值,取最右最大值&#x…

CSS设置首字母大小写和首行样式

一、首字母大小写 1.代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Document</title&…

顺序表(增删减改)+通讯录项目(数据结构)

什么是顺序表 顺序表和数组的区别 顺序表本质就是数组 结构体初阶进阶 系统化的学习-CSDN博客 简单解释一下&#xff0c;就像大家去吃饭&#xff0c;然后左边是苍蝇馆子&#xff0c;右边是修饰过的苍蝇馆子&#xff0c;但是那个好看的苍蝇馆子一看&#xff0c;这不行啊&a…

校园论坛系统

文章目录 校园论坛系统一、项目演示二、项目介绍三、10000字论文参考四、系统部分功能截图五、部分代码展示六、底部获取项目和10000字论文参考&#xff08;9.9&#xffe5;&#xff09; 校园论坛系统 一、项目演示 校园论坛系统 二、项目介绍 基于springbootvue的前后端分离…

【JSON2WEB】 13 基于REST2SQL 和 Amis 的 SQL 查询分析器

【JSON2WEB】01 WEB管理信息系统架构设计 【JSON2WEB】02 JSON2WEB初步UI设计 【JSON2WEB】03 go的模板包html/template的使用 【JSON2WEB】04 amis低代码前端框架介绍 【JSON2WEB】05 前端开发三件套 HTML CSS JavaScript 速成 【JSON2WEB】06 JSON2WEB前端框架搭建 【J…

antd+Vue 3实现table行内upload文件图片上传【超详细图解】

目录 一、背景 二、效果图 三、代码 一、背景 一名被组长逼着干前端的苦逼后端&#xff0c;在一个晴天霹雳的日子&#xff0c;被要求前端订单产品实现上传产品图片并立刻回显图片。 二、效果图 三、代码 <template><a-table :dataSource"dataSource" :c…

前端三剑客 —— JavaScript (第七节)

内容回顾 DOM编程 document对象 有属性 有方法 节点类型 元素节点 属性节点 文本节点 操作DOM属性 DOM对象.属性名称 DOM对象[属性名称] 调用DOM对象的API 操作DOM样式 获取有单位的样式值 标签对象.style.样式名称&#xff0c;这种方式只能操作行内样式。 使用getComputedSty…

[Linux][进程概念][进程优先级]详细解读

目录&#xff09; 0.冯诺依曼体系结构1.操作系统(Operator System)1.概念2.设计OS的目的3.定位4.系统调用和库函数概念5.总结 2.进程1.基本概念2.描述进程 -- PCB3.task_struct内容分类4.组织进程5.查看进程6.通过系统调用获取进程标识符7.通过系统调用创建进程 -- fork初识8.进…

44---MSATA电路设计

视频链接 mSATA & mini-pcie电路设计01_哔哩哔哩_bilibili mSATA电路设计 1、mSATA简介 1.1、mSATA基本介绍 mSATA接口是标准SATA的迷你版本&#xff0c;通过mini PCI-E界面传输信号&#xff0c;传输速度支持1.5Gbps、3Gbps、6Gbps三种模式。mSATA接口的诞生&#xff…

数据可视化的3D问题

三维对象非常流行&#xff0c;但在大多数情况下会对解释图形的准确性和速度产生负面影响。 以下是对涉及 3d 的主要图形类型的回顾&#xff0c;并讨论了它们是否被认为是不好的做法。 1、3D 条形图&#xff1a;不要 这是一个 3d 条形图。 你可能很熟悉这种图形&#xff0c;因为…

自学嵌入式,已经会用stm32做各种小东西了,下一步是什么,研究stm32的内部吗?

是的&#xff0c;深入研究STM32的内部是一个很好的下一步。我这里有一套嵌入式入门教程&#xff0c;不仅包含了详细的视频讲解&#xff0c;项目实战。如果你渴望学习嵌入式&#xff0c;不妨点个关注&#xff0c;给个评论222&#xff0c;私信22&#xff0c;我在后台发给你。 了…

【Vue + keep-alive】路由缓存

一. 需求 列表页&#xff0c;n 条数据项可打开 n 个标签页&#xff0c;同时1条数据项的查看和编辑共用一个标签页。如下所示&#xff1a; 参考 // 主页面 // 解决因 路由缓存&#xff0c;导致 编辑后跳转到该页面 不能实时更新数据 onActivated(() > {getList() })二. 实现…

Java面试题戏剧

目录 第一幕 、第一场&#xff09;某大厦楼下大门前第二场&#xff09;电梯中第三场&#xff09;走廊中 第二幕、第一场&#xff09;公司前台第二场&#xff09;公司卫生间 第三幕、第一场&#xff09;一场异常面试 第四幕 、第一场&#xff09;大厦楼下门口第二场&#xff09;…