From da50c0294696c3a327db4b2a0a089d7977df488e Mon Sep 17 00:00:00 2001 From: Justin Worthe Date: Tue, 26 Dec 2017 17:00:03 +0200 Subject: Refactored to use more extensive typing --- src/signal.rs | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 src/signal.rs (limited to 'src/signal.rs') diff --git a/src/signal.rs b/src/signal.rs new file mode 100644 index 0000000..ce1dd78 --- /dev/null +++ b/src/signal.rs @@ -0,0 +1,48 @@ +#[derive(Debug, Clone)] +pub struct Signal { + pub samples: Vec, + pub sample_rate: f32 +} + +impl Signal { + pub fn empty() -> Signal { + Signal::default() + } + + pub fn new(samples: &[f32], sample_rate: f32) -> Signal { + Signal { + samples: Signal::remove_mean_offset(samples), + sample_rate: sample_rate + } + } + + fn remove_mean_offset(samples: &[f32]) -> Vec { + let mean = samples.iter().sum::()/samples.len() as f32; + samples.iter().map(|x| x - mean).collect() + } + + pub fn aligned_to_rising_edge(&self) -> &[f32] { + let rising_edge = self.samples + .iter() + .enumerate() + .skip_while(|&(_,x)| !x.is_sign_negative()) + .skip_while(|&(_,x)| x.is_sign_negative()) + .map(|(i,_)| i) + .next().unwrap_or(0); + &self.samples[rising_edge..] + } + + pub fn is_silence(&self) -> bool { + self.samples.iter().all(|&x| x.abs() < 0.05) + } + +} + +impl Default for Signal { + fn default() -> Signal { + Signal { + samples: Vec::new(), + sample_rate: 44100.0 + } + } +} -- cgit v1.2.3