sofar 0.3.0

Pure Rust SOFA/HRTF reader and renderer
Documentation
use criterion::{Bencher, BenchmarkId, Criterion, criterion_group, criterion_main};
use sofar::{filter::Filter, render::Renderer};

use rand::Rng;

fn bench_renderer(b: &mut Bencher, blocks: usize, block_len: usize, filt_len: usize) {
    let mut filt = Filter::new(filt_len);

    rand::rng().fill(&mut *filt.left);
    rand::rng().fill(&mut *filt.right);

    let mut input = vec![0.0; blocks * block_len];
    let mut left = vec![0.0; blocks * block_len];
    let mut right = vec![0.0; blocks * block_len];

    rand::rng().fill(input.as_mut_slice());

    let mut renderer = Renderer::builder(filt_len)
        .with_partition_len(block_len)
        .build()
        .unwrap();

    renderer.set_filter(&filt).unwrap();

    b.iter(|| renderer.process_block(&input, &mut left, &mut right));
}

fn bench_filter_len(c: &mut Criterion) {
    let mut group = c.benchmark_group("Filter Lengths");
    for i in [8, 16, 32, 64, 128, 256, 1024, 4096, 65536].iter() {
        group.bench_with_input(BenchmarkId::new("length", i), i, |b, i| {
            bench_renderer(b, 1, 1024, *i)
        });
    }
    group.finish();
}

fn bench_block_len(c: &mut Criterion) {
    let mut group = c.benchmark_group("Block Lengths");
    for i in [8, 16, 32, 64, 128, 256, 1024, 4096, 65536].iter() {
        group.bench_with_input(BenchmarkId::new("length", i), i, |b, i| {
            bench_renderer(b, 1, *i, 1024)
        });
    }
    group.finish();
}

criterion_group!(benches, bench_block_len, bench_filter_len);
criterion_main!(benches);