1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
use iir_filters::filter::{DirectForm2Transposed, Filter};
use iir_filters::filter_design::{butter, FilterType};
use iir_filters::sos::zpk2sos;
pub struct BandpassFilter {
#[allow(dead_code)]
filter: DirectForm2Transposed,
}
impl BandpassFilter {
/// Creates a new BandpassFilter with the given parameters.
///
/// # Arguments
/// * `order` - The order of the filter.
/// * `tone_freq` - The center freq in Hz.
/// * `bandwidth` - The filter bandwidth in Hz.
/// * `sample_rate` - The sampling frequency in Hz.
#[allow(dead_code)]
pub fn new(
order: usize,
tone_freq: f64,
bandwidth: f64,
sample_rate: f64,
) -> Result<Self, Box<dyn std::error::Error>> {
let cutoff_low = tone_freq - bandwidth / 2.0;
let cutoff_high = tone_freq + bandwidth / 2.0;
let zpk = butter(
order as u32,
FilterType::BandPass(cutoff_low, cutoff_high),
sample_rate,
)?;
let sos = zpk2sos(&zpk, None)?;
let filter = DirectForm2Transposed::new(&sos);
Ok(Self { filter })
}
/// Applies the bandpass filter to an input signal.
///
/// # Arguments
/// * `input` - A slice of input signal samples.
///
/// # Returns
/// A `Vec<f64>` containing the filtered signal.
#[allow(dead_code)]
pub fn apply(&mut self, input: &[f64]) -> Vec<f64> {
input.iter().map(|&x| self.filter.filter(x)).collect()
}
}