Human auditory periphery model: cochlea, IHC-AN, auditory brainstem responses (Verhulst et al 2018)

 Download zip file 
Help downloading and running models
The human auditory periphery model can simulate single-unit response of basilar-membrane vibration, IHC receptor potential, instantaneous AN/CN/IC firing rates, as well as population responses such as otoacoustic emissions, auditory brainstem responses. The neuron models (IHC, AN,CN,IC) can be run independently to relate their responses to electrophysiology, or be simulated as part of the human auditory periphery.
1 . Verhulst S, Altoè A, Vasilkov V (2018) Computational modeling of the human auditory periphery: Auditory-nerve responses, evoked potentials and hearing loss. Hear Res 360:55-75 [PubMed]
2 . Altoè A, Pulkki V, Verhulst S (2018) The effects of the activation of the inner-hair-cell basolateral K+ channels on auditory nerve responses. Hear Res 364:68-80 [PubMed]
3 . Altoè A, Pulkki V, Verhulst S (2014) Transmission line cochlear models: improved accuracy and efficiency. J Acoust Soc Am 136:EL302-8 [PubMed]
4 . Verhulst S, Dau T, Shera CA (2012) Nonlinear time-domain cochlear model for transient stimulation and human otoacoustic emission. J Acoust Soc Am 132:3842-8 [PubMed]
Model Information (Click on a link to find other models with that property)
Model Type:
Brain Region(s)/Organism:
Cell Type(s): Cochlea hair inner GLU cell; Cochlear nucleus bushy GLU cell; Auditory nerve; Brainstem neuron;
Gap Junctions:
Simulation Environment: Python; MATLAB;
Model Concept(s):
Implementer(s): Verhulst, Sarah [s.verhulst at]; Altoé, Alessandro ;
Search NeuronDB for information about:  Cochlear nucleus bushy GLU cell; Cochlea hair inner GLU cell;
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#define PI 3.14159265358979323846
typedef struct tridiag_matrix{
	double *a;
	double *b;
	double *c;
} Tridiag_M;

double interpl_4(double a,double b,double c,double d,double frac){
    double cminusb = c-b;
    return b*(1-frac)+c*frac;
double cubic_interpolate( float y0, float y1, float y2, float y3, float mu ) {
   double a0, a1, a2, a3, mu2;
   mu2 = mu*mu;
   a0 = y3 - y2 - y0 + y1; //p
   a1 = y0 - y1 - a0;
   a2 = y2 - y0;
   a3 = y1;
   return ( a0*mu*mu2 + a1*mu2 + a2*mu + a3 );
inline double cos_interpl(double a,double b,double frac){
    double mu2=(1-cos(frac*PI))/2;
    return a*(1-mu2)+b*mu2;

void solve_tridiagonal(Tridiag_M *t, double *r,double *x,int N) {
    int in;
    double *cprime=(double*) malloc(N*sizeof(double));
    cprime[0] = t->c[0] / t->b[0];
    x[0] = r[0] / t->b[0];
    /* loop from 1 to N - 1 inclusive */
    for (in = 1; in < N; in++) {
        double m = 1.0 / (t->b[in] - t->a[in] * cprime[in - 1]);
        cprime[in] = t->c[in] * m;
        x[in] = (r[in] - t->a[in] * x[in - 1]) * m;
    /* loop from N - 2 to 0 inclusive, safely testing loop end condition */
    for (in = N - 1; in-- > 0; ){
        x[in] = x[in] - cprime[in] * x[in + 1]; /*wrong cprime[in] ebasta!*/
        /* free scratch space */

void delay_line(double *Y, int *delay0,int *delay1,int *delay2,int *delay3,double *dev,double *out,int M,int N){
	int i;
        int k=M*i;


void calculate_g(double *V,double *Y,double *sherad_factor,double *sheraD,double *sheraRho,double *Yzweig,double *omega,double *g,double d_m_factor,const int n){
	int i;

Loading data, please wait...