[Python] ECG signal filtering

Discussão em 'Python' iniciado por Stack, Fevereiro 17, 2025.

  1. Stack

    Stack Membro Participativo

    I am trying to filter ECG signal acquired from Bioplux sensor. I am including lowpass filter to remove noise of frequencies over 200 Hz, highpass filter for removing baseline wander, and notch filter for removing powerline frequency of 60 Hz. I am not able to understand why I am getting a wavy shaped output after the high-pass filtering. Could someone suggest some ideas to get properly filtered ECG signal? The rawsignal data text file and the obtained output after filtering can be seen in the following link:

    https://drive.google.com/open?id=1hvvQpMMa_hn9VNlUh4HAqb_H1lCu70or

    The code I have written is as below:

    from scipy import signal
    from scipy.signal import butter, iirnotch, lfilter
    import numpy as np
    import matplotlib.pyplot as plt

    def butter_highpass(cutoff, fs, order=5):
    nyq = 0.5*fs
    normal_cutoff = cutoff/nyq
    b, a = butter(order, normal_cutoff, btype='high', analog=False, output='ba')
    return b, a

    def butter_lowpass(cutoff, fs, order=5):
    nyq = 0.5*fs
    normal_cutoff = cutoff/nyq
    b, a = butter(order, normal_cutoff, btype='low', analog=False, output='ba')
    return b, a

    def notch_filter(cutoff, q):
    nyq = 0.5*fs
    freq = cutoff/nyq
    b, a = iirnotch(freq, q)
    return b, a

    def highpass(data, fs, order=5):
    b,a = butter_highpass(cutoff_high, fs, order=order)
    x = lfilter(b,a,data)
    return x

    def lowpass(data, fs, order =5):
    b,a = butter_lowpass(cutoff_low, fs, order=order)
    y = lfilter(b,a,data)
    return y

    def notch(data, powerline, q):
    b,a = notch_filter(powerline,q)
    z = lfilter(b,a,data)
    return z

    def final_filter(data, fs, order=5):
    b, a = butter_highpass(cutoff_high, fs, order=order)
    x = lfilter(b, a, data)
    d, c = butter_lowpass(cutoff_low, fs, order = order)
    y = lfilter(d, c, x)
    f, e = notch_filter(powerline, 30)
    z = lfilter(f, e, y)
    return x
    return y
    return z

    rawdata = np.loadtxt('D:\CANADA TRIP\BiosignalsSample.txt', skiprows=0)
    signal = rawdata
    fs = 1000

    cutoff_high = 0.5
    cutoff_low = 200
    powerline = 60
    order = 6

    #print(signal)
    plt.figure(1)
    ax1 = plt.subplot(321)
    plt.plot(signal)
    ax1.set_title("Raw signal")

    conditioned_signal = final_filter(signal, fs, order)
    ax2 = plt.subplot(322)
    plt.plot(conditioned_signal)
    ax2.set_title("Conditioned signal")

    hsignal = highpass(signal, fs, order)
    ax3 = plt.subplot(323)
    plt.plot(hsignal)
    ax3.set_title("Only highpass filter")

    lsignal = lowpass(signal, fs, order)
    ax4 = plt.subplot(324)
    plt.plot(lsignal)
    ax4.set_title("Only lowpass filter")

    nonotch_1 = highpass(signal, fs, order)
    nonotch = lowpass(nonotch_1, fs, order)
    ax5 = plt.subplot(325)
    plt.plot(nonotch)
    ax5.set_title("High and low pass")

    onlynotch = notch(signal, powerline, 30)
    ax6 = plt.subplot(326)
    plt.plot(onlynotch)
    ax6.set_title("Notch filter only")

    plt.show()

    Continue reading...

Compartilhe esta Página