信号处理之中值滤波

代码:

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)








 

效果展示:

 

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值