1use super::{Complex, ComplexExt, Filter, MulScaled};
2
3#[derive(Copy, Clone, Default)]
7pub struct Lockin<T> {
8 state: [T; 2],
9}
10
11impl<T: Filter> Lockin<T> {
12 pub fn update_iq(&mut self, sample: i32, lo: Complex<i32>, k: &T::Config) -> Complex<i32> {
14 let mix = lo.mul_scaled(sample);
15
16 Complex {
19 re: self.state[0].update(mix.re, k),
20 im: self.state[1].update(mix.im, k),
21 }
22 }
23
24 pub fn update(&mut self, sample: i32, phase: i32, k: &T::Config) -> Complex<i32> {
26 self.update_iq(sample, Complex::from_angle(phase), k)
28 }
29}