文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

python中savgol_filter的详细解释

2023-10-06 06:07

关注

目录

savgol_filter简介

Savitzky-Golay滤波器最初由Savitzky和Golay于1964年提出,是光谱预处理中常用滤波方法,它的核心思想是对一定长度窗口内的数据点进行k阶多项式拟合,从而得到拟合后的结果。对它进行离散化处理后后,S-G 滤波其实是一种移动窗口的加权平均算法,但是其加权系数不是简单的常数窗口,而是通过在滑动窗口内对给定高阶多项式的最小二乘拟合得出。这种滤波器最大的特点在于在滤除噪声的同时可以确保信号的形状、宽度不变。

它对信号的操作是在时域内对window_length内的数据进行多项式拟合。而从频域上看,这种拟合实际就是通过了低频数据,而滤掉了高频数据。

这种滤波其实是一种移动窗口的加权平均算法,但是其加权系数不是简单的常数窗口,而是通过在滑动窗口内对给定高阶多项式的最小二乘拟合得出。

总之,平滑滤波是光谱分析中常用的预处理方法之一。用Savitzky-Golay方法进行平滑滤波,可以提高光谱的平滑性,并降低噪音的干扰。S-G平滑滤波的效果,随着选取窗宽不同而不同,可以满足多种不同场合的需求。

savgol_filter原理

表达式为:
scipy.signal.savgol_filter(x, window_length, polyorder)

详细表达式和定义可以查看下面链接:
https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.savgol_filter.html

参数的含义:

x为要滤波的信号;

window_length即窗口长度;取值为奇数且不能超过len(x)。它越大,则平滑效果越明显;越小,则更贴近原始曲线。

polyorder为多项式拟合的阶数。它越小,则平滑效果越明显;越大,则更贴近原始曲线。

参数window_length对平滑的效果

import osimport matplotlib.pyplot as pltimport scipy.signalimport numpy as npdef main():    # 项目目录    dir = "D:\\a_user_file\\8_data"    filename = '1.csv'    path = os.path.join(dir, filename)    with open(path, "r") as fname:        data = fname.read()        lines = data.split("\n")        lines = lines[1:5000]        raw_data = []        for i in range(len(lines)):            line_i = lines[i].split(",")            raw_data.append(int(line_i[4]))    #sig = denoise(raw_data)    sig = raw_data    tmp_smooth1 = scipy.signal.savgol_filter(sig, 21, 3)    tmp_smooth2 = scipy.signal.savgol_filter(sig, 53, 3)    plt.subplot(3,1,1)    plt.plot(sig)    # plt.semilogx(sig, label='mic')    plt.subplot(3,1,2)    plt.plot(tmp_smooth1 * 0.5, label='mic'  + '拟合曲线-21', color='red')    plt.subplot(3,1,3)    plt.plot(tmp_smooth2 * 0.5, label='mic'  + '拟合曲线-53', color='green')    plt.show()main()

结果显示为:
在这里插入图片描述
可以看到,window_length的值越小,曲线越贴近真实曲线;window_length值越大,平滑效果越厉害。

参数polyorder的平滑效果

代码如下:

import osimport matplotlib.pyplot as pltimport scipy.signalimport numpy as npdef main():    # 项目目录    dir = "D:\\a_user_file\\8_data"    filename = '1.csv'    path = os.path.join(dir, filename)    with open(path, "r") as fname:        data = fname.read()        lines = data.split("\n")        lines = lines[1:5000]        raw_data = []        for i in range(len(lines)):            line_i = lines[i].split(",")            raw_data.append(int(line_i[4]))    #sig = denoise(raw_data)    sig = raw_data    tmp_smooth1 = scipy.signal.savgol_filter(sig, 53, 9)    tmp_smooth2 = scipy.signal.savgol_filter(sig, 53, 3)    plt.subplot(3,1,1)    plt.plot(sig)    # plt.semilogx(sig, label='mic')    plt.subplot(3,1,2)    plt.plot(tmp_smooth1 * 0.5, label='mic'  + '拟合曲线-21', color='red')    plt.subplot(3,1,3)    plt.plot(tmp_smooth2 * 0.5, label='mic'  + '拟合曲线-53', color='green')    plt.show()main()

显示的效果如下:
在这里插入图片描述
可以看出参数polyorder(多项式阶数)越大,曲线越贴近真实曲线;polyorder值越小,曲线平滑越厉害。

注:当polyorder值较大时,受窗口长度限制,拟合会出现问题,高频曲线会变成直线,

参考:
https://blog.csdn.net/sinat_21258931/article/details/79298478
https://blog.csdn.net/weixin_43821212/article/details/100016021
https://blog.csdn.net/kaever/article/details/105520941

来源地址:https://blog.csdn.net/ximu__l/article/details/129179388

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