1use super::Complex;
2use core::num::Wrapping;
3use dsp_fixedpoint::Q32;
4use dsp_process::SplitProcess;
5
6#[derive(Copy, Clone, Default, Debug, serde::Serialize, serde::Deserialize)]
10pub struct Lockin<C>(
11 pub C,
13);
14
15impl<C: SplitProcess<i32, i32, S>, S> SplitProcess<(i32, Complex<Q32<31>>), Complex<i32>, [S; 2]>
17 for Lockin<C>
18{
19 fn process(&self, state: &mut [S; 2], x: (i32, Complex<Q32<31>>)) -> Complex<i32> {
21 Complex::new(
22 self.0.process(&mut state[0], x.0 * x.1.re()),
23 self.0.process(&mut state[1], x.0 * x.1.im()),
24 )
25 }
26}
27
28impl<C: SplitProcess<i32, i32, S>, S> SplitProcess<(i32, Wrapping<i32>), Complex<i32>, [S; 2]>
30 for Lockin<C>
31{
32 fn process(&self, state: &mut [S; 2], x: (i32, Wrapping<i32>)) -> Complex<i32> {
34 self.process(state, (x.0, Complex::from_angle(x.1)))
36 }
37}