From 358a6473b5251e4fd0ddc125e068e822888e5531 Mon Sep 17 00:00:00 2001 From: Anan Date: Thu, 6 Feb 2025 05:13:11 +0530 Subject: [PATCH 1/2] Added safety checks for filter stability --- audio_filters/butterworth_filter.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/audio_filters/butterworth_filter.py b/audio_filters/butterworth_filter.py index 4e6ea1b18..c29c2e2e3 100644 --- a/audio_filters/butterworth_filter.py +++ b/audio_filters/butterworth_filter.py @@ -9,7 +9,22 @@ Code based on https://webaudio.github.io/Audio-EQ-Cookbook/audio-eq-cookbook.htm Alternatively you can use scipy.signal.butter, which should yield the same results. """ +# All calls to filter creators must have keyword arguments +def safe_checks(filter_creator): + def safe_filter_creator(**kwargs): + if not isinstance(kwargs['frequency'], int) or kwargs['frequency'] <= 0: + raise ValueError('Frequency must be a positive integer.') + if not isinstance(kwargs['samplerate'], int) or kwargs['samplerate'] <= 0: + raise ValueError('Samplerate must be a positive integer.') + if not (0 < kwargs['frequency'] < kwargs['samplerate'] / 2): + raise ValueError('Frequency must be less than half of the samplerate.') + if kwargs['q_factor'] <= 0: + raise ValueError('Q factor must be positive.') + return filter_creator(**kwargs) + return safe_filter_creator + +@safe_checks def make_lowpass( frequency: int, samplerate: int, @@ -40,6 +55,7 @@ def make_lowpass( return filt +@safe_checks def make_highpass( frequency: int, samplerate: int, @@ -70,6 +86,7 @@ def make_highpass( return filt +@safe_checks def make_bandpass( frequency: int, samplerate: int, @@ -101,6 +118,7 @@ def make_bandpass( return filt +@safe_checks def make_allpass( frequency: int, samplerate: int, @@ -128,6 +146,7 @@ def make_allpass( return filt +@safe_checks def make_peak( frequency: int, samplerate: int, @@ -160,6 +179,7 @@ def make_peak( return filt +@safe_checks def make_lowshelf( frequency: int, samplerate: int, @@ -197,6 +217,7 @@ def make_lowshelf( return filt +@safe_checks def make_highshelf( frequency: int, samplerate: int, From 9977d00baf12229ba04e90b9b2de494f0002cef5 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 5 Feb 2025 23:50:18 +0000 Subject: [PATCH 2/2] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- audio_filters/butterworth_filter.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/audio_filters/butterworth_filter.py b/audio_filters/butterworth_filter.py index c29c2e2e3..4d51a3063 100644 --- a/audio_filters/butterworth_filter.py +++ b/audio_filters/butterworth_filter.py @@ -9,18 +9,20 @@ Code based on https://webaudio.github.io/Audio-EQ-Cookbook/audio-eq-cookbook.htm Alternatively you can use scipy.signal.butter, which should yield the same results. """ + # All calls to filter creators must have keyword arguments def safe_checks(filter_creator): def safe_filter_creator(**kwargs): - if not isinstance(kwargs['frequency'], int) or kwargs['frequency'] <= 0: - raise ValueError('Frequency must be a positive integer.') - if not isinstance(kwargs['samplerate'], int) or kwargs['samplerate'] <= 0: - raise ValueError('Samplerate must be a positive integer.') - if not (0 < kwargs['frequency'] < kwargs['samplerate'] / 2): - raise ValueError('Frequency must be less than half of the samplerate.') - if kwargs['q_factor'] <= 0: - raise ValueError('Q factor must be positive.') + if not isinstance(kwargs["frequency"], int) or kwargs["frequency"] <= 0: + raise ValueError("Frequency must be a positive integer.") + if not isinstance(kwargs["samplerate"], int) or kwargs["samplerate"] <= 0: + raise ValueError("Samplerate must be a positive integer.") + if not (0 < kwargs["frequency"] < kwargs["samplerate"] / 2): + raise ValueError("Frequency must be less than half of the samplerate.") + if kwargs["q_factor"] <= 0: + raise ValueError("Q factor must be positive.") return filter_creator(**kwargs) + return safe_filter_creator