summaryrefslogtreecommitdiff
path: root/src/signal.rs
diff options
context:
space:
mode:
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
+ }
+ }
+}