Savitzky-Golay平滑滤波的python

直接调用库: 

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

data = np.exp(np.linspace(0,5,100)) * np.random.random(100)
zs=savgol_filter(data, 5, 3) # window size 5, polynomial order 3
plt.figure()
plt.plot(zs)
plt.plot(data)
plt.show()

自写:

# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import savgol_filter

"""
* 创建系数矩阵X
* size - 2×size+1 = window_size
* rank - 拟合多项式阶次
* x - 创建的系数矩阵
"""
def create_x(size, rank):
    x = []
    for i in range(int(2 * size + 1)):
        m = i - size
        row = [m**j for j in range(rank)]
        x.append(row)
    x = np.mat(x)
    return x

"""
 * Savitzky-Golay平滑滤波函数
 * data - list格式的1×n纬数据
 * window_size - 拟合的窗口大小
 * rank - 拟合多项式阶次
 * ndata - 修正后的值
"""
def savgol(data, window_size, rank):
    m = int((window_size - 1) / 2)
    odata = data[:]
    # 处理边缘数据,首尾增加m个首尾项
    for i in range(m):
        odata.insert(0,odata[0])
        odata.insert(len(odata),odata[len(odata)-1])
    # 创建X矩阵
    x = create_x(m, rank)
    # 计算加权系数矩阵B
    b = (x * (x.T * x).I) * x.T
    a0 = b[m]
    a0 = a0.T
    # 计算平滑修正后的值
    ndata = []
    for i in range(len(data)):
        y = [odata[i + j] for j in range(window_size)]
        y1 = np.mat(y) * a0
        y1 = float(y1)
        ndata.append(y1)
    return ndata

if __name__ == '__main__':
    data = np.exp(np.linspace(0, 5, 100)) * np.random.random(100)

    fig, ax = plt.subplots(figsize=(4, 3))
    ax.plot(range(len(data)), data)

    zs = savgol_filter(data, 5, 3)
    ax.plot(range(len(zs)), zs)

    datenew = savgol(list(data),5,3)
    ax.plot(range(len(datenew)), datenew)
    plt.show()

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Savitzky-Golay滤波器是一种常见的信号处理技术,用于平滑或者去噪数据。它使用多项式拟合来估计数据的局部趋势,并用这个估计值来代替原始数据。 在Python中,我们可以使用SciPy库中的signal模块来实现Savitzky-Golay滤波器。具体来说,我们可以使用`scipy.signal.savgol_filter`函数来进行滤波操作。 该函数的基本参数包括输入数组(一维或多维)、窗口长度(即滤波器的宽度,必须是一个整数),以及用于多项式拟合的多项式的次数。 例如,如果我们有一个包含随机噪声的信号数组,我们可以使用Savitzky-Golay滤波器对其进行平滑处理。下面是一个使用Savitzky-Golay滤波器平滑信号的简单示例代码: ```python import numpy as np from scipy.signal import savgol_filter # 生成随机噪声信号 np.random.seed(0) x = np.linspace(0, 10, 100) y = np.sin(x) + np.random.rand(100) * 0.5 # 使用Savitzky-Golay滤波器进行平滑处理 smoothed_y = savgol_filter(y, window_length=11, polyorder=3) # 打印平滑后的信号 print(smoothed_y) ``` 在上面的代码中,`window_length`参数指定了滤波器的宽度,我们这里使用了11,`polyorder`参数指定了多项式的次数,我们这里使用了3。运行代码后,我们将得到平滑后的信号输出。 总之,Savitzky-Golay滤波器是一种在Python中实现的信号处理技术,可以用于平滑或去噪数据。通过使用SciPy库中的`savgol_filter`函数,我们可以方便地进行滤波操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

清纯世纪

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

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

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

打赏作者

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

抵扣说明:

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

余额充值