您现在的位置是:首页 > 技术教程 正文

python 数据、曲线平滑处理——基于Numpy.convolve实现滑动平均滤波——详解

admin 阅读: 2024-03-24
后台-插件-广告管理-内容页头部广告(手机)

文章目录

  • 1 基于Numpy.convolve实现滑动平均滤波
    • 1.1 滑动平均概念
    • 1.2 滑动平均的数学原理
    • 1.3 语法
    • 1.4 滑动平均滤波示例
  • 2 曲线平滑处理——Savitzky-Golay 滤波器——详解
  • 3 基于Numpy.convolve实现滑动平均滤波——详解

1 基于Numpy.convolve实现滑动平均滤波

1.1 滑动平均概念

滑动平均滤波法 (又称:递推平均滤波法),它把连续取N个采样值看成一个队列 ,队列的长度固定为N ,每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据(先进先出原则) 。把队列中的N个数据进行算术平均运算,就可获得新的滤波结果。

N值的选取:流量,N=12;压力:N=4;液面,N=4 ~ 12;温度,N=1~4

滑动平均的优缺点:

优点: 对周期性干扰有良好的抑制作用,平滑度高,适用于高频振荡的系统。
缺点: 灵敏度低,对偶然出现的脉冲性干扰的抑制作用较差,不易消除由于脉冲干扰所引起的采样值偏差,不适用于脉冲干扰比较严重的场合,比较浪费RAM 。

1.2 滑动平均的数学原理

滑动平均滤波法计算类似一维卷积的工作原理,滑动平均的N就对应一维卷积核大小(长度)。 区别在于:

(1)步长会有些区别,滑动平均滤波法滑动步长为1,而一维卷积步长可以自定义;
(2)一维卷积的核参数是需要更新迭代的,而滑动平均滤波法核参数都是1。

我们应该怎么利用这个相似性呢?其实也很简单,只需要把一维卷积核大小(长度)和N相等,步长设置为1,核参数都初始为1就可以了。由于一维卷积计算速度快,因此我们可以使用一维卷积来快速高效地实现这个功能。

滑动平均值是卷积数学运算的一个例子。对于滑动平均值,沿着输入滑动窗口并计算窗口内容的平均值。对于离散的1D信号,卷积是相同的,除了代替计算任意线性组合的平均值,即将每个元素乘以相应的系数并将结果相加。那些系数,一个用于窗口中的每个位置,有时称为卷积核。现在,N值的算术平均值是( x1 + x2 + . . . + xN ) / N ,所以相应的内核是( 1/N , 1/N , . . . , 1 / N ) ,这正是我们通过使用得到的np.ones((N,))/N。

1.3 语法

通过Numpy库中的convolve()函数可以实现这些功能。

def np_move_avg(a,n,mode="same"): return(np.convolve(a, np.ones((n,))/n, mode=mode))
  • 1
  • 2

Numpy.convolve函数:(numpy.convolve函数官方文档)

参数说明:

  • a:(N,)输入的第一个一维数组
  • v:(M,)输入的第二个一维数组
  • mode:{‘full’, ‘valid’, ‘same’}参数可选,该参数指定np.convolve函数如何处理边缘。
mode可能的三种取值情况: full’ 默认值,返回每一个卷积值,长度是N+M-1,在卷积的边缘处,信号不重叠,存在边际效应。 ‘same’ 返回的数组长度为max(M, N),边际效应依旧存在。 ‘valid’  返回的数组长度为max(M,N)-min(M,N)+1,此时返回的是完全重叠的点。边缘的点无效。
  • 1
  • 2
  • 3
  • 4

和一维卷积参数类似,a就是被卷积数据,v是卷积核大小。

1.4 滑动平均滤波示例

np.convolve函数中通过mode参数指定如何处理边缘。

下面是一个说明模式不同取值之间差异的图:

import numpy as np import matplotlib.pyplot as plt def np_move_avg(a,n,mode="same"): return(np.convolve(a, np.ones((n,))/n, mode=mode)) modes = ['full', 'same', 'valid'] for m in modes: plt.plot(np_move_avg(np.ones((200,)), 50, mode=m)) plt.axis([-10, 251, -.1, 1.1]) plt.legend(modes, loc='lower center') plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

在这里插入图片描述
参考链接:
[开发技巧]·Python极简实现滑动平均滤波(基于Numpy.convolve)

numpy中的convolve的理解

典型范例:

# 实现数据可视化中的数据平滑 import numpy as np import matplotlib.pylab as plt ''' 其它的一些知识点: raise:当程序发生错误,python将自动引发异常,也可以通过raise显示的引发异常 一旦执行了raise语句,raise语句后面的语句将不能执行 ''' def moving_average(interval, windowsize): window = np.ones(int(windowsize)) / float(windowsize) re = np.convolve(interval, window, 'same') return re def LabberRing(): t = np.linspace(-4, 4, 100) # np.linspace 等差数列,-44生成100个数 print('t=', t) # np.random.randn 标准正态分布的随机数,np.random.rand 随机样本数值 y = np.sin(t) + np.random.randn(len(t)) * 0.1 # 标准正态分布中返回1个,或者多个样本值 print('y=', y) plt.plot(t, y, 'k') # plot(横坐标,纵坐标, 颜色) y_av = moving_average(y, 10) plt.plot(t, y_av, 'b') plt.xlabel('Time') plt.ylabel('Value') # plt.grid()网格线设置 plt.grid(True) plt.show() return LabberRing() # 调用函数
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

在这里插入图片描述

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

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

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

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

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

标签:
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

在线投稿:投稿 站长QQ:1888636

后台-插件-广告管理-内容页尾部广告(手机)
关注我们

扫一扫关注我们,了解最新精彩内容

搜索