diff options
author | Justin Worthe <justin@worthe-it.co.za> | 2017-12-26 17:00:03 +0200 |
---|---|---|
committer | Justin Worthe <justin@worthe-it.co.za> | 2017-12-26 17:00:03 +0200 |
commit | da50c0294696c3a327db4b2a0a089d7977df488e (patch) | |
tree | 229f0acd9016f8911932ba059256b8cd7ff0c7f1 /src/signal.rs | |
parent | a26c2acc49a03b544d54a088b660618b5de9a64c (diff) |
Refactored to use more extensive typing
Diffstat (limited to 'src/signal.rs')
-rw-r--r-- | src/signal.rs | 48 |
1 files changed, 48 insertions, 0 deletions
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<f32>, + 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<f32> { + let mean = samples.iter().sum::<f32>()/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 + } + } +} |