summaryrefslogtreecommitdiff
path: root/src/signal.rs
diff options
context:
space:
mode:
authorJustin Worthe <justin@worthe-it.co.za>2017-12-26 17:00:03 +0200
committerJustin Worthe <justin@worthe-it.co.za>2017-12-26 17:00:03 +0200
commitda50c0294696c3a327db4b2a0a089d7977df488e (patch)
tree229f0acd9016f8911932ba059256b8cd7ff0c7f1 /src/signal.rs
parenta26c2acc49a03b544d54a088b660618b5de9a64c (diff)
Refactored to use more extensive typing
Diffstat (limited to 'src/signal.rs')
-rw-r--r--src/signal.rs48
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
+ }
+ }
+}