python 数据、曲线平滑处理——Savitzky-Golay 滤波器——详解

文章介绍了Savitzky-Golay滤波器用于曲线平滑处理的方法,通过Python的scipy库调用savgol_filter函数,探讨了窗口长度和多项式阶数对平滑效果的影响,并提供了一个示例来展示其平滑曲线的功能。此外,还提到了插值法和基于Numpy.convolve的滑动平均滤波作为其他平滑处理选项。
摘要由CSDN通过智能技术生成

1 Savitzky-Golay 滤波器实现曲线平滑

1.1 问题描述

在寻找曲线的波峰、波谷时,由于数据帧数多的原因,导致生成的曲线图噪声很大,不易寻找规律。如下图:
在这里插入图片描述

由于高频某些点的波动导致高频曲线非常难看,为了降低噪声干扰,需要对曲线做平滑处理,让曲线过渡更平滑。常见的对曲线进行平滑处理的方法包括: Savitzky-Golay 滤波器、插值法等。

1.2 Savitzky-Golay 滤波器–调用讲解

对曲线进行平滑处理,通过Savitzky-Golay 滤波器,可以在scipy库里直接调用,不需要再定义函数。

python中Savitzky-Golay滤波器调用如下:

y_smooth = scipy.signal.savgol_filter(y,53,3)  
# 亦或
y_smooth2 = savgol_filter(y, 99, 1, mode= 'nearest')

