Savitzky-Golay滤波器基本原理

news2024/11/26 2:28:47

本文介绍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滤波器基本原理。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Web的农产品销售管理系统

1 课题简介 1.1 选题背景 自宇宙出现盘古开天依赖,万事万物就在不断的进步更新淘汰弱者,现在到了如今人们进入了互联网上帝世纪,越来越多的事物和工作都可以在网上用数据流代替和执行,不必再像以前一样亲自出面和出门做事&#…

文件上传 = 拖拽 + 多文件 + 文件夹

❝ 从前往后看都是努力,从后往前看都是命运 ❞ 大家好,我是「柒八九」。一个「专注于前端开发技术/Rust及AI应用知识分享」的Coder 前言 今天呢,和大家聊点耳熟能详的东西。「文件上传」。 讲到这里,大家不要嗤之以鼻,…

【必看】网络安全从业者书单推荐

推荐几本网络安全从业者必读的书籍 一、计算机基础 《网络硬件设备完全技术宝典》(第3版) 本书共768页,包括交换机、路由器、安全设备、网络设备等重要和常用的网络设备,图文并茂,语言流畅,内容及其丰富…

linux网络服务学习(6):多路径multipath解决iscsi多网卡识别错误问题

1.什么是多路径 1.1路径 物理层面一条数据的访问通道 访问方式: (1)以太网卡双绞网线以太网交换机 (2)HBA光纤卡光纤线光纤交换机 访问过程: (1)冗余链路failover&#xff1a…

java 23种设计模型讲解跟实例

java 23种设计模式讲解跟实例 什么是设计模式设计模式分类六大设计原则 创建型模式单例模式(singleton)工厂方法模式建造者模式抽象工厂模式原型模式 结构型模式适配器模式桥接模式组合模式装饰模式外观模式享元模式代理模式 行为型模式责任链模式命令模…

从零开始学Python(五)面向对象

🥳🥳Welcome Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于Python的相关操作吧 目录 🥳🥳Welcome Huihuis Code World ! !🥳🥳 一.类的定义 二.魔法方法 1.概念 2.常…

RabbitMQ-canal 监听本地数据库 -收不到消息解决方法

一、当我们配置好canal 的配置文件后 发现log 日志不报错,但是消息队列就是监听不到数据库的消息。 二、解决方法 在mysql 的ini 配置文件中加入下列代码 connect_timeout60 # 将默认值(如30秒)改为60秒 wait_timeout28800 # 将空闲连接超时…

安防视频监控/视频集中存储EasyCVR平台开启鉴权后设备列表不展示是为什么?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快,EasyCVR基于云边端一体化架构,具有强大的数据接入、处理及分发能力,可提供视频监控直播、云端录像、云存储、录像检索与回看、智能告警、平台级联、…

阿里同学聊测试开发与测试平台

在一线大厂,没有测试这个岗位,只有测开这个岗位,即使是做业务测试,那么你的title也是测开。 所以想聊一聊测开的看法,但不代表这是正确的看法,仅供参考。 没来阿里之前我对测开的看法 一直以为专职做自动…

京东重押AI,普通人如何把握AI短视频直播的机遇?

京东重押AI,普通人如何把握AI短视频直播的机遇? 现在普通人没有大厂那样,有雄厚资金财力支撑的,但是又想在AI赛道上把握机遇,那选择就相当重要了,要选择一个真正适合自己的AI项目。 餐赞是一家专注于生活服…

截图识别公式软件都有哪些?分享3个工具!

在学术、教育、科研等领域,公式是不可或缺的一部分。然而,有时我们可能会遇到需要将纸质或屏幕上的公式快速转换为电子文本的情况。这时,一款能够准确识别截图中公式的软件就显得尤为重要。本文将介绍几款可以截图识别公式的软件,…

【数据结构与算法】:快速排序和归并排序的非递归实现

1. 递归实现的缺陷 在以前的文章中我们把快速排序和归并排序的递归实现方式进行了介绍,但是在校招面试和在企业的日常开发过程中,仅掌握递归方法是不够的,因为递归也有它的缺陷。 我们知道在函数调用过程中会在内存中建立栈帧,栈…

【多线程】线程(线程的概念+线程的创建)

文章目录 线程一、线程的概念1.引入线程的目的2.什么叫线程(Thread)1.线程的特点:2.进程和线程的区别(面试题):3.Java的多线程编程 二、创建线程1.继承Thread重写run入口方法:使用jconsolesleep…

文件夹变应用?数据恢复大解密!

在日常使用电脑的过程中,许多用户可能都曾遭遇过这样一个奇怪的现象:原本用来存放文件的普通文件夹,突然变成了应用程序的图标。这种突如其来的变化不仅令人困惑,更可能导致重要数据的丢失或损坏。那么,究竟是什么原因…

最佳UI设计软件推荐:全球顶尖工具一览!

在这个信息化、数字化的时代,我们的生活、工作,甚至娱乐,都被各种各样的网站所包围。随着技术的发展,人们对网页UI设计的要求也越来越高。所以问题是,作为一个想要提高他们的UI设计能力的设计师,你应该如何…

渗透学习第一天:DR4G0N B4LL靶场复现

0x00 环境搭建 攻击机为kali Linux,IP为192.168.71.129 靶机IP地址目前不知道,但是是和kali同网段的 0x01 信息收集 由于不知道目标的IP地址,这里我采用了arp scan对本机的整个网段进行扫描 发现目标IP为192.168.71.130。对目标IP进行端…

高校人事管理系统业务分析

目标用户 大学人事部门,其他部门、院系、个人 解决问题 人事部门按业务划分了很多科室、数据分散、工作流程杂乱、工作效率低。 主要功能模块 人事综合管理平台、个人自助服务平台、人才招聘管理系统、薪酬管理子系统、职称评审子系统、绩效考核子系统组成。

【精选】发布应用到应用商店的基本介绍

摘要 本文旨在介绍如何在各大应用商店发布应用,包括市场选择、准备材料、上架步骤以及常见被拒原因及解决方法。通过详细的步骤和经验分享,帮助开发者顺利将应用推向市场。 引言 随着移动应用市场的不断发展,越来越多的开发者希望将他们的…

44-技术演进(下):软件架构和应用生命周期技术演进之路

应用、系统资源、应用生命周期管理这 3 个维度,构成了我们对云的所有诉求。 我会介绍下应用维度和应用生命周期管理维度的技术演进。 我们就先来看下软件架构的演进之路。 软件架构的演进 软件架构技术演进如下图所示: 单体架构 在单体架构中&#xff…

c++——sort()函数

一、代码和效果 #include<bits/stdc.h> using namespace std;int main() {int a[6]{1,45,2,5,456,7};sort(a,a6);for(int i0; i<6; i){cout<<a[i]<<" "<<endl;}return 0; } 二、sort函数解析 &#xff08;从小到大&#xff09; std::so…