Python 十种数字滤波器

参考:https://www.geek-workshop.com/thread-7694-1-1.html

制作数据

#!/usr/bin/python3
# author: WxxMaster

import numpy as np
import matplotlib
import matplotlib.pyplot as plt

matplotlib.rcParams['font.sans-serif'] = ['SimHei']
np.random.seed(1)


# Data = [0.03*i + np.sin(0.02*math.pi*i) + j for i, j in enumerate(np.random.rand((200)))]
Data = [0.03*i + np.sin(0.02*math.pi*i) + j for i, j in enumerate(np.random.normal(1, 0.5, (200)))]

plt.subplot(221)
plt.title("原数据")
plt.plot([i for i in range(200)], [0.03*i + np.sin(0.02*math.pi*i) for i in range(200)], color="g")


plt.subplot(222)
plt.title("噪音数据")
plt.plot([i for i in range(200)], Data, color="b")

1.限幅滤波法

def LimitFilter(Data, Amplitude):
	'''
	A、名称:限幅滤波法(又称程序判断滤波法)
	B、方法:
		根据经验判断,确定两次采样允许的最大偏差值(设为A),
		每次检测到新值时判断:
		如果本次值与上次值之差<=A,则本次值有效,
		如果本次值与上次值之差>A,则本次值无效,放弃本次值,用上次值代替本次值。
	C、优点:
		能有效克服因偶然因素引起的脉冲干扰。
	D、缺点:
		无法抑制那种周期性的干扰。
	'''
	
	ReturnData = [Data[0]]
	for Value in Data[1:]:
		# print(abs(Value - ReturnData[-1]))
		if abs(Value - ReturnData[-1]) < Amplitude:  # 限幅
			ReturnData.append(Value)
		else:
			ReturnData.append(ReturnData[-1])


	return ReturnData



NextData = LimitFilter(Data, 1)
plt.subplot(223)
plt.title("限幅滤波 A=1.0")
plt.plot([i for i in range(200)], NextData, color="r")


NextData = LimitFilter(Data, 0.8)
plt.subplot(224)
plt.title("限幅滤波 A=0.8")
plt.plot([i for i in range(200)], NextData, color="y")

2.中位值滤波法

def MedianFilter(Data, N):
	'''
	A、名称:中位值滤波法
	B、方法:
   		连续采样N次(N取奇数),把N次采样值按大小排列,
		取中间值为本次有效值。
	C、优点:
		能有效克服因偶然因素引起的波动干扰;
		对温度、液位的变化缓慢的被测参数有良好的滤波效果。
	D、缺点:
		对流量、速度等快速变化的参数不宜。
	'''

	ReturnData = []
	StageList = []
	for index, Value in enumerate(Data):
		StageList.append(Value)
		if (index+1) % N == 0:
			StageList.sort() # 排序

			# 取中值
			if N%2 != 0:
				ReturnData += [StageList[int((N+1) / 2) - 1]] * N
				StageList.clear()
			else:
				ReturnData += [(StageList[int(N/2) - 1] + StageList
  • 8
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值