diff toolboxes/MIRtoolbox1.3.2/AuditoryToolbox/MeddisHairCell.m @ 0:e9a9cd732c1e tip

first hg version after svn
author wolffd
date Tue, 10 Feb 2015 15:05:51 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/toolboxes/MIRtoolbox1.3.2/AuditoryToolbox/MeddisHairCell.m	Tue Feb 10 15:05:51 2015 +0000
@@ -0,0 +1,72 @@
+function y = MeddisHairCell(data,sampleRate,subtractSpont)
+% y = MeddisHairCell(data,sampleRate)
+% This function calculates Ray Meddis' hair cell model for a
+% number of channels.  Data is arrayed as one channel per row.
+% All channels are done in parallel (but each time step is
+% sequential) so it will be much more efficient to process lots
+% of channels at once.
+
+% (c) 1998 Interval Research Corporation  
+% Changed h and added comment at suggestion of Alain de Cheveigne'   12/11/98
+
+if (nargin<3),  subtractSpont=0;  end
+
+% Parameters from Meddis' April 1990 JASA paper.
+M = 1;
+A = 5;
+B = 300;
+g = 2000;
+y = 5.05;
+l = 2500;
+r = 6580;
+x = 66.31;
+h = 50000;	% This parameter scales the discharge rate. Adjust as necessary.
+		% In combination with the gammatone filterbank (ERBFilterBank),
+		% h=50000 will produce a steady-state average discharge
+		% probability of about 135 spikes/s within the 1kHz channel,
+		% for an input consisting of a 1 kHz sinewave at 60 dB SPL
+		% (0 dB SPL corresponds to an RMS level of 1.0 at the
+		% input of the gammatone filter).  Scaling and constant 
+		% courtesy of Alain de Cheveigne'
+
+
+% Internal constants
+dt = 1/sampleRate;
+gdt = g*dt;
+ydt = y*dt;
+ldt = l*dt;
+rdt = r*dt;
+xdt = x*dt;
+[numChannels dataLength] = size(data);
+
+% Initial values 
+kt = g*A/(A+B);
+spont = M*y*kt/(l*kt+y*(l+r));
+c = spont * ones(numChannels,1);
+q = c*(l+r)/kt;
+w = c*r/x;
+zeroVector = zeros(numChannels,1);
+
+% Now iterate through each time slice of the data.  Use the
+% max function to implement the "if (0>" test.
+y = zeros(numChannels, dataLength);
+for i = 1:dataLength
+ limitedSt = max(data(:,i)+A,0);
+ kt = gdt*limitedSt./(limitedSt+B);
+ replenish = max(ydt*(M-q),zeroVector);
+ eject = kt.*q;
+ loss = ldt.*c;
+ reuptake = rdt.*c;
+ reprocess = xdt.*w;
+
+ q = q + replenish - eject + reprocess;
+ c = c + eject - loss - reuptake;
+ w = w + reuptake - reprocess;
+ y(:,i) = c;
+end
+
+y = h .* y;
+
+if (subtractSpont > 0)
+ y=max(0,y-spont);
+end