use crate::matrix::FrameIter;
pub fn zero_crossing_rate(
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;
let first = y.first().copied().unwrap_or(0.0);
let last = y.last().copied().unwrap_or(0.0);
padded = std::iter::repeat_n(first, pad)
.chain(y.iter().copied())
.chain(std::iter::repeat_n(last, pad))
.collect();
&padded
} else {
y
};
let frames = FrameIter::new(signal, frame_length, hop_length);
frames
.map(|frame| {
let crossings = crate::audio::zero_crossings(frame, 1e-10, false, true);
let count = crossings.iter().filter(|&&c| c).count();
count as f64 / frame.len() as f64
})
.collect()
}