rosa 0.1.0

Audio feature extraction library matching librosa output
Documentation
//! Root-mean-square energy matching `librosa.feature.rms`.

use crate::matrix::FrameIter;

/// Compute root-mean-square energy per frame.
///
/// Matches `librosa.feature.rms(y=y, frame_length, hop_length, center)`.
/// Uses the time-domain computation: `rms[t] = sqrt(mean(frame^2))`.
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()
}