常见滤波⽅法Python实现常见滤波⽅法Python实现
2020-7-23
滤波⽅法
设定两次采样允许的最⼤偏差为A
如果(本次值-上次值)的绝对值⼤于A,则本次值⽆效,⽤上次值代替本次值
如果(本次值-上次值)的绝对值⼤于A,则本次值有效,采⽤本次值
import numpy as np
from matplotlib import pyplot as plt
plt.figure(figsize =(20,8))
list_s =[]
s = al(0,25,400)
plt.plot(s,label ='原始数据')
for i in range(len(s)-1):
if abs(s[i+1]- s[i])>=15:
s[i+1]= s[i]
list_s.append(s[i+1])
plt.plot(list_s,label ='滤波后数据')
plt.title('限幅滤波法')
plt.legend()
plt.show()
中位值滤波法
连续采样N次,N取奇数
把N次值按从⼩到⼤或从⼤到⼩顺序排列,取中位数为本次有效结果
plt.figure(figsize =(20,8))
s = al(0,25,400)
plt.plot(s,label ='原始数据')
n =7#⼀次采样的次数
rank =[]
for i in range(int(len(s)/n)):
select_s = s[i*n:(i+1)*n]#切⽚选取⼀次采样的个数
mid_s = np.median(select_s)
for j in range(n):#将取到的值都赋值为中值,⽅便画图体现,实际中可以只要⼀次值
rank.append(mid_s)
plt.plot(rank,label ='滤波后的数据')
plt.title('中值滤波算法')
plt.legend()
plt.show()
算数平均滤波法
连续取样N次做算数平均运算,得到的平均数为本次采样结果
N值较⼤:平滑度越⾼,但灵敏度较低
N值较⼩:平滑度越低,但灵敏度⾼
plt.figure(figsize =(20,8))
s = al(0,25,400)
plt.plot(s,label ='原始数据')
mean =[]
n =7#⼀次采样的次数
for i in range(int(len(s)/n)):
select_s = s[i*n:(i+1)*n]#切⽚选取⼀次采样的个数
mean_s = np.mean(select_s)
for j in range(n):#将取到的值都赋值为平均值,⽅便画图体现,实际中可以只要⼀次值        mean.append(mean_s)
plt.plot(mean,label ='滤波后的数据')
plt.title('算数平均滤波算法')
plt.legend()
plt.show()
递推平均滤波法
把连续取N个采样值看成⼀个队列,遵循先进先出原则
队列长度固定为N
每次采样到⼀个新数据放⼊队尾,并去除队⾸的数据
把队列中的数据进⾏算数平均,即为本次结果
plt.figure(figsize =(20,8))
s = al(0,25,400)
plt.plot(s,label ='原始数据')
N =7#队列⼤⼩
mean_list =[]
select_s =list(s[i:i+N])#先选择⼀个队列的数据,求平均
mean = np.mean(select_s)
select_s.insert(len(select_s),select_s[0])#左移⼀位
ve(select_s[0])
#select_s[-1] = mean
mean_list.append(mean)
for i in range(len(s)-N):#然后添加⼀个新数据,左移⼀位,去头去尾,重复迭代
select_s.append(s[i+N])
select_s.insert(len(select_s),select_s[0])#左移⼀位
ve(select_s[0])
ve(select_s[-1])
mean = np.mean(select_s)
#select_s[-1] = mean
mean_list.append(mean)
plt.plot(mean_list,label ='滤波后的数据')
plt.title('滑动平均滤波算法')
plt.legend()
plt.show()
中位值平均滤波法
相当于 中位值滤波算法+算数平均滤波算法
连续采样N个数据,按顺序排列
去头去尾,进⾏平均
plt.figure(figsize =(20,8))
s = al(0,25,400)
plt.plot(s,label ='原始数据')
mean =[]
random翻译n =7#⼀次采样的次数
for i in range(int(len(s)/n)):
select_s = s[i*n:(i+1)*n]#切⽚选取⼀次采样的个数
select_s =sorted(select_s)
ve(select_s[0])
ve(select_s[-1])
mean_s = np.mean(select_s)
for j in range(n):#将取到的值都赋值为平均值,⽅便画图体现,实际中可以只要⼀次值
mean.append(mean_s)
plt.plot(mean,label ='滤波后的数据')
plt.title('中位值平均滤波算法')
plt.legend()
plt.show()
限幅平均滤波法
相当于 限幅滤波算法+递推平均滤波算法
每次采样到新数据前先进⾏限幅处理
再送⼊队列进⾏递推平均滤波
(此处稍微做了改动,代码中将每次得到的平均值送⼊队尾,这样得到的滤波数据更偏向于稳定)plt.figure(figsize =(20,8))
s = al(0,25,400)
plt.plot(s,label ='原始数据')
N =8#队列⼤⼩
mean_list =[]
select_s =list(s[i:i+N])#先选择⼀个队列的数据,求平均
mean = np.mean(select_s)
select_s.insert(len(select_s),select_s[0])#左移⼀位
ve(select_s[0])
select_s[-1]= mean
mean_list.append(mean)
for i in range(len(s)-N):#然后添加⼀个新数据,左移⼀位,去头去尾,重复迭代
if abs(select_s[-1]- s[i+N])>=30:
s[i+N]= select_s[-1]
else:
s[i+N]= s[i+N]
select_s.append(s[i+N])
select_s.insert(len(select_s),select_s[0])#左移⼀位
ve(select_s[0])
ve(select_s[-1])
mean = np.mean(select_s)
select_s[-1]= mean
mean_list.append(mean)
plt.plot(mean_list,label ='滤波后的数据')
plt.title('限幅平均滤波算法')
plt.legend()
plt.show()
⼀阶滞后滤波法
plt.figure(figsize =(20,8))
list_s =[]
s = al(0,25,400)
plt.plot(s,label ='原始数据')
a =0.7#a取0-1之间,a越接近1越稳定,越接近0越灵敏
for i in range(len(s)-1):
s[i+1]=(1-a)* s[i+1]+ a * s[i]
list_s.append(s[i+1])
plt.plot(list_s,label ='滤波后数据')
plt.title('⼀阶滞后滤波算法')
plt.legend()
plt.show()