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)