# 备注:
y:代表曲线点坐标(x,y)中的y值数组
window_length:窗口长度,该值需为正奇整数。例如:此处取值53
k值:polyorder为对窗口内的数据点进行k阶多项式拟合,k的值需要小于window_length。例如:此处取值3
mode:确定了要应用滤波器的填充信号的扩展类型。(This determines the type of extension to use for the padded signal to which the filter is applied.

调参规律:

现在看一下window_length和k这两个值对曲线的影响。

1)window_length对曲线的平滑作用:
( window_length的值越小,曲线越贴近真实曲线;window_length值越大,平滑效果越厉害(备注:该值必须为正奇整数)。

1)2)k值对曲线的平滑作用:
( k值越大,曲线越贴近真实曲线;k值越小,曲线平滑越厉害。另外,当k值较大时,受窗口长度限制,拟合会出现问题,高频曲线会变成直线。

1.3 Savitzky-Golay 曲线平滑处理 示例

# 用于生成问题描述中示例曲线的代码如下:
import numpy as np
from matplotlib import pyplot as plt

Size = 100
x = np.linspace(1, Size,Size)

#生成随机矩阵
data = np.random.randint(1, Size, Size)
print(data)
      
# 可视化图线
plt.plot(x, data,'r')

# 使用Savitzky-Golay 滤波器后得到平滑图线
from scipy.signal import savgol_filter
y = savgol_filter(data, 15, 2, mode= 'nearest')

# 可视化图线
plt.plot(x, y, 'b', label = 'savgol')

#显示曲线
plt.show()

#生成的随机矩阵

>>>
[61 36 90 88 89 29 36 39 92 62 89 10  8 66 37 92 14 45 97 35 94  1 10 15
 14 65 55 55 10  8 57 39 28 62 20 19 30 75 82 71 54 24 40 48 64 65 22 97
 61 13 14 69 35 58 61  2 42 93 43 62 75 39 63 75 82 53 32 86 17 95 89 25
 73 47 22 57 85 27 49 47 63 54 61  6 99 84 78 41 88  2 41 63 32 43 81 70
 75 86 13 57]

Savitzky-Golay 平滑曲线 效果
在这里插入图片描述

1.4 Savitzky-Golay原理剖析

scipy官方帮助文档里可以看到关于Savitzky-Golay 滤波器中关于 savgol_filter()函数 的详细说明。

以下是关于 Savitzky-Golay平滑滤波 的简单介绍(参考Python 生成曲线进行快速平滑处理):

Savitzky-Golay平滑滤波是光谱预处理中的常用滤波方法,其 核心思想:是对一定长度窗口内的数据点进行k阶多项式拟合,从而得到拟合后的结果。 对它进行离散化处理后,S-G 滤波其实是一种移动窗口的加权平均算法,但是其加权系数不是简单的常数窗口,而是通过在滑动窗口内对给定高阶多项式的最小二乘拟合得出。

Savitzky-Golay平滑滤波被广泛地运用于数据流平滑除噪,是一种在时域内基于局域多项式最小二乘法拟合的滤波方法。这种滤波器的 最大特点:在滤除噪声的同时可以确保信号的形状、宽度不变。

使用平滑滤波器对信号滤波时,实际上是拟合了信号中的低频成分,而将高频成分平滑出去了。 如果噪声在高频端,那么滤波的结果就是去除了噪声,反之,若噪声在低频段,那么滤波的结果就是留下了噪声。

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

参考链接:Savitzky-Golay平滑滤波的python实现

2 插值法对折线平滑处理——详解

插值法对折线平滑处理——详解

3 基于Numpy.convolve实现滑动平均滤波——详解

基于Numpy.convolve实现滑动平均滤波——详解

曲线平滑处理——Savitzky-Golay 滤波器——详解

  • 7
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 好的,下面是一个用Python实现Savitzky-Golay滤波器的示例代码: ``` python import numpy as np from scipy.signal import savgol_filter # 创建数据 x = np.linspace(0, 2*np.pi, 100) y = np.sin(x) + np.random.random(100) * 0.2 # 使用Savitzky-Golay滤波器平滑数据 y_smoothed = savgol_filter(y, window_length=5, polyorder=2) # 可视化结果 import matplotlib.pyplot as plt plt.plot(x, y, label='Raw') plt.plot(x, y_smoothed, label='Smoothed') plt.legend() plt.show() ``` 这个例子生成了一个正弦曲线,然后添加了一些随机噪声。然后使用Savitzky-Golay滤波器数据进行平滑处理,并使用matplotlib库将结果可视化。 在代码中,`savgol_filter`是SciPy中用于Savitzky-Golay滤波的函数。`window_length`参数指定滤波器的窗口大小,`polyorder`参数指定滤波器的多项式阶数。这些参数的值可以根据数据的特点进行调整。 希望这个例子可以帮助到你! ### 回答2: Savitzky-Golay滤波器是一种常用于数据平滑处理的方法,通过对给定数据进行滑动平均处理,从而平滑噪声,去除周期性噪声,并且保留信号的整体趋势。 在Python中,可以使用SciPy库来实现Savitzky-Golay滤波器。SciPy提供了一个sg函数,可以直接对给定数据进行滤波处理。该函数需要指定滤波窗口长度和多项式拟合的阶数两个参数。 具体而言,使用SciPy中的sg函数实现滤波的步骤如下: 1. 导入必要的库: ``` from scipy.signal import savgol_filter import numpy as np ``` 2. 定义数据: ``` x = np.linspace(0, 10, 100) y = np.sin(x) + np.random.random(100) * 0.2 ``` 3. 使用sg函数进行过滤,指定窗口长度和多项式拟合的阶数: ``` y_smooth = savgol_filter(y, window_length=11, polyorder=2) ``` 其中,window_length参数表示滤波窗口长度,polyorder参数表示多项式拟合的阶数。 4. 绘制原始数据平滑后的数据对比图: ``` import matplotlib.pyplot as plt plt.figure(figsize=(10, 6)) plt.plot(x, y, label='Original') plt.plot(x, y_smooth, label='Smooth') plt.legend() plt.show() ``` 需要注意的是,Savitzky-Golay滤波器数据处理需要根据具体情况适当调整窗口长度和多项式拟合的阶数等参数。此外,Savitzky-Golay滤波器也并不是适用于所有数据处理场景,用户需要具体情况具体分析选择使用何种滤波方法。 ### 回答3: Savitzky-Golay滤波器是一种常用的数字信号处理方法,通常用于对一组数据进行平滑处理或者降噪处理。它是基于局部多项式拟合的方法,可以在不影响数据信号主要特征的情况下去除高频噪声。在Python中,我们可以使用SciPy库中的signal模块来实现Savitzky-Golay滤波器。 在使用SciPy库中的signal模块实现savitzky-golay滤波器时,需要先安装SciPy库,并且SciPy库需要在Numpy库的基础上安装,可以通过以下命令进行安装: ``` pip install scipy ``` 在引入SciPy库和Numpy库后,我们使用signal模块中的savgol_filter()方法来实现Savitzky-Golay滤波器。该方法有三个常用的参数:输入信号x,窗口长度window_length和拟合多项式的次数polyorder。其中,窗口长度和拟合多项式次数的选择会直接影响滤波器的效果。通常情况下,窗口长度需要选择与信号波形主要特征相匹配的数值,而多项式次数需要在平滑和噪声抑制之间达到平衡。代码如下: ``` import numpy as np from scipy.signal import savgol_filter # 定义输入信号x x = np.array([...]) # 定义window_length和polyorder window_length = ... polyorder = ... # 使用savgol_filter方法进行滤波 y = savgol_filter(x, window_length, polyorder) # 输出结果 print(y) ``` 需要注意的是,如果输入信号具有较高的噪声或者突发噪声,建议在savitzky-golay滤波器之前使用其他滤波器进行预处理,以获得更好的效果。 总之,在Python中实现Savitzky-Golay滤波器非常简单,只需要调用SciPy库中的signal模块中的savgol_filter()方法即可。需要根据实际情况优选窗口长度和拟合多项式次数,以获得更好的滤波效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

R-G-B

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值