diff --git a/Cargo.toml b/Cargo.toml index 517686c03bd342196fdd1558f9566329ea965432..88c3d98db3067e92f906fa2ce113582955f61095 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] edition = "2021" name = "goertzel-nostd" -version = "0.2.1" +version = "0.3.0" authors = ["Stephen D"] repository = "https://gitlab.scd31.com/stephen/goertzel-nostd" keywords = ["dsp", "goertzel", "fft", "fourier"] diff --git a/src/lib.rs b/src/lib.rs index dbf67cb02be808f39a910961af35aac9c6190c9f..ae0197bf926ba972fa44d89af4bf9920b05ff955 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,7 +4,7 @@ // allow std in tests #![cfg_attr(not(test), no_std)] -use core::f32::consts::PI; +use core::{borrow::Borrow, f32::consts::PI}; /// Set up parameters (and some precomputed values for those). #[derive(Clone, Copy)] @@ -46,23 +46,24 @@ impl Parameters { } } - pub fn mag(self, samples: &[f32]) -> f32 { + pub fn mag<V: Borrow<f32>, I: Iterator<Item = V>>(self, samples: I) -> f32 { self.start().add_samples(samples).finish_mag() } - pub fn mag_squared(self, samples: &[f32]) -> f32 { + pub fn mag_squared<V: Borrow<f32>, I: Iterator<Item = V>>(self, samples: I) -> f32 { self.start().add_samples(samples).finish_mag_squared() } } impl Partial { - pub fn add_samples(mut self, samples: &[f32]) -> Self { - for &sample in samples { - let this = self.params.term_coefficient * self.prev - self.prevprev + sample; + pub fn add_samples<V: Borrow<f32>, I: Iterator<Item = V>>(mut self, samples: I) -> Self { + for sample in samples { + let this = self.params.term_coefficient * self.prev - self.prevprev + sample.borrow(); self.prevprev = self.prev; self.prev = this; + self.count += 1; } - self.count += samples.len(); + self } pub fn finish(self) -> (f32, f32) { @@ -85,11 +86,11 @@ impl Partial { #[test] fn zero_data() { let p = Parameters::new(1800., 8000, 256); - assert!(p.start().add_samples(&[0.0; 256]).finish_mag() == 0.); + assert!(p.start().add_samples([0.0; 256].iter()).finish_mag() == 0.); assert!( p.start() - .add_samples(&[0.0; 128]) - .add_samples(&[0.0; 128]) + .add_samples([0.0; 128].iter()) + .add_samples([0.0; 128].iter()) .finish_mag() == 0. ); @@ -107,10 +108,10 @@ fn sine() { } let p = Parameters::new(freq, 8000, 8000); - let mag = p.start().add_samples(&buf[..]).finish_mag(); + let mag = p.start().add_samples(buf[..].iter()).finish_mag(); for testfreq in (0..30).map(|x| (x * 100) as f32) { let p = Parameters::new(testfreq, 8000, 8000); - let testmag = p.mag(&buf[..]); + let testmag = p.mag(&buf[..].iter()); println!("{testfreq:4}: {testmag:12.3}"); if (freq - testfreq).abs() > 100. { println!("{mag} > 10*{testmag}");