use super::{Cf64, Stage};
#[derive(Clone, Copy, Debug, PartialEq)]
pub struct PulseBlanker {
pub threshold: f64,
pub hold: usize,
remaining: usize,
blanked: u64,
seen: u64,
}
impl PulseBlanker {
pub fn new(threshold: f64, hold: usize) -> Self {
assert!(threshold >= 0.0, "threshold must be non-negative");
Self {
threshold,
hold,
remaining: 0,
blanked: 0,
seen: 0,
}
}
pub fn blanked(&self) -> u64 {
self.blanked
}
pub fn blanking_duty(&self) -> f64 {
if self.seen == 0 {
0.0
} else {
self.blanked as f64 / self.seen as f64
}
}
}
impl Stage for PulseBlanker {
fn process(&mut self, block: &mut [Cf64]) {
for x in block.iter_mut() {
self.seen += 1;
if x.abs() > self.threshold {
self.remaining = self.hold + 1;
}
if self.remaining > 0 {
*x = Cf64::default();
self.remaining -= 1;
self.blanked += 1;
}
}
}
}