Skip to main content

Python/C++ interface to the Bruce-Zilany-Carney auditory nerve model

Project description

Bruce-Zilany-Carney Auditory Nerve Model (Python Interface)

This repository provides a modern Python interface to the auditory periphery model developed by the Bruce, Zilany, and Carney labs. The model simulates spike train responses in auditory nerve fibers with detailed physiological realism.

It is implemented in C++ with pybind11. All dependencies on Matlab have been removed, making it fully standalone and suitable for Python-based environments. In general, the library should have feature-parity with the original source, but the code should be considerably faster to execute.


🧠 Model Background

This code is based on:

  • Bruce, I. C., Erfani, Y., & Zilany, M. S. A. (2018)
    A phenomenological model of the synapse between the inner hair cell and auditory nerve: Implications of limited neurotransmitter release sites.
    Hearing Research, 360:40–54.

  • Bruce, I., Buller, A., & Zilany, M. (2023)
    Modeling of auditory nerve fiber input/output functions near threshold.
    Acoustics 2023, Sydney, Australia.

📢 Please cite both of the above if you publish research using this model or a modified version.


🚀 Getting Started

1. Install prerequisites

You need a working C++14 compiler and Python 3.9+. Use a virtual environment if needed.

2. Clone and install

git clone https://github.com/jacobdenobel/brucezilany.git
cd brucezilany
pip install .

For development mode:

pip install -e .

Install from PyPi

Alternatively, you can also install the package from pip, if you want to include it as dependency.

pip install brucezilany

🧪 Example Usage

import numpy as np
from brucezilany import inner_hair_cell, synapse, stimulus, map_to_synapse

# Generate a stimulus
stim = stimulus.ramped_sine_wave(
    duration=0.05,
    simulation_duration=0.1,
    sampling_rate=100000,
    rt=0.005,
    delay=0.01,
    f0=1000,
    db=65
)

# IHC response
ihc_output = inner_hair_cell(stim, cf=1000, n_rep=10)

# Intermediate mapper. In the orginal Matlab, this was part of the synapse function. 
# Here, it is separate, and needs to be called before synapse.
mapped_ihc = map_to_synapse(
    ihc_output=ihc_output,
    spontaneous_firing_rate=100,
    characteristic_frequency=1000,
    time_resolution=stim.time_resolution,
)

# Synapse response
out = synapse(
    amplitude_ihc=mapped_ihc,
    cf=1000,
    n_rep=10,
    n_timesteps=stim.n_simulation_timesteps,
    spontaneous_firing_rate=100
)

print("Mean firing rate:", np.mean(out.mean_firing_rate))

See examples/ for more. These contain Python translations of the Matlab test files contained in the original source.


⚙️ Model Components

inner_hair_cell

Simulates the receptor potential of an inner hair cell (IHC) in response to acoustic stimuli. Includes cochlear filtering and nonlinear transduction.

Args:

  • stimulus: Stimulus object
  • cf: characteristic frequency (Hz)
  • n_rep: number of stimulus repetitions
  • cohc: normal ohc function (float)
  • cihc: normal ihc function (float)
  • species: Species enum

Returns:

  • IHC output as a vector (float)

map_to_synapse

In the original Matlab source, this was included in the synapse function. However, since you sometimes want to call synapse for a number of trails, see for example test_adaptive_redocking.py, you don't always need to recompute this function. Therefore, in this code, it is separate, and you call this outside of calling synapse. The function applies a mapping function to the output of inner_hair_cell, by default a SOFTPLUS function.

Args:

  • ihc_output: array of floats
  • spontaneous_firing_rate: spontaneous firing rate of the fiber
  • characteristic_frequency: characteristic frequency
  • time_resolution: 1 / sampling rate
  • mapping_function: SynapseMapping enum

Returns:

  • mapped IHC output as a vector (float)

synapse

Simulates stochastic spike generation at the IHC-ANF synapse, using a 4-site vesicle model with adaptive redocking and realistic refractory behavior. Note that you can provide an optional seeded RNG. This is important, because otherwise this model will produce a deterministic output. Alternatively, calling brucezilany.set_seed(<int>) before calling synapse, also make this function behave randomly. Again, see test_adaptive_redocking.py for an example.

Args:

  • amplitude_ihc: IHC potential vector
  • cf: characteristic frequency (Hz)
  • n_rep: number of stimulus repetitions
  • n_timesteps: number of stimulus time steps
  • time_resolution: 1 / sampling rate
  • spontaneous_firing_rate: in spikes/s
  • noise: random noise mode (NoiseType)
  • pla_impl: power-law adaptation method (PowerLaw)
  • spontaneous_firing_rate: spontaneous firing rate of the fiber
  • abs_refractory_period: absolute refractory period
  • rel_refractory_period: relative refractory period
  • rng: optional seeded RNG

Returns:

  • SynapseOutput object with PSTH, spike times, and statistics

🎧 Stimulus Handling

The brucezilany.stimulus module provides tools for generating and loading stimuli with precise control over sampling rate, duration, delay, and amplitude. This ensures accurate modeling of auditory nerve responses to various acoustic signals.

📦 Stimulus Class

Stimuli are represented as Stimulus objects that encapsulate both the waveform and simulation parameters.

from brucezilany import stimulus

# Create a sine wave burst with a ramped onset/offset
stim = stimulus.ramped_sine_wave(
    duration=0.05,              # duration of tone burst (s)
    simulation_duration=0.1,    # total simulation time (s)
    sampling_rate=100_000,      # sampling rate (Hz)
    rt=2.5e-3,                  # rise/fall time (s)
    delay=25e-3,                # delay before tone onset (s)
    f0=5000,                    # frequency (Hz)
    db=60.0                     # SPL (dB)
)

You can inspect:

print("Stimulus duration:", stim.stimulus_duration)
print("Sampling rate:", stim.sampling_rate)
print("Samples:", stim.data.shape)

📂 Load from File

You can also load .wav files (e.g., speech or natural sounds):

stim = stimulus.from_file("data/defineit.wav", verbose=False)

By default, this:

  • Resamples to 100 kHz
  • Normalizes to 65 dB SPL
  • Pads with silence to match a simulation time of 1s

📐 Normalization

If you want to adjust the dB level of a stimulus manually:

stimulus.normalize_db(stim, stim_db=70)

🧰 Additional Tools

Neurogram class

Multi-threaded simulation manager for full neurograms across CFs and fiber types.

from brucezilany import Neurogram

ng = Neurogram(n_cf=50, n_low=5, n_med=5, n_high=10)
ng.create(sound_wave=stim, species=Species.HUMAN_SHERA, n_trials=3)

output = ng.get_output()  # 3D array: [fiber, trial, time]

🛠 Refactoring & Enhancements

Compared to the original code, the following major changes were made:

  • All Matlab dependencies removed

    • C++ replacements for resample, randn, etc.
    • Fully standalone backend
  • Modern C++14 style

    • No new/delete, safer memory via STL containers
    • Cleaner APIs and encapsulation
  • Modular structure

    • Split between IHC, map_to_synapse, synapse
  • Python bindings via pybind11

    • Fully exposed enums, structured output objects
  • Multi-threading support

    • Neurogram uses parallel processing for simulating many CF/fiber combinations

The original Matlab code can be found here. A reference to the code use to build this repository is included as a .zip file in the data/ folder.


🧠 References

Additional foundational papers:

  • Zilany, M. S. A., Bruce, I. C., & Carney, L. H. (2014). Updated parameters and expanded simulation options for a model of the auditory periphery. JASA, 135(1):283–286.

  • Zilany, M. S. A., Bruce, I. C., Nelson, P. C., & Carney, L. H. (2009). A phenomenological model of the synapse between the inner hair cell and auditory nerve: Long-term adaptation with power-law dynamics. JASA, 126(5):2390–2412.


📬 Contact

Questions or contributions? Open a GitHub issue or pull request.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

brucezilany-0.0.4.tar.gz (53.7 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

brucezilany-0.0.4-cp312-cp312-win_amd64.whl (197.5 kB view details)

Uploaded CPython 3.12Windows x86-64

brucezilany-0.0.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (459.1 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

brucezilany-0.0.4-cp311-cp311-win_amd64.whl (195.7 kB view details)

Uploaded CPython 3.11Windows x86-64

brucezilany-0.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (459.6 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

brucezilany-0.0.4-cp310-cp310-win_amd64.whl (194.8 kB view details)

Uploaded CPython 3.10Windows x86-64

brucezilany-0.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (459.0 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

brucezilany-0.0.4-cp39-cp39-win_amd64.whl (201.5 kB view details)

Uploaded CPython 3.9Windows x86-64

brucezilany-0.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (459.1 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

File details

Details for the file brucezilany-0.0.4.tar.gz.

File metadata

  • Download URL: brucezilany-0.0.4.tar.gz
  • Upload date:
  • Size: 53.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for brucezilany-0.0.4.tar.gz
Algorithm Hash digest
SHA256 1aa0c91e316548c7900ebc7bb660acf7db1ed235b201b6ab7eff12af573ce48c
MD5 b1770e067c56188dce1d5a63394703b4
BLAKE2b-256 9a33e1fcfd6f15a55ff259c79a4c4e1e4a89986cee2d1fd72c4d5dd043679127

See more details on using hashes here.

Provenance

The following attestation bundles were made for brucezilany-0.0.4.tar.gz:

Publisher: python-publish.yml on jacobdenobel/brucezilany

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file brucezilany-0.0.4-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: brucezilany-0.0.4-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 197.5 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for brucezilany-0.0.4-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 20f5ca4ac2162ee3c993f11678b2a1de05179520cde68e2952a99465bb1ccdd2
MD5 eb7eac8fcbcaf0d182316291494a7805
BLAKE2b-256 a13db235772e810bc2b36d4c33d13af2112c764acae69926b743613ebf541dff

See more details on using hashes here.

Provenance

The following attestation bundles were made for brucezilany-0.0.4-cp312-cp312-win_amd64.whl:

Publisher: python-publish.yml on jacobdenobel/brucezilany

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file brucezilany-0.0.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for brucezilany-0.0.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 55e27d9bcabcd0619a0d26fdabbed26f1b8f57b140fd7553f620b9a390c92a32
MD5 6f6a8ff052f4c0308cfc8ac8616e6abc
BLAKE2b-256 a629016c9ec8ce97477c788860ad14b9b7043d6e2695164ee13cfd0b9ffe31c6

See more details on using hashes here.

Provenance

The following attestation bundles were made for brucezilany-0.0.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: python-publish.yml on jacobdenobel/brucezilany

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file brucezilany-0.0.4-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: brucezilany-0.0.4-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 195.7 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for brucezilany-0.0.4-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 e7fc7a54f067e3097fc3f60ac39b84e49c993e337d2b6f64742cf31253709232
MD5 bfd1162236d5e03b17cda83a31d3cc80
BLAKE2b-256 995bff5c1ad1acb2ef8d7044008568f608fbcf15f180fd542d11cb2634ce7787

See more details on using hashes here.

Provenance

The following attestation bundles were made for brucezilany-0.0.4-cp311-cp311-win_amd64.whl:

Publisher: python-publish.yml on jacobdenobel/brucezilany

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file brucezilany-0.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for brucezilany-0.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1c9b9abdb36265ec4a3835389de781f26416f0f6a338a6ef120037b125211f6d
MD5 8acfb33e2c9864fa9767396cbb5410ef
BLAKE2b-256 f3d07fe8b6e9307f845be3e711fee709652fd9c81b41d4def2cd6a75e7278480

See more details on using hashes here.

Provenance

The following attestation bundles were made for brucezilany-0.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: python-publish.yml on jacobdenobel/brucezilany

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file brucezilany-0.0.4-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: brucezilany-0.0.4-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 194.8 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for brucezilany-0.0.4-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 5ddb9d191d7a4e3c55e5b37df332ae3446547727cb963b2f9ff9e977b564792d
MD5 936c30a9135a0792f209d328e3b5b214
BLAKE2b-256 56b9f9860405f659c9ca31adddb4a056cf4378403c08cee1407c67ed4ef4ac38

See more details on using hashes here.

Provenance

The following attestation bundles were made for brucezilany-0.0.4-cp310-cp310-win_amd64.whl:

Publisher: python-publish.yml on jacobdenobel/brucezilany

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file brucezilany-0.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for brucezilany-0.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 7e6f311b68c4c1dcbf6ab0b723a31274d85f813a63764530dae84837848f21c2
MD5 5e83434faba9c8855a14b0ddf9375bcf
BLAKE2b-256 ca02bb75ab79ed3371f02c93d23522e7647db5d1bb1ee9ac83c8cf901b3525d6

See more details on using hashes here.

Provenance

The following attestation bundles were made for brucezilany-0.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: python-publish.yml on jacobdenobel/brucezilany

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file brucezilany-0.0.4-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: brucezilany-0.0.4-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 201.5 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for brucezilany-0.0.4-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 5e8a9428b36e7509ca80aa74f91ba077c8e2485b7a2817c852962b48e9af60cc
MD5 18675a39eb6ebe2ff8fee08c05410d7d
BLAKE2b-256 2231bec32dc63d9adaf22af36320f917ace4ec5b098516edd7d9dace1d56c353

See more details on using hashes here.

Provenance

The following attestation bundles were made for brucezilany-0.0.4-cp39-cp39-win_amd64.whl:

Publisher: python-publish.yml on jacobdenobel/brucezilany

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file brucezilany-0.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for brucezilany-0.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 64247c6c4dab670f50e883bfecc029be2db632f425227b6a2d9445524ff8cbd1
MD5 c2b9cd09eba579ec3ac0899646772575
BLAKE2b-256 8c53dc04ddf893a0f49c7b0f3ba2872ca3800b6edb175e5aa7bfe3705a634e97

See more details on using hashes here.

Provenance

The following attestation bundles were made for brucezilany-0.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: python-publish.yml on jacobdenobel/brucezilany

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page