.. currentmodule:: brian

.. index::
   pair: example usage; NeuronGroup
   pair: example usage; run
   pair: example usage; log
   pair: example usage; raster_plot
   pair: example usage; Connection
   pair: example usage; SpikeMonitor
   pair: example usage; exp
   pair: example usage; StateMonitor

.. _example-audition_licklider:

Example: licklider (audition)
=============================

Spike-based adaptation of Licklider's model of pitch processing (autocorrelation with
delay lines) with phase locking.

Romain Brette

::

    from brian import *
    
    defaultclock.dt = .02 * ms
    
    # Ear and sound
    max_delay = 20 * ms # 50 Hz
    tau_ear = 1 * ms
    sigma_ear = .1
    eqs_ear = '''
    dx/dt=(sound-x)/tau_ear+sigma_ear*(2./tau_ear)**.5*xi : 1
    sound=5*sin(2*pi*frequency*t)**3 : 1 # nonlinear distorsion
    #sound=5*(sin(4*pi*frequency*t)+.5*sin(6*pi*frequency*t)) : 1 # missing fundamental
    frequency=(200+200*t*Hz)*Hz : Hz # increasing pitch
    '''
    receptors = NeuronGroup(2, model=eqs_ear, threshold=1, reset=0, refractory=2 * ms)
    traces = StateMonitor(receptors, 'x', record=True)
    sound = StateMonitor(receptors, 'sound', record=0)
    
    # Coincidence detectors
    min_freq = 50 * Hz
    max_freq = 1000 * Hz
    N = 300
    tau = 1 * ms
    sigma = .1
    eqs_neurons = '''
    dv/dt=-v/tau+sigma*(2./tau)**.5*xi : 1
    '''
    neurons = NeuronGroup(N, model=eqs_neurons, threshold=1, reset=0)
    synapses = Connection(receptors, neurons, 'v', structure='dense', max_delay=1.1 * max_delay, delay=True)
    synapses.connect_full(receptors, neurons, weight=.5)
    synapses.delay[1, :] = 1. / exp(linspace(log(min_freq / Hz), log(max_freq / Hz), N))
    spikes = SpikeMonitor(neurons)
    
    run(500 * ms)
    raster_plot(spikes)
    ylabel('Frequency')
    yticks([0, 99, 199, 299], array(1. / synapses.delay.todense()[1, [0, 99, 199, 299]], dtype=int))
    show()
    

