diff --git a/butterfilter.py b/butterfilter.py
new file mode 100644
index 0000000000000000000000000000000000000000..557b1fd238b96bed0f2f89307d6629dd2d9deabd
--- /dev/null
+++ b/butterfilter.py
@@ -0,0 +1,28 @@
+import numpy as np
+from scipy import signal
+
+
+def butterfilter(timeseries, 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",
+    )
+    # subtract time series by mean
+    timeseries_norm = timeseries - np.nanmean(timeseries, axis=1).reshape(
+        timeseries.shape[0], 1
+    )
+    filtered_timeseries = signal.sosfiltfilt(sos, timeseries_norm, axis=1)
+    return filtered_timeseries