HomeMAL' // MANUFACTORUM
datacrypt
Localizer / tests / test_cues.py
tests/test_cues.py1.4 KB
import numpy as np

from localizer.audio_io import StereoIR
from localizer.config import GammatoneConfig
from localizer.cues import compute_cues, compute_itd
from localizer.gammatone import GammatoneFilterbank
from fixtures import synth_hrir, SAMPLE_RATE


def test_itd_sign_and_magnitude():
    # Right channel delayed by 25 samples => source on the left => positive ITD.
    left = np.zeros(512)
    left[100] = 1.0
    right = np.zeros(512)
    right[125] = 1.0
    itd, icc = compute_itd(left, right, SAMPLE_RATE)
    assert round(itd * SAMPLE_RATE) == 25
    assert icc > 0.99


def test_ild_sign():
    hrir = synth_hrir(45.0)  # left
    cues = compute_cues(hrir, gammatone_config=GammatoneConfig())
    assert cues.ild_broadband > 0  # left louder
    hrir_r = synth_hrir(-45.0)
    cues_r = compute_cues(hrir_r, gammatone_config=GammatoneConfig())
    assert cues_r.ild_broadband < 0


def test_spectrum_is_zero_mean():
    hrir = synth_hrir(20.0)
    cues = compute_cues(hrir, gammatone_config=GammatoneConfig())
    assert abs(np.mean(cues.spectrum_left)) < 1e-9
    assert abs(np.mean(cues.spectrum_right)) < 1e-9
    assert cues.ild_bands.size == 28


def test_shared_filterbank_matches_ad_hoc():
    fb = GammatoneFilterbank(GammatoneConfig(), SAMPLE_RATE)
    hrir = synth_hrir(10.0)
    a = compute_cues(hrir, filterbank=fb)
    b = compute_cues(hrir, gammatone_config=GammatoneConfig())
    assert np.allclose(a.ild_bands, b.ild_bands)