use super::Tag;
use num_complex::Complex;
pub struct ScatterPLL {
n_phases: usize,
last_symbol: usize,
sample_idx: usize,
}
impl ScatterPLL {
pub fn new(n_phases: usize) -> Self {
Self {
n_phases,
last_symbol: 0,
sample_idx: 0,
}
}
pub fn receive_scatter(
&mut self,
data: &[Complex<f32>],
tag: &mut Tag,
) -> Vec<Vec<Complex<f32>>> {
let mut outputs = vec![Vec::new(); self.n_phases];
let mut levels = vec![0.0f32; self.n_phases];
let mut idxs = vec![0usize; self.n_phases];
for &sample in data.iter() {
outputs[self.last_symbol].push(sample);
levels[self.last_symbol] += sample.norm_sqr();
idxs[self.last_symbol] = self.sample_idx;
self.last_symbol = (self.last_symbol + 1) % self.n_phases;
self.sample_idx += 1;
}
for i in 0..self.n_phases {
if !outputs[i].is_empty() {
tag.sample_idx = idxs[i];
tag.sample_lvl = levels[i] / outputs[i].len() as f32;
}
}
outputs
}
}