文章目录
参考: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