Python开发之实现SG滤波

news2024/11/27 18:29:22

Python开发之实现SG滤波

  • 1 SG滤波
  • 2 借助Python中的scipy.signal库实现SG滤波
  • 3 手动代码实现SG滤波

前言:主要介绍SG滤波的Python实现,顺带介绍SG滤波的实现原理。


1 SG滤波

  • Savitzky-Golay滤波器(通常简称为S-G滤波器)最初由Savitzky和Golay于1964年提出,发表于Analytical Chemistry 杂志。之后被广泛地运用于数据流平滑除噪,是一种在时域内基于局域多项式最小二乘法拟合的滤波方法。这种滤波器最大的特点在于在滤除噪声的同时可以确保信号的形状、宽度不变。
  • 平滑滤波是光谱分析中常用的预处理方法之一。用 Savitzky. Golay 方法进行平滑滤波,可以提高光谱的平滑性,并降低噪音的干扰。S-G 平滑滤波的效果,随着选取窗宽不同而不同,可以满足不同场合的需求。
  • Savitzy-Golay 卷积平滑算法是移动平滑算法的改进。关键在于矩阵算子的求解。
    更多理论介绍请查看:
    《【UWB】Savitzky Golay filter SG滤波器原理讲解》
    《Savitzky-Golay 滤波器》
    《Savitzky-Golay平滑去噪》
    《SG平滑算法(又称多项式平滑算法)》
    《最小二乘法》

2 借助Python中的scipy.signal库实现SG滤波

from scipy.signal import savgol_filter
import matplotlib.pyplot as plt

def SG(data,window_size,polyorder):
    smoothed_data = savgol_filter(data, window_size, polyorder).tolist()
    return smoothed_data

if __name__ == '__main__':
    data = [0.3962, 0.4097, 0.2956, 0.4191, 0.3456, 0.3056, 0.6346, 0.7025, 0.6568, 0.4719, 0.5645, 0.6514, 0.5717,
            0.6072, 0.7076, 0.7062, 0.7086, 0.677, 0.8141, 0.7985, 0.7037, 0.7961, 0.6805, 0.5463, 0.2766]

    smoothed_data = SG(data,5,2)
    smoothed_data = [round(i, 4) for i in smoothed_data]#保留四位小数
    smoothed_data2 = SG(data,9,3)
    smoothed_data2 = [round(i, 4) for i in smoothed_data2]#保留四位小数
    print("data:", data)
    print("smoothed_data:", smoothed_data)
    print("smoothed_data2:", smoothed_data2)
    plt.plot(data, label='data')
    plt.plot(smoothed_data, label='smoothed_data')
    plt.plot(smoothed_data2, label='smoothed_data2')
    plt.xlabel('Time')
    plt.ylabel('Value')
    plt.title('Line Plot')
    plt.legend()
    plt.show()

在这里插入图片描述
data: [0.3962, 0.4097, 0.2956, 0.4191, 0.3456, 0.3056, 0.6346, 0.7025, 0.6568, 0.4719, 0.5645, 0.6514, 0.5717, 0.6072, 0.7076, 0.7062, 0.7086, 0.677, 0.8141, 0.7985, 0.7037, 0.7961, 0.6805, 0.5463, 0.2766]
smoothed_data: [0.4007, 0.3779, 0.3642, 0.3621, 0.3366, 0.3884, 0.5679, 0.7173, 0.6189, 0.5319, 0.554, 0.6135, 0.6002, 0.6172, 0.6843, 0.7185, 0.688, 0.7219, 0.7803, 0.782, 0.7604, 0.746, 0.7068, 0.5433, 0.2737]
smoothed_data2: [0.4295, 0.3527, 0.326, 0.3402, 0.3864, 0.4741, 0.5428, 0.5704, 0.6193, 0.6247, 0.5715, 0.5688, 0.6023, 0.6561, 0.6591, 0.6804, 0.7305, 0.7409, 0.7562, 0.7778, 0.7894, 0.7619, 0.6805, 0.5283, 0.2882]

