use crate::matrix::FrameIter;
pub fn rms(y: &[f64], frame_length: usize, hop_length: usize, center: bool) -> Vec<f64> {
let padded: Vec<f64>;
let signal = if center {
let pad = frame_length / 2;
padded = std::iter::repeat_n(0.0, pad)
.chain(y.iter().copied())
.chain(std::iter::repeat_n(0.0, pad))
.collect();
&padded
} else {
y
};
let frames = FrameIter::new(signal, frame_length, hop_length);
frames
.map(|frame| {
let mean_sq: f64 = frame.iter().map(|&s| s * s).sum::<f64>() / frame.len() as f64;
mean_sq.sqrt()
})
.collect()
}