Skip to content
Snippets Groups Projects

use iterator for input

Merged Stephen D requested to merge iterator into master
2 files
+ 14
13
Compare changes
  • Side-by-side
  • Inline
Files
2
+ 13
12
@@ -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}");
Loading