use num_traits::{MulAdd, Num};
use crate::{AlignedArray, Ring};
#[derive(Clone, Copy)]
pub struct SisoFirFilter<const ORDER: usize, T: Num + Copy + MulAdd<Output = T>> {
y: T,
x: Ring<T, ORDER>,
taps: AlignedArray<T, ORDER>,
}
impl<const ORDER: usize, T: Num + Copy + MulAdd<Output = T>> SisoFirFilter<ORDER, T> {
#[inline]
pub fn update(&mut self, u: T) -> T {
self.x.push(u);
self.y = self.taps.dot(&self.x, T::zero());
self.y
}
pub fn new(taps: &[T]) -> Self {
let mut taps_ = [T::zero(); ORDER];
taps_.copy_from_slice(taps);
Self {
y: T::zero(),
x: Ring::new(T::zero()),
taps: AlignedArray(taps_),
}
}
pub fn initialize(&mut self, u: T) {
self.x = Ring::new(u);
self.update(u);
}
pub fn taps(&self) -> &[T; ORDER] {
&self.taps.0
}
pub fn y(&self) -> T {
self.y
}
pub fn x(&self) -> &Ring<T, ORDER> {
&self.x
}
}