一、摘要
本次一共做了11个滤波器实验,包括:
1.限幅滤波器
2.中位值滤波器
3.递推中位值滤波器
4.算数平均值滤波器
5.递推算数平均数滤波器
6.中位值平均滤波器
7.限幅平均滤波器
8.一阶滞后滤波器
9.加权递推平均滤波器
10. 消抖滤波器
11.限幅消抖滤波器
网上常见的有10个滤波器,第三个递推中位值滤波器由自己小改设计
二、简单常规滤波器
1.限幅滤波器
1.1 操作方法
- 根据经验判断两次采样允许的最大偏差值limit
- 初始化lastData=limit
- 每次采新值时判断:若本次值与上次值之差<=limit,则本次有效;若本次值与上次值之差>limit,本次无效
- 用上次值代替本次
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 操作方法
- 连续采样N次,按大小排列
- 取中间值为本次有效值
- 数据个数未到N返回数据本身
- 一个周期采样完后丢掉所有数据,然后新采样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 操作方法
- 连续采样N次,按大小排列
- 取中间值为本次有效值
- 数据个数未到N返回数据本身
- 数据满足先进先出
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 操作方法
- 连续采样N次
- 取平均 N较大时平滑度高,灵敏度低
- N较小时平滑度低,灵敏度高
- 一般N=12
- 一个周期采样完后丢掉所有数据,然后新采样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 操作方法
- 连续采样N次
- 取平均 N较大时平滑度高
- 灵敏度低 N较小时平滑度低,灵敏度高
- 数据个数未到N返回数据本身
- 数据满足先进先出
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 操作方法
- 采样N个值
- 去掉最大最小
- 计算N-2的平均值 N= 3~14
6.2 优缺点
- 融合了中位值,平均值的优点
- 消除脉冲干扰
- 计算速度慢,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 操作方法
- 每次采样数据先限幅后送入队列
- 取N个数据的平均值
7.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 操作方法
- 取a=0~1
- 本次滤波结果=(1-a)* 本次采样 + a * 上次结果
8.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 操作方法
- 对递推平均滤波的改进,不同时刻的数据加以不同权重,通常越新的数据权重越大,这样灵敏度高,但平滑度低
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 操作方法
- 设置一个滤波计数器
- 将采样值与当前有效值比较
- 若采样值=当前有效值,则计数器清0
- 若采样值不等于当前有效值,则计数器+1
- 若计数器溢出,则采样值替换当前有效值,计数器清0
10.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 操作方法
- 先限幅 后消抖
11.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