信号处理之中值滤波
Posted 月疯
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了信号处理之中值滤波相关的知识,希望对你有一定的参考价值。
代码:
import matplotlib.pyplot as plt
import numpy as np
import numpy.fft as nf
import scipy.io.wavfile as wf
from scipy import signal
from scipy.misc import electrocardiogram
#读取信号数据
def readtxt(path):
with open(path,'r') as f:
str=f.readline()
list = str.split(' ')
list1=[];
for i,x in enumerate(list):
if ((i%5 == 0) or (i%5 == 1) or (i%5 == 2)) and x !='':
list1.append(float(x))
return list1
#二次处理波形,取奇书或者是偶数进行筛选
def getFilter(list):
lis=[]
for i,j in enumerate(list):
if i%2==0:
lis.append(j/1000)
print("数据的长度:{0}".format(len(lis)))
return lis
#进行滤波处理(butworth)
def FilterData(list):
b, a = signal.butter(2, 0.02, 'lowpass')# 配置滤波器 2 表示滤波器的阶数
outline_data = signal.filtfilt(b, a, list)
raw = list - outline_data
b1, a1 = signal.butter(8, 0.02, 'lowpass') # 配置滤波器 8 表示滤波器的阶数
outline_data1 = signal.filtfilt(b1, a1, raw)
return outline_data1
#中值滤波(fitmed)
#list表示数据长度,window表示中值滤波的窗口长度
#前面增加半个,后面在增加半个
def FilterFitmad(list,window):
#定义窗口长度(重新组排,窗口为奇书)
window=(window/2)*2+1
#取一半
wk=int(window/2)
size=len(list)
#存放结果值
result=[]
#表示从window开始,步长是1,总长度是size
for i in range(wk,size):
win1=list[i-wk:i+wk+1]
#取中值
med=np.median(win1)
result.append(med)
return result
#图表绘制
def show(list3,list4,data):
time=[i*0.002 for i in range(len(data))]
plt.subplot(311)
plt.plot(time, list3)
plt.subplot(312)
plt.plot(time, list4)
plt.subplot(313)
plt.plot(time, data)
# peaks, _ = signal.find_peaks(data, height=4)
# plt.plot(data)
# #TypeError: only integer scalar arrays can be converted报错
# plt.plot(peaks, np.array(data)[peaks], "o")
# plt.plot(np.zeros_like(data), "--", color="gray")
plt.show()
def cz_(list1,list2):
res=[]
#同时循环多个数据
for i,j in zip(list1,list2):
dat=i-j
res.append(dat)
return res
if __name__=="__main__":
list1=readtxt('1.txt')
list2=getFilter(list1)
#巴特沃斯滤波
list3=FilterData(list2)
#中值滤波
list4=FilterFitmad(list2, 50)
# 注释部分为使用single库中的中值滤波函数来代替自己的中值滤波函数
# middle = signal.medfilt(list, 25)
# result = datas - middle
li=cz_(list2[3000:5000],list4[3000:5000])
show(list2[3000:5000],list4[3000:5000],li)
效果展示:
以上是关于信号处理之中值滤波的主要内容,如果未能解决你的问题,请参考以下文章
[opencv]图像处理-均值滤波/方框滤波/高斯滤波/中值滤波