use dsp_process::Process;
#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd)]
pub struct Dsm<const K: usize> {
a: [u32; K],
c: [i8; K],
}
impl<const K: usize> Default for Dsm<K> {
fn default() -> Self {
Self {
a: [0; K],
c: [0; K],
}
}
}
impl<const K: usize> Process<u32, i8> for Dsm<K> {
fn process(&mut self, x: u32) -> i8 {
let mut d = 0i8;
let mut c = false;
self.a.iter_mut().fold(x, |x, a| {
(*a, c) = a.overflowing_add(x);
d = (d << 1) | c as i8;
*a
});
self.c.iter_mut().take(K - 1).fold(d & 1, |mut y, c| {
d >>= 1;
(y, *c) = ((d & 1) + y - *c, y);
y
})
}
}