use crate::matrix::Matrix;
pub fn spectral_rolloff(s: &Matrix, freq: &[f64], roll_percent: f64) -> Vec<f64> {
assert_eq!(
s.rows(),
freq.len(),
"freq length {} != spectrogram rows {}",
freq.len(),
s.rows()
);
let n_frames = s.cols();
let n_bins = s.rows();
let mut result = Vec::with_capacity(n_frames);
for t in 0..n_frames {
let mut total = 0.0;
for k in 0..n_bins {
total += s.get(k, t);
}
let threshold = roll_percent * total;
let mut rolloff = f64::NAN;
let mut cumsum = 0.0;
for (k, &f) in freq.iter().enumerate().take(n_bins) {
cumsum += s.get(k, t);
if cumsum >= threshold {
rolloff = f;
break;
}
}
result.push(if rolloff.is_nan() { 0.0 } else { rolloff });
}
result
}