use num_complex::Complex32 as C32;
use crate::core::{Block, WorkReport};
use crate::dsp::{FirLowpass};
#[allow(dead_code)]
#[derive(Debug, Clone)]
pub struct PmQuadratureDemod {
fs: f32, k: f32, post_lp: FirLowpass,
prev: C32, }
impl PmQuadratureDemod {
pub fn new(fs: f32, k: f32, audio_bw_hz: f32) -> Self {
let lp = FirLowpass::design(fs, audio_bw_hz, audio_bw_hz * 0.25);
Self {
fs,
k,
post_lp: lp,
prev: C32::new(1.0, 0.0),
}
}
}
impl Block for PmQuadratureDemod {
type In = C32;
type Out = f32;
fn process(&mut self, input: &[Self::In], output: &mut [Self::Out]) -> WorkReport {
let n = input.len().min(output.len());
if n == 0 {
return WorkReport { in_read: 0, out_written: 0 };
}
let mut prev = self.prev;
let mut ytmp = vec![0.0f32; n];
for i in 0..n {
let z = input[i];
let w = z * prev.conj();
let dphi = w.im.atan2(w.re); ytmp[i] = self.k * dphi;
prev = z;
}
self.prev = prev;
self.post_lp.process(&ytmp[..], &mut output[..n]);
WorkReport { in_read: n, out_written: n }
}
}