信号处理之中值滤波

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]图像处理-均值滤波/方框滤波/高斯滤波/中值滤波

[Python图像处理] 四十一.Python图像平滑万字详解(均值滤波方框滤波高斯滤波中值滤波双边滤波)

图像滤波的中值滤波

自适应中值滤波器

MATLAB-中值滤波原理实现及应用

MATLAB-中值滤波原理实现及应用