model of DCN pyramidal neuron
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

98 lines
2.7 KiB

import numpy as np
from cnmodel.util import sound
def test_conversions():
pa = np.array([3990.5, 20, 0.3639, 2e-5])
db = np.array([166, 120, 85.2, 0])
assert np.allclose(sound.pa_to_dbspl(pa), db, atol=0.1, rtol=0.002)
assert np.allclose(sound.dbspl_to_pa(db), pa, atol=0.1, rtol=0.002)
def test_tonepip():
rate = 100000
dur = 0.1
ps = 0.01
rd = 0.02
pd = 0.08
db = 60
s1 = sound.TonePip(
rate=rate,
duration=dur,
f0=5321,
dbspl=db,
pip_duration=pd,
pip_start=[ps],
ramp_duration=rd,
)
# test array sizes
assert s1.sound.size == s1.time.size == int(dur * rate) + 1
# test for consistency
assert np.allclose(
[s1.sound.min(), s1.sound.mean(), s1.sound.max()],
[-0.028284253158247834, -1.0954891976168953e-10, 0.028284270354167296],
)
# test that we got the requested amplitude
assert np.allclose(s1.measure_dbspl(ps + rd, ps + pd - rd), db, atol=0.1, rtol=0.01)
# test for quiet before and after pip
assert np.all(s1.sound[: int(ps * rate) - 1] == 0)
assert np.all(s1.sound[int((ps + pd) * rate) + 1 :] == 0)
# test the sound can be recreated from its key
key = s1.key()
s2 = sound.create(**key)
assert np.all(s1.time == s2.time)
assert np.all(s1.sound == s2.sound)
def test_noisepip():
rate = 100000
dur = 0.1
ps = 0.01
rd = 0.02
pd = 0.08
db = 60
s1 = sound.NoisePip(
rate=rate,
duration=dur,
seed=184724,
dbspl=db,
pip_duration=pd,
pip_start=[ps],
ramp_duration=rd,
)
# test array sizes
assert s1.sound.size == s1.time.size == int(dur * rate) + 1
# test for consistency
assert np.allclose(
[s1.sound.min(), s1.sound.mean(), s1.sound.max()],
[-0.082260796003197786, -0.00018484322982972046, 0.069160217220832404],
)
# test that we got the requested amplitude
assert np.allclose(s1.measure_dbspl(ps + rd, ps + pd - rd), db, atol=0.1, rtol=0.01)
# test for quiet before and after pip
assert np.all(s1.sound[: int(ps * rate) - 1] == 0)
assert np.all(s1.sound[int((ps + pd) * rate) + 1 :] == 0)
# test the sound can be recreated from its key
key = s1.key()
s2 = sound.create(**key)
# also test new seed works, and does not affect other sounds
key["seed"] += 1
s3 = sound.create(**key)
s3.sound # generate here to advance rng before generating s2
assert np.all(s1.time == s2.time)
assert np.all(s1.sound == s2.sound)
start = int(ps * rate) + 1
end = int((ps + pd) * rate) - 1
assert not np.any(s1.sound[start:end] == s3.sound[start:end])