Implement silence detection and „standby“ mode

This commit is contained in:
Thomas Kolb 2021-06-27 22:01:15 +02:00
parent fc43035f9b
commit 347a95ea8d
3 changed files with 24 additions and 0 deletions

View file

@ -16,3 +16,6 @@ pub const UDP_SERVER_ADDR: &str = "192.168.23.118:2703";
pub const FPS_ANIMATION: f32 = SAMP_RATE / SAMPLES_PER_UPDATE as f32; pub const FPS_ANIMATION: f32 = SAMP_RATE / SAMPLES_PER_UPDATE as f32;
pub const FPS_LEDS: f32 = 60.0; pub const FPS_LEDS: f32 = 60.0;
// “standby mode” configuration
pub const STANDBY_MAX_SILENT_SAMPLES: usize = SAMP_RATE as usize;

View file

@ -65,6 +65,9 @@ fn main()
// array for samples directly read from stream // array for samples directly read from stream
let mut samples: VecDeque<i16> = VecDeque::with_capacity(config::BLOCK_LEN); let mut samples: VecDeque<i16> = VecDeque::with_capacity(config::BLOCK_LEN);
// counts silent (zero-valued) samples
let mut silent_samples: usize = 0;
// main loop // main loop
loop { loop {
@ -98,6 +101,19 @@ fn main()
{ {
let mut s = sigproc.borrow_mut(); let mut s = sigproc.borrow_mut();
s.import_i16_mono_from_iter(samples.iter()).unwrap(); s.import_i16_mono_from_iter(samples.iter()).unwrap();
if s.is_silent() {
silent_samples += config::BLOCK_LEN;
if silent_samples >= config::STANDBY_MAX_SILENT_SAMPLES {
// too many silent samples in a row: stop any signal processing until something
// else occurs at the input again
continue;
}
} else {
silent_samples = 0;
}
s.update_fft().unwrap(); s.update_fft().unwrap();
} }

View file

@ -104,6 +104,11 @@ impl SignalProcessing
Ok(()) Ok(())
} }
pub fn is_silent(&self) -> bool
{
return self.fft_input.iter().sum::<f32>() == 0.0;
}
pub fn update_fft(&mut self) -> fftw::error::Result<()> pub fn update_fft(&mut self) -> fftw::error::Result<()>
{ {
self.fft_plan.r2c(&mut self.fft_input, &mut self.fft_output)?; self.fft_plan.r2c(&mut self.fft_input, &mut self.fft_output)?;