diff --git a/src/wela/fft_filtering.py b/src/wela/fft_filtering.py index 7469f01ce13a62df9fcdf842486cf79d5e09b73a..f0c08425db3ad21e4b6bf3431fa13bb76df75c02 100644 --- a/src/wela/fft_filtering.py +++ b/src/wela/fft_filtering.py @@ -105,24 +105,18 @@ def snr(fft_freqs, fft_power, cutoff_freq): return snr -def butterworth_filter(data, params=None): - """Apply Butterworth filter to time series arranged in rows.""" - # second-order-sections output - # by default, using a digital filter - if params is None: - params = { - "order": 2, - "critical_freqs": (1 / 350), - "filter_type": "highpass", - "sampling_freq": 1 / 3, - } - sos = signal.butter( - N=params["order"], - Wn=params["critical_freqs"], - btype=params["filter_type"], - fs=params["sampling_freq"], - output="sos", - ) +def lowpass_filter(data, cutoff, fs, N): + """Apply low-pass filter to a single time-series.""" + data = data - np.mean(data) + sos = signal.butter(N, cutoff, btype="lowpass", fs=fs, output="sos") + filtered_data = signal.sosfiltfilt(sos, data) + return filtered_data + np.mean(data) + + +def flavin_filter(data, cutoff=1 / 350, fs=1 / 5, N=2): + """Apply high-pass Butterworth filter to time series arranged in rows.""" + # use a digital filter assuming regularly spaced sampling + sos = signal.butter(N=N, Wn=cutoff, btype="highpass", fs=fs, output="sos") # fill NaNs between data points data = pd.DataFrame(data).interpolate(axis=1).to_numpy() # subtract time series by mean