def derivative_filter(ecg):
    # Make impulse response
    h = [-1, -2, 0, 2, 1]
    h = [x / 8 for x in h]
    # Apply filter
    ecg4 = np.convolve(ecg, h)
    ecg4 = np.roll(ecg4, -6)
    return normalizer.max_normalization(ecg4)
def moving_window_integration(ecg):
    # Make impulse response
    h = np.ones(31)
    h = np.array([x / 31 for x in h])

    # Apply filter
    ecg6 = np.convolve(ecg, h)
    ecg6 = np.roll(ecg6, -15)
    return normalizer.max_normalization(ecg6)
def low_pass_filtering(ecg):
    # LPF (1-z^-6)^2/(1-z^-1)^2
    b = [1, 0, 0, 0, 0, 0, -2, 0, 0, 0, 0, 0, 1]
    a = [1, -2, 1]

    # transfer function of LPF
    h_LP = lfilter(b, a, np.append([1], np.zeros(12)))

    ecg2 = np.convolve(ecg, h_LP)
    # cancel delay
    ecg2 = np.roll(ecg2, -6)
    return normalizer.max_normalization(ecg2)
def high_pass_filtering(ecg):
    # HPF = Allpass-(Lowpass) = z^-16-[(1-z^32)/(1-z^-1)]
    b = [
        -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, -32, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
    ]
    a = [1, -1]

    # impulse response iof HPF
    h_HP = lfilter(b, a, np.append([1], np.zeros(32)))
    ecg3 = np.convolve(ecg, h_HP)
    # cancel delay
    ecg3 = np.roll(ecg3, -16)
    return normalizer.max_normalization(ecg3)
def squaring(ecg):
    ecg5 = np.square(ecg)
    return normalizer.max_normalization(ecg5)