pub struct AutoCorrelation {
window_size: usize,
}
impl AutoCorrelation {
pub fn new(window_size: usize) -> AutoCorrelation {
AutoCorrelation {window_size}
}
pub fn process_buffer(&mut self, input_buffer: &[f32], output_buffer: &mut [f32]) {
let mu: f32 = input_buffer.iter().sum::<f32>() / input_buffer.len() as f32;
let max_offset = usize::min(input_buffer.len()-self.window_size, output_buffer.len());
for i in 0..max_offset {
output_buffer[i] = (0..self.window_size)
.map(|j| (input_buffer[j] - mu) * (input_buffer[j+i] - mu))
.sum::<f32>() / self.window_size as f32;
}
let s0 = output_buffer[0];
for i in 0..output_buffer.len() {
output_buffer[i] = output_buffer[i] / s0;
}
}
}
#[cfg(test)]
mod tests {
}