diff --git a/eitprocessing/filters/butterworth_filters.py b/eitprocessing/filters/butterworth_filters.py index a360a95d9..0869de4d0 100644 --- a/eitprocessing/filters/butterworth_filters.py +++ b/eitprocessing/filters/butterworth_filters.py @@ -1,3 +1,4 @@ +import sys from dataclasses import InitVar, dataclass from typing import Literal @@ -142,6 +143,15 @@ def apply_filter(self, input_data: npt.ArrayLike, axis: int = -1) -> np.ndarray: Returns: The filtered output with the same shape as the input data. """ + if np.any(np.isnan(input_data)): + msg = "Input data contains NaN-values." + exc = ValueError(msg) + if sys.version_info >= (3, 11): + exc.add_note( + "Butterworth filters can't handle data containing NaN-values. " + "You can fill in gaps using `np.nan_to_num(...)` or interpolation." + ) + raise exc sos = signal.butter( N=self.order, Wn=self.cutoff_frequency, diff --git a/tests/test_butterworth_filter.py b/tests/test_butterworth_filter.py index 0cb406d37..e5c81bc78 100644 --- a/tests/test_butterworth_filter.py +++ b/tests/test_butterworth_filter.py @@ -286,3 +286,14 @@ def compare_filters( signal_, axis, ) + + +def test_nan_values(filter_arguments: dict): + filter_ = ButterworthFilter(**filter_arguments) + data = np.random.default_rng().random(1000) + + _ = filter_.apply_filter(data) + + data[100] = np.nan + with pytest.raises(ValueError): + _ = filter_.apply_filter(data)