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.2.tar.gz (53.6 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.2-cp312-cp312-win_amd64.whl (197.1 kB view details)

Uploaded CPython 3.12Windows x86-64

brucezilany-0.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (458.8 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

brucezilany-0.0.2-cp311-cp311-win_amd64.whl (195.3 kB view details)

Uploaded CPython 3.11Windows x86-64

brucezilany-0.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (459.1 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

brucezilany-0.0.2-cp310-cp310-win_amd64.whl (194.4 kB view details)

Uploaded CPython 3.10Windows x86-64

brucezilany-0.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (458.4 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

brucezilany-0.0.2-cp39-cp39-win_amd64.whl (201.2 kB view details)

Uploaded CPython 3.9Windows x86-64

brucezilany-0.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (458.6 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

File details

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

File metadata

  • Download URL: brucezilany-0.0.2.tar.gz
  • Upload date:
  • Size: 53.6 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.2.tar.gz
Algorithm Hash digest
SHA256 71a7009e2f3a52bc91611933cf851cb0e6be117c11b21dd80530bcc635b79b22
MD5 7b6b36a2179660013abf5073a48f9362
BLAKE2b-256 bf29c19c4f217236770a5978a97601e5c705e3969d8f8ed0742bf34dfcf683a7

See more details on using hashes here.

Provenance

The following attestation bundles were made for brucezilany-0.0.2.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.2-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: brucezilany-0.0.2-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 197.1 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.2-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 ae14813c4c92d3c1a2a1ac90affea1a0ebb56ddc0e7ec554569dda4796b9a213
MD5 6ceb4f46d5815663aef37f73a10fad75
BLAKE2b-256 d9786194560c9a2ab77b19c27265eb500c5fa5131a0d52752af8f03f9d4fbac5

See more details on using hashes here.

Provenance

The following attestation bundles were made for brucezilany-0.0.2-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.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for brucezilany-0.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9b28a39e2562319d2b46bb1c4b80010656ed0afe869403693753ad922d335566
MD5 da85ad60e9d7589b32f7bd015587650a
BLAKE2b-256 dbeeece1f4e58d70094261f288de3f64200ab16d2dc7dbbf13ca0e3974512462

See more details on using hashes here.

Provenance

The following attestation bundles were made for brucezilany-0.0.2-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.2-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: brucezilany-0.0.2-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 195.3 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.2-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 daf993cf7fa926d1902866a140ccf9b9afb765900c68d7ae082ce661c8388cde
MD5 79b5d0bf497a7f7b16fe06a1bb82868f
BLAKE2b-256 69d349da29f29a49682ab71df11b8c751016e4cc69efd4628a472326900172d3

See more details on using hashes here.

Provenance

The following attestation bundles were made for brucezilany-0.0.2-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.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for brucezilany-0.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 6807dfc895b55099f57f7ef7d26eee72ce63e17100a38d88c275d93e01354dfa
MD5 4d4c0f315f3f9152846f14c38d6ea53f
BLAKE2b-256 4e2c1592906c72985085495f9c6a3fe50177ba2a79a7addc0e31fd83bb96709a

See more details on using hashes here.

Provenance

The following attestation bundles were made for brucezilany-0.0.2-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.2-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: brucezilany-0.0.2-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 194.4 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.2-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 4fec9885b1e286026e7a4760b633d1592683a38eb972aa9ad3b62c66c6fbf347
MD5 4904ad35206ef168347844fb6ae77c46
BLAKE2b-256 16eef7995d0731fca7d2ed3743b8d67a47e4fe0b928cf056f0414cc8763b0a09

See more details on using hashes here.

Provenance

The following attestation bundles were made for brucezilany-0.0.2-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.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for brucezilany-0.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c4487983ba047b004bbf28d5fcbd0646aa02551ebb288e3a6e290ad8d1f3b018
MD5 64c895d711695b380ee06a86ba6150fc
BLAKE2b-256 46e2c92ba781b568ce35b48c3cf45f5b064d1af498cbd126d2d582c8db413db3

See more details on using hashes here.

Provenance

The following attestation bundles were made for brucezilany-0.0.2-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.2-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: brucezilany-0.0.2-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 201.2 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.2-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 5476600e857f102da6abc2cad01771db0340dd7a417f96565f9f7cf584df06fb
MD5 6180a765133b41ae402543b1d272309c
BLAKE2b-256 4e6539aace56c5db4de25c41fddc45f410f7afb1809e4cf9324017e8acaad6e9

See more details on using hashes here.

Provenance

The following attestation bundles were made for brucezilany-0.0.2-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.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for brucezilany-0.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 80aaffe1454f24d976deabcf9611d040248c50652174f0ed12f12533dbdd6fc5
MD5 6bec450761c4baad352349836f57cae4
BLAKE2b-256 38ec3c5db0c30640dda0f9cc4942c155faced92fb083415f24641615f2da81e2

See more details on using hashes here.

Provenance

The following attestation bundles were made for brucezilany-0.0.2-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