#![allow(non_snake_case)]
use enum_dispatch::enum_dispatch;
use std::fmt::Debug;
use crate::StrictlyPositive;
use super::config::*;
use serde::{Deserialize, Serialize};
mod adaptablefir;
mod biquad;
mod biquadbank;
mod butter;
mod dummy;
mod eq;
mod error;
mod fir;
mod octave;
mod seriesbiquad;
mod zpkmodel;
type Result<T> = std::result::Result<T, FilterError>;
pub use adaptablefir::AdaptableFIR;
pub use biquad::Biquad;
pub use biquadbank::BiquadBank;
pub use dummy::DummyFilter;
pub use eq::*;
pub use error::*;
pub use fir::FIR;
pub use octave::{FREQ_REF, G, StandardFilterDescriptor};
pub use seriesbiquad::SeriesBiquad;
pub use zpkmodel::{FilterSpec, PoleOrZero, ZPKModel};
#[enum_dispatch]
pub trait FilterMethods {
fn filter(&mut self, input: &[Flt], output: &mut [Flt]);
fn reset(&mut self);
fn filter_iter<'a>(
&mut self,
input: impl Iterator<Item = &'a Flt>,
output: impl Iterator<Item = &'a mut Flt>,
) {
let itmp = input.copied().collect::<Vec<_>>();
let mut otmp = vec![0.; itmp.len()];
self.filter(&itmp, &mut otmp);
for (o, v) in output.zip(otmp) {
*o = v;
}
}
}
#[enum_dispatch(FilterMethods)]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum Filter {
Biquad(Biquad),
SeriesBiquad(SeriesBiquad),
Dummy(DummyFilter),
BiquadBank(BiquadBank),
}
pub trait TransferFunction<'a, T>: Send
where
T: AsArray<'a, Flt>,
{
fn tf(&self, fs: StrictlyPositive, freq: T) -> Ccol;
}