35 lines
746 B
Rust
35 lines
746 B
Rust
use std::collections::VecDeque;
|
|
|
|
use rand::seq::index::sample;
|
|
|
|
use crate::complex::Complex32;
|
|
|
|
pub struct Squelch {
|
|
window: VecDeque<f32>,
|
|
sum: f32,
|
|
level: f32,
|
|
}
|
|
|
|
impl Squelch {
|
|
pub fn new(length: usize, level: f32) -> Self {
|
|
Squelch {
|
|
window: VecDeque::from(vec![0.; length]),
|
|
sum: 0.,
|
|
level,
|
|
}
|
|
}
|
|
|
|
pub fn next(&mut self, sample: Complex32) -> Option<Complex32> {
|
|
let oldest = self.window.pop_back().unwrap();
|
|
self.window.push_front(sample.mag());
|
|
self.sum -= oldest;
|
|
self.sum += sample.mag();
|
|
|
|
if self.sum / (self.window.len() as f32) > self.level {
|
|
Some(sample)
|
|
} else {
|
|
None
|
|
}
|
|
}
|
|
}
|