use micromath::F32Ext;
pub trait F32ArrayExt {
fn peak_level(&self) -> f32;
fn peak_level_db(&self) -> f32;
fn rms_level(&self) -> f32;
fn rms_level_db(&self) -> f32;
}
impl F32ArrayExt for [f32] {
fn peak_level(&self) -> f32 {
if self.len() == 0 {
return 0.0;
};
let mut max: f32 = 0.0;
for sample in self.iter() {
let value = F32Ext::abs(*sample);
if value > max {
max = value
}
}
max
}
fn peak_level_db(&self) -> f32 {
20. * F32Ext::log10(self.peak_level())
}
fn rms_level(&self) -> f32 {
if self.len() == 0 {
return 0.0;
};
let mut rms: f32 = 0.;
for sample in self.iter() {
rms += sample * sample
}
F32Ext::sqrt(rms / (self.len() as f32))
}
fn rms_level_db(&self) -> f32 {
20. * F32Ext::log10(self.rms_level())
}
}
#[cfg(test)]
mod tests {
use super::F32ArrayExt;
#[test]
fn test_empty_window() {
let window: [f32; 0] = [];
assert!(window.rms_level() == 0.0);
assert!(window.peak_level() == 0.0);
}
}