rosa 0.1.0

Audio feature extraction library matching librosa output
Documentation
mod common;

use rosa::matrix::Matrix;

#[test]
fn test_stack_memory_matches_librosa() {
    let ref_data = common::load_audio_reference("stack_memory.json");

    let rows = ref_data["input_rows"].as_u64().unwrap() as usize;
    let cols = ref_data["input_cols"].as_u64().unwrap() as usize;
    let input_flat: Vec<f64> = serde_json::from_value(ref_data["input"].clone()).unwrap();
    let input = Matrix::from_vec(input_flat, rows, cols);

    let n_steps = ref_data["n_steps"].as_u64().unwrap() as usize;
    let delay = ref_data["delay"].as_u64().unwrap() as usize;

    let expected_rows = ref_data["output_rows"].as_u64().unwrap() as usize;
    let expected_cols = ref_data["output_cols"].as_u64().unwrap() as usize;
    let expected: Vec<f64> = serde_json::from_value(ref_data["output"].clone()).unwrap();

    let result = rosa::matrix::stack_memory(&input, n_steps, delay);
    assert_eq!(
        result.shape(),
        (expected_rows, expected_cols),
        "stack_memory shape mismatch: got {:?}, expected ({}, {})",
        result.shape(),
        expected_rows,
        expected_cols
    );
    // stack_memory is pure integer indexing — should be exact
    common::assert_approx_eq(result.as_slice(), &expected, 1e-12, "stack_memory");
}