-注意:window_size,polyorder两个参数决定着平滑的效果,要根据自己的数据,调整合适的参数,注意不要欠拟合和过拟合。

3 手动代码实现SG滤波

import matplotlib.pyplot as plt
import numpy as np

def SG01(data,window_size):
    # 前后各m个数据,共2m+1个数据,作为滑动窗口内滤波的值
    m = int((window_size - 1) / 2)  # (59-1)  /2 = 29
    # 计算 矩阵X 的值 ,就是将自变量x带进去的值算 0次方,1次方,2次方.....k-1次方,一共window_size行,k列
    # 大小为(2m+1,k)
    X_array = []
    for i in range(window_size):  #
        arr = []
        for j in range(3):
            X0 = np.power(-m + i, j)
            arr.append(X0)
        X_array.append(arr)
    X_array = np.mat(X_array)
    # B = X*(X.T*X)^-1*X.T
    B = X_array * (X_array.T * X_array).I * X_array.T
    data = np.insert(data, 0, [data[0] for i in range(m)])  # 首位插入m-1个data[0]
    data = np.append(data, [data[-1] for i in range(m)])  # 末尾插入m-1个data[-1]
    # 取B中的第m行 进行拟合  因为是对滑动窗口中的最中间那个值进行滤波,所以只要获取那个值对应的参数就行, 固定不变
    B_m = B[m]
    # 存储滤波值
    y_array = []
    # 对扩充的data 从第m个数据开始遍历一直到(data.shape[0] - m)  :(第m个数据就是原始data的第1个,(data.shape[0] - m)为原始数据的最后一个
    for n in range(m, data.shape[0] - m):
        y_true = data[n - m: n + m + 1]  # 取出真实y值的前后各m个,一共2m+1个就是滑动窗口的大小
        y_filter = np.dot(B_m, y_true)  # 根据公式 y_filter = B * X 算的  X就是y_true
        y_array.append(float(y_filter))  # float(y_filter) 从矩阵转为数值型
    return y_array

if __name__ == '__main__':
    data = [0.3962, 0.4097, 0.2956, 0.4191, 0.3456, 0.3056, 0.6346, 0.7025, 0.6568, 0.4719, 0.5645, 0.6514, 0.5717,
            0.6072, 0.7076, 0.7062, 0.7086, 0.677, 0.8141, 0.7985, 0.7037, 0.7961, 0.6805, 0.5463, 0.2766]
    smoothed_data = SG01(data,5)
    smoothed_data = [round(i, 4) for i in smoothed_data]
    smoothed_data2 = SG01(data,11)
    smoothed_data2 = [round(i, 4) for i in smoothed_data2]
    print("data:", data)
    print("smoothed_data:", smoothed_data)
    print("smoothed_data2:", smoothed_data2)
    plt.plot(data, label='data')
    plt.plot(smoothed_data, label='smoothed_data')
    plt.plot(smoothed_data2, label='smoothed_data2')
    plt.xlabel('Time')
    plt.ylabel('Value')
    plt.title('Line Plot')
    plt.legend()
    plt.show()

在这里插入图片描述
data: [0.3962, 0.4097, 0.2956, 0.4191, 0.3456, 0.3056, 0.6346, 0.7025, 0.6568, 0.4719, 0.5645, 0.6514, 0.5717, 0.6072, 0.7076, 0.7062, 0.7086, 0.677, 0.8141, 0.7985, 0.7037, 0.7961, 0.6805, 0.5463, 0.2766]
smoothed_data: [0.4095, 0.3663, 0.3642, 0.3621, 0.3366, 0.3884, 0.5679, 0.7173, 0.6189, 0.5319, 0.554, 0.6135, 0.6002, 0.6172, 0.6843, 0.7185, 0.688, 0.7219, 0.7803, 0.782, 0.7604, 0.746, 0.7068, 0.5015, 0.3344]
smoothed_data2: [0.3916, 0.3559, 0.3443, 0.368, 0.4265, 0.4713, 0.5107, 0.5667, 0.5903, 0.6093, 0.6122, 0.5879, 0.6034, 0.6261, 0.6685, 0.6965, 0.7121, 0.7497, 0.7714, 0.7859, 0.7623, 0.7017, 0.6148, 0.5048, 0.4128]

  • 注意:效果不佳,不推荐使用。

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

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

相关文章

一百一十六、Zeppelin——Zeppelin0.9.0连接ClickHouse21.9.5.16(亲测有效,附步骤截图)

版本:Zeppelin0.9.0 ClickHouse21.9.5.16 1.目标:Zeppelin连上clickhouse,可以把clickhouse中的数据做可视化展示 2.参考文件:如何基于zeppelin JDBC Interpreter进行jdbc数据源的可视化交互分析 http://t.csdn.cn/DGH…

数智融合 | 美格智能助力AIGC产业迈向新未来

5月11日,在2023 “高通&美格智能物联网技术开放日”深圳站活动上,美格智能副总经理金海斌以《数智引领 融合创新》为题分享了5GAIoT技术赋能的价值展望。 ▲美格智能副总经理 金海斌 ▌算力:数字经济时代的“石油” 今年,由C…

Spring Boot 拦截器

Spring Boot 拦截器介绍 Spring Boot 拦截器是 AOP 的一种实现,专门拦截对控制层的请求,主要应用于判断用户权限,拦截webSocket请求。SpringBoot中的拦截器实现和spring mvc 中是一样的,它的大致流程是,先自己定义一个…

软件测试注意面试官的常规“套路”

一、自我介绍 这里就不过多阐述了,相信很多小伙伴都有。 二、灵活问题 1、大概说说之前公司的测试流程。 2、测试报告有哪些内容? 3、如何保证用例的覆盖度? 4、什么是测试用例,什么是测试脚本?两者的关系? 5、Bug的级别,按照什么划…

使用Simulink中的MATLAB Function模块存在的bug

为什么simulink中的MATLAB Function 模块需要按Ctrl+C才能中断程序??? 否则就会像这样一直是正在运行!!需要按Ctrl+C才能中断循环!!神奇的是每次需要按Ctrl+C才可运行simulink程序?? 再次打开Simulink中MATLAB function模块会出现以下bug: function [qr, qr_a, qr…

【Android Jetpack】新一代导航管理——Navigation

前言 不知道小伙伴们是否注意到,用AS创建一个默认的新项目后,MainActivity已经有了很大的不同,最大的区别就是新增加了两个Fragment,同时我们注意到这两个Fragment之间跳转的时候并没有使用之前FragmentTransaction这种形式&…

Nginx基本使用以及部署前端项目

前言 最近学习了一下Nginx,整理了一个博客,主要参考的是狂神说的b站视频教程,文章链接如下:狂神说Nginx快速入门 一、下载、启动Nginx 1.下载Nginx 到Nginx官方选择自己电脑适用的稳定版本下载,我下载的的windows版…

Web Components

1、前期回顾 JavaScript沙箱 1.1、什么是沙箱 在计算机安全中,沙箱(Sandbox)是一种用于隔离正在运行程序的安全机制,通常用于执行未经测试或者不受信任的程序或代码,它会为待执行的程序创建一个独立的执行环境&#x…

图解LeetCode——206. 反转链表

一、题目 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 二、示例 2.1> 示例 1: 【输入】head [1,2,3,4,5] 【输出】[5,4,3,2,1] 2.2> 示例 2: 【输入】head [1,2] 【输出】[2,1] 2.3> 示例 3&#…

六级备考32天|CET-6|分数分布|题型分布|翻译·贴春联·CCTV·印章|16:30~17:47

目录 英语六级总分:710分 一、英语六级作文 二、听力部分 248.5分 三、阅读理解35% 248.5分 四、翻译部分 汉译英 15% 106.5分 五、做题技巧 写作和翻译需要重点强化练习! 六、积累 英语六级总分:710分 一、英语六级作文 说明&…

HTTP第13讲——HTTP的实体数据

数据类型与编码 在 TCP/IP 协议栈里,传输数据基本上都是“headerbody”的格式。但 TCP、UDP 因为是传输层的协议,它们不会关心 body 数据是什么,只要把数据发送到对方就算是完成了任务。 而 HTTP 协议则不同,它是应用层的协议&am…

pytorch实战11:基于pytorch简单实现DCGAN

基于pytorch简单实现DCGAN 前言 ​ 最近会把一些简单的CV领域的架构进行复现,完整的代码在最后。 本系列必须的基础 ​ python基础知识、CNN原理知识、pytorch基础知识 本系列的目的 ​ 一是帮助自己巩固知识点; ​ 二是自己实现一次,可以发…

ZED使用指南(五)Camera Controls

六、其他 1、相机控制 (1)选择视频模式 左右视频帧同步,以并排格式作为单个未压缩视频帧流式传输。 在ZED Explorer或者使用API可以改变视频的分辨率和帧率。 (2)选择输出视图 ZED能以不同的格式输出图像&#xf…

Android系统原理性问题分析 - Android Native程序的结构设计方式

Android核心原理 5.3 声明 在Android系统中经常会遇到一些系统原理性的问题,在此专栏中集中来讨论下。Android系统主要由Java和C/C两个世界构成,此篇分析处于Java世界和C/C世界的两个进程如何实现进程间通信的问题。此篇参考一些博客和书籍&#xff0c…

Go程序设计语言翻译问题(goroutine)

中文:Go程序设计语言 2017.1 英文:The Go Programming Language 2016 8.4.2. Pipelines 8.4.2管道章节 修正: 第一个管道应该改成通道,cannel是概念词汇 重要概念词汇不能混淆 来自chatGPT3.5: Go Pipelines和channel…

(kubernetes yaml文件|--dry-run导出yaml文件

kubernetes yaml文件|--dry-run导出yaml文件 YAML 语法格式:二 查看 api 资源版本标签三 写一个nignx.yaml文件demo四、编写service服务的资源清单详解k8s中的port五 用–dry-run命令生成yaml资源清单六 将现有的资源生成模板导出写yaml太累怎么办? YAML…

【Linux】1. Linux常见指令

专栏导读 🍁作者简介:余悸,在读本科生一枚,致力于 C方向学习。 🍁收录于 C 专栏,本专栏主要内容为 C 初阶、 C 进阶、 STL 详解等,持续更新中! 🍁相关专栏推荐&#xff1…

社会关系抽取赛题提交指南

社会关系抽取赛题提交指南 一、赛题背景 本次主要为大家介绍社会科学计算大赛的赛题之一---社会关系抽取。 1.技术发展 关系抽取(Relationship Extraction, RE)是信息抽取的一个重要任务,其目标是从文本中抽取实体之间的关系。RE技术发展历程主要有以下几个阶段:1. 规则与模…

初窥机器视觉与卷积神经网络

文章目录 1. 什么是卷积神经网络2. 卷积运算3. 池化层4. 卷积神经网络的整体架构 1. 什么是卷积神经网络 卷积神经网络(convolutional neural network,CNN)主要用于计算机视觉相关任务,但处理对象并不局限于图像,CNN在序列和语音等上的应用也…

2023年陕西省《网络建设与运维》技能大赛试题

项目简介: 某集团公司原在北京建立了总公司,后在成都建立了分公司,广东设立了办事处。集团设有产品、营销、法务、财务、人力5个部门,全网采用OSPF、RIP、ISIS、BGP路由协议进行互联互通。集团在北京建立两个数据中心,贵州建立异地灾备数据中心。 公司网络拓扑如图1所示,…