From 98bae98d05d4b86352b4d6fbc900d59a1d57e941 Mon Sep 17 00:00:00 2001 From: willxw Date: Tue, 17 Oct 2023 11:32:17 +0100 Subject: [PATCH] added q value parameter to be passed to filter functions (#515) I have added a 2nd parameter to the filter functions low_pass, high_pass, to_low_pass, and to_high pass; allowing a q value to be passed along with the frequency. Co-authored-by: David Kleingeld --- src/source/blt.rs | 38 ++++++++++++++++++++++++++++++++------ src/source/mod.rs | 21 +++++++++++++++++++++ 2 files changed, 53 insertions(+), 6 deletions(-) diff --git a/src/source/blt.rs b/src/source/blt.rs index fa3e33cd..fe1c2f3c 100644 --- a/src/source/blt.rs +++ b/src/source/blt.rs @@ -7,12 +7,27 @@ use crate::Source; /// Internal function that builds a `BltFilter` object. pub fn low_pass(input: I, freq: u32) -> BltFilter +where + I: Source, +{ + low_pass_with_q(input, freq, 0.5) +} + +pub fn high_pass(input: I, freq: u32) -> BltFilter +where + I: Source, +{ + high_pass_with_q(input, freq, 0.5) +} + +/// Same as low_pass but allows the q value (bandwidth) to be changed +pub fn low_pass_with_q(input: I, freq: u32, q: f32) -> BltFilter where I: Source, { BltFilter { input, - formula: BltFormula::LowPass { freq, q: 0.5 }, + formula: BltFormula::LowPass { freq, q }, applier: None, x_n1: 0.0, x_n2: 0.0, @@ -21,13 +36,14 @@ where } } -pub fn high_pass(input: I, freq: u32) -> BltFilter +/// Same as high_pass but allows the q value (bandwidth) to be changed +pub fn high_pass_with_q(input: I, freq: u32, q: f32) -> BltFilter where I: Source, { BltFilter { input, - formula: BltFormula::HighPass { freq, q: 0.5 }, + formula: BltFormula::HighPass { freq, q }, applier: None, x_n1: 0.0, x_n2: 0.0, @@ -50,13 +66,23 @@ pub struct BltFilter { impl BltFilter { /// Modifies this filter so that it becomes a low-pass filter. pub fn to_low_pass(&mut self, freq: u32) { - self.formula = BltFormula::LowPass { freq, q: 0.5 }; - self.applier = None; + self.to_low_pass_with_q(freq, 0.5); } /// Modifies this filter so that it becomes a high-pass filter pub fn to_high_pass(&mut self, freq: u32) { - self.formula = BltFormula::HighPass { freq, q: 0.5 }; + self.to_high_pass_with_q(freq, 0.5); + } + + /// Same as to_low_pass but allows the q value (bandwidth) to be changed + pub fn to_low_pass_with_q(&mut self, freq: u32, q: f32) { + self.formula = BltFormula::LowPass { freq, q }; + self.applier = None; + } + + /// Same as to_high_pass but allows the q value (bandwidth) to be changed + pub fn to_high_pass_with_q(&mut self, freq: u32, q: f32) { + self.formula = BltFormula::HighPass { freq, q }; self.applier = None; } diff --git a/src/source/mod.rs b/src/source/mod.rs index c2d595a4..2af80075 100644 --- a/src/source/mod.rs +++ b/src/source/mod.rs @@ -343,6 +343,7 @@ where blt::low_pass(self, freq) } + /// Applies a high-pass filter to the source. #[inline] fn high_pass(self, freq: u32) -> BltFilter where @@ -351,6 +352,26 @@ where { blt::high_pass(self, freq) } + + /// Applies a low-pass filter to the source while allowing the q (badnwidth) to be changed. + #[inline] + fn low_pass_with_q(self, freq: u32, q: f32) -> BltFilter + where + Self: Sized, + Self: Source, + { + blt::low_pass_with_q(self, freq, q) + } + + /// Applies a high-pass filter to the source while allowing the q (badnwidth) to be changed. + #[inline] + fn high_pass_with_q(self, freq: u32, q: f32) -> BltFilter + where + Self: Sized, + Self: Source, + { + blt::high_pass_with_q(self, freq, q) + } } impl Source for Box>