Source code for EdiHeadyTrack.filter

# **************************************************************************** #
#                                                                              #
#                                                         :::      ::::::::    #
#    filter.py                                          :+:      :+:    :+:    #
#                                                     +:+ +:+         +:+      #
#    By: taston <thomas.aston@ed.ac.uk>             +#+  +:+       +#+         #
#                                                 +#+#+#+#+#+   +#+            #
#    Created: 2023/04/26 15:59:05 by taston            #+#    #+#              #
#    Updated: 2023/09/01 11:33:14 by taston           ###   ########.fr        #
#                                                                              #
# **************************************************************************** #

import scipy
import numpy as np


[docs] class Filter: """ A class used to represent a Filter for data ... Attributes ---------- a : ndarray denominator polynomial of the IIR filter b : ndarray numerator polynomial of the IIR filter More information on IIR filters here: https://en.wikipedia.org/wiki/Infinite_impulse_response Methods ------- low_pass_butterworth(fs=4000, lowcut=160, order=4) creates a low pass butterworth filter apply(signal) applies filter to a given signal """ def __init__(self): nyq = 2000 low = 160 / nyq self.b, self.a = scipy.signal.butter(4, low, analog=False)
[docs] def low_pass_butterworth(self, fs=4000, lowcut=160, order=4): """Creates a low pass butterworth filter Parameters ---------- fs : float, optional sampling frequency (default 4000Hz) lowcut : float, optional lowcut frequency (default 160Hz) order : int, optional order of the filter (default 4) Returns ------- self """ nyq = 0.5 * fs low = lowcut / nyq # Create scipy Butterworth filter: # https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.butter.html self.b, self.a = scipy.signal.butter(order, low, analog=False) return self
[docs] def apply(self, signal): """Applies filter to a signal Parameters ---------- signal : list signal for filter to be applied to Returns ------- filtered_signal : list new filtered signal """ filtered_signal = scipy.signal.filtfilt(self.b, self.a, signal[~np.isnan(signal)]) return filtered_signal