use rusty_opus::SilkResampler;
fn measure(fs_in: i32) -> f64 {
let out_rate = 48000;
let mut r = SilkResampler::default();
r.init(fs_in, out_rate);
let in_khz = (fs_in / 1000) as usize;
let frame = in_khz * 20; let ratio = out_rate / fs_in;
let out_frame = frame * ratio as usize;
let mut out = vec![0i16; out_frame + 16];
for _ in 0..4 {
r.process(&mut out, &vec![0i16; frame], frame as i32);
}
let mut imp = vec![0i16; frame];
imp[0] = 10000;
r.process(&mut out, &imp, frame as i32);
let e: f64 = out[..out_frame].iter().map(|&x| (x as f64) * (x as f64)).sum();
let centroid: f64 = out[..out_frame]
.iter()
.enumerate()
.map(|(i, &x)| i as f64 * (x as f64) * (x as f64))
.sum::<f64>()
/ e.max(1.0);
centroid
}
fn main() {
for &fs in &[8000, 12000, 16000] {
let d = measure(fs);
println!("in {:5} Hz -> 48000: impulse-energy centroid @ {:.2} output samples", fs, d);
}
}
#[global_allocator]
static RUSTY_ALLOC: rusty_alloc_api::RustyAlloc = rusty_alloc_api::RustyAlloc;