diff --git a/src/lib.rs b/src/lib.rs index 7e91122c3100d949a40d3508983b09b2fb37d237..5afbd2932bf1b9fa70dca7f7753391f6386d153b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -7,7 +7,7 @@ use std::f32::consts::PI; #[derive(Clone, Copy)] pub struct Parameters { // Parameters we're working with - window_size: u32, + window_size: usize, // Precomputed value: sine: f32, cosine: f32, @@ -16,13 +16,13 @@ pub struct Parameters { pub struct Partial { params: Parameters, - //count: u32, + count: usize, prev: f32, prevprev: f32, } impl Parameters { - pub fn new(target_freq: f32, sample_rate: f32, window_size: u32) -> Self { + pub fn new(target_freq: f32, sample_rate: f32, window_size: usize) -> Self { let k = target_freq * (window_size as f32) / sample_rate; let omega = (f32::consts::PI * 2. * k) / (window_size as f32); let cosine = omega.cos(); @@ -35,7 +35,7 @@ impl Parameters { } pub fn start(self) -> Partial { - Partial{ params: self, prev: 0., prevprev: 0. } + Partial{ params: self, count: 0, prev: 0., prevprev: 0. } } } @@ -46,9 +46,11 @@ impl Partial { self.prevprev = self.prev; self.prev = this; } + self.count += samples.len(); self } pub fn finish(self) -> (f32, f32) { + assert_eq!(self.count, self.params.window_size); let real = self.prev - self.prevprev * self.params.cosine; let imag = self.prevprev * self.params.sine; (real, imag) @@ -72,9 +74,6 @@ fn sine() { let mut buf = [0; 8000]; for &freq in [697., 1200., 1800., 1633.].iter() { // Generate a 1 second sine wave at freq hz - // Using 8khz sample rate: Generate 8k samples, - // map them into our second (zero to one): - let step = 1. / 8000.; for sample in (0 .. 8000) { let time = sample as f32 * step; @@ -82,10 +81,10 @@ fn sine() { } let p = Parameters::new(freq, 8000., 8000); - let mag = p.start().add(&buf[0..256]).finish_mag(); + let mag = p.start().add(&buf[..]).finish_mag(); for testfreq in (0 .. 30).map(|x| (x * 100) as f32) { let p = Parameters::new(testfreq, 8000., 8000); - let testmag = p.start().add(&buf[0..256]).finish_mag(); + let testmag = p.start().add(&buf[..]).finish_mag(); println!("{:4}: {:12.3}", testfreq, testmag); if (freq-testfreq).abs() > 100. { println!("{} > 10*{}", mag, testmag);