数据采集常用的滤波器(python版)

一、摘要

本次一共做了11个滤波器实验,包括:
1.限幅滤波器
2.中位值滤波器
3.递推中位值滤波器
4.算数平均值滤波器
5.递推算数平均数滤波器
6.中位值平均滤波器
7.限幅平均滤波器
8.一阶滞后滤波器
9.加权递推平均滤波器
10. 消抖滤波器
11.限幅消抖滤波器
网上常见的有10个滤波器,第三个递推中位值滤波器由自己小改设计

二、简单常规滤波器

1.限幅滤波器

1.1 操作方法

  1. 根据经验判断两次采样允许的最大偏差值limit
  2. 初始化lastData=limit
  3. 每次采新值时判断:若本次值与上次值之差<=limit,则本次有效;若本次值与上次值之差>limit,本次无效
  4. 用上次值代替本次

1.2 优缺点

可以克服脉冲干扰,但无法抑制周期性干扰,平滑度差

1.3 代码

lastData = limit 
def limiting(nowData, limit):
    global lastData
    if (abs(nowData-lastData) > limit):
        return lastData
    else:
        lastData = nowData
        return nowData

1.4 实验结果

限幅滤波器结果,蓝色线是真实值,橘色线是滤波后的值。limit = 1。

限幅滤波器结果 蓝色线是真实值,橘色线是滤波后的值

2. 中位值滤波器

2.1 操作方法

  1. 连续采样N次,按大小排列
  2. 取中间值为本次有效值
  3. 数据个数未到N返回数据本身
  4. 一个周期采样完后丢掉所有数据,然后新采样N个数据算中位数

2.2 优缺点

和历史数据无关,可以克服波动干扰,对温度等变化缓慢的被测参数有良好的滤波效果,对速度等快速变化的参数不宜。

2.3 代码

def medianNormal(data = []):
    data.sort()
    return data[int(len(data)/2)]

2.4 实验结果

数据结果
[2,4,6,8,10,12,14]8
[1,2,3,4]3.0

3. 递推中位值滤波器

3.1 操作方法

  1. 连续采样N次,按大小排列
  2. 取中间值为本次有效值
  3. 数据个数未到N返回数据本身
  4. 数据满足先进先出

3.2 优缺点

和历史数据相关,滞后性高于中位值滤波器,但数据稳定性高于中位值滤波器,对温度等变化缓慢的被测参数有良好的滤波效果,对速度等快速变化的参数不宜。

3.3 代码

allData = []
def median(data, N=0):
    global allData
    if len(allData) < N:
        allData.append(data)
        return data
    else:
        allData.insert(-1, data)
        median = allData[int(len(allData)/2)]
        allData.pop(0)
        return median

3.4 实验结果

中值滤波器结果,蓝色线是真实值,橘色线是滤波后的值。N = 6

在这里插入图片描述
中值滤波器结果,蓝色线是真实值,橘色线是滤波后的值。N = 11

在这里插入图片描述

4. 算数平均值滤波器

4.1 操作方法

  1. 连续采样N次
  2. 取平均 N较大时平滑度高,灵敏度低
  3. N较小时平滑度低,灵敏度高
  4. 一般N=12
  5. 一个周期采样完后丢掉所有数据,然后新采样N个数据算平均数

4.2 优缺点

适用于存在随机干扰的系统,占用RAM多,速度慢

4.3 代码

def meanNormal(data = []):
     return np.sum(data)/len(data)

4.4 实验结果

数据结果
[1,2,3,4]2.5
[2,4,6,8]5.0

5. 递推算数平均滤波器

5.1 操作方法

  1. 连续采样N次
  2. 取平均 N较大时平滑度高
  3. 灵敏度低 N较小时平滑度低,灵敏度高
  4. 数据个数未到N返回数据本身
  5. 数据满足先进先出

5.2 优缺点

和历史数据相关,适用于存在随机干扰的系统,占用RAM多,速度慢

5.3 代码

def mean(data, N=0):
    global allData
    if len(allData) < N-1:
        allData.append(data)
        return data
    else:
        allData.insert(-1, data)
        mean = np.sum(allData)/len(allData)
        allData.pop(0)
        return mean

5.4 实验结果

均值滤波器结果,蓝色线是真实值,橘色线是滤波后的值。N = 3
均值滤波器结果
均值滤波器结果,蓝色线是真实值,橘色线是滤波后的值。N = 6
均值滤波器结果

6. 中位值平均滤波器

6.1 操作方法

  1. 采样N个值
  2. 去掉最大最小
  3. 计算N-2的平均值 N= 3~14

6.2 优缺点

  1. 融合了中位值,平均值的优点
  2. 消除脉冲干扰
  3. 计算速度慢,RAM占用大

6.3 代码

def medianMeanNornal(data=[]):
    data.sort()
    data.pop(0)
    data.pop(-1)
    return np.sum(data)/len(data)

6.4 实验结果

数据结果
[1,2,3,4,6,7]3.75
[1,4,3,4,6,9]4.25

7. 限幅平均滤波器

7.1 操作方法

  1. 每次采样数据先限幅后送入队列
  2. 取N个数据的平均值

7.2 优缺点

  1. 融合限幅、均值、队列的优点
  2. 消除脉冲干扰,占RAM较多

7.3 代码

lastData = limit
allData = []
def limitMean(nowData, limit, N):
    global lastData
    global allData
    if (abs(nowData-lastData) > limit):
        nowData = lastData
    else:
        pass
    if len(allData) < N-1:
        allData.append(nowData)
        return nowData
    else:
        allData.insert(-1, nowData)
        mean = np.sum(allData)/len(allData)
        allData.pop(0)
        return mean

7.4 实验结果

限幅平均滤波器结果,蓝色线是真实值,橘色线是滤波后的值。N = 6

在这里插入图片描述
限幅平均滤波器结果,蓝色线是真实值,橘色线是滤波后的值。N = 11

在这里插入图片描述

8. 一阶滞后滤波器

8.1 操作方法

  1. 取a=0~1
  2. 本次滤波结果=(1-a)* 本次采样 + a * 上次结果

8.2 优缺点

  1. 良好一直周期性干扰,适用波动频率较高场合
  2. 灵敏度低,相位滞后

8.3 代码

lastData = 0 
def firstorder(nowData, a):
    global lastData
    data = (1-a)*nowData+a*lastData
    lastData = nowData
    return data

8.4 实验结果

一阶滞后滤波器结果,蓝色线是真实值,橘色线是滤波后的值。a = 0.1
在这里插入图片描述
一阶滞后滤波器结果,蓝色线是真实值,橘色线是滤波后的值。a = 0.6
在这里插入图片描述

9. 加权递推平均滤波器

9.1 操作方法

  1. 对递推平均滤波的改进,不同时刻的数据加以不同权重,通常越新的数据权重越大,这样灵敏度高,但平滑度低

9.2 优缺点

适用有较大滞后时间常数和采样周期短的系统,对滞后时间常数小,采样周期长、变化慢的信号不能迅速反应其所受干扰

9.3 代码

allData = []
def weightmean(nowData, weight=[], N=5): #权重weight的长度要和N相等
    sum = 0
    if len(allData) < N-1:
        allData.append(nowData)
        return nowData
    else:
        weightSum = np.sum(weight)
        allData.insert(-1, nowData)
        for i, x in enumerate(allData):
            sum += weight[i] * x
        allData.pop(0)
    return sum/weightSum

9.4 实验结果

加权递推平均滤波器结果,蓝色线是真实值,橘色线是滤波后的值。N = 5

在这里插入图片描述
加权递推平均滤波器结果,蓝色线是真实值,橘色线是滤波后的值。N = 10

在这里插入图片描述

10. 消抖滤波器

10.1 操作方法

  1. 设置一个滤波计数器
  2. 将采样值与当前有效值比较
  3. 若采样值=当前有效值,则计数器清0
  4. 若采样值不等于当前有效值,则计数器+1
  5. 若计数器溢出,则采样值替换当前有效值,计数器清0

10.2 优缺点

  1. 对变化慢的信号滤波效果好,变化快的不好
  2. 避免临界值附近的跳动,计数器溢出时若采到干扰值则无法滤波

10.3 代码

lastData = 10
counter = 0
def eliminatedithering(nowData, N):
    global lastData, counter
    if counter == N:
        lastData = nowData
        counter = 0
        return nowData
    if nowData != lastData:
        counter += 1
        return lastData

10.4 实验结果

消抖滤波器结果,蓝色线是真实值,橘色线是滤波后的值。N = 4
在这里插入图片描述
消抖滤波器结果,蓝色线是真实值,橘色线是滤波后的值。N = 8
在这里插入图片描述

11. 限幅消抖滤波器

11.1 操作方法

  1. 先限幅 后消抖

11.2 优缺点

  1. 避免引入干扰值,对快速变化的信号不宜
  2. 融合了限幅、消抖的优点

11.3 代码

lastData = 10 
counter = 0 
def limiteiminatedithering(nowData,N,limit):
    global lastData, counter
    if (abs(nowData-lastData) > limit):
        nowData = lastData
    else:
        pass
    if counter == N:
        lastData = nowData
        counter = 0
        return nowData
    if nowData != lastData:
        counter += 1
        return lastData

11.4 实验结果

限幅消抖滤波器结果,蓝色线是真实值,橘色线是滤波后的值。N = 4,limit = 3
在这里插入图片描述
限幅消抖滤波器结果,蓝色线是真实值,橘色线是滤波后的值。N = 4,limit = 2

在这里插入图片描述

  • 8
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值