diff trunk/matlab/bmm/carfac/CARFAC_IHC_Step.m @ 534:95a11cca4619

Add CARFAC_Design_Doc.txt, CARFAC_Run_Segment.m, and some renames; rename various variables to be more parallel; clean up init code and such.
author dicklyon@google.com
date Fri, 16 Mar 2012 04:19:24 +0000
parents
children 910efa18d8f5
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/trunk/matlab/bmm/carfac/CARFAC_IHC_Step.m	Fri Mar 16 04:19:24 2012 +0000
@@ -0,0 +1,62 @@
+% Copyright 2012, Google, Inc.
+% Author: Richard F. Lyon
+%
+% This Matlab file is part of an implementation of Lyon's cochlear model:
+% "Cascade of Asymmetric Resonators with Fast-Acting Compression"
+% to supplement Lyon's upcoming book "Human and Machine Hearing"
+%
+% Licensed under the Apache License, Version 2.0 (the "License");
+% you may not use this file except in compliance with the License.
+% You may obtain a copy of the License at
+%
+%     http://www.apache.org/licenses/LICENSE-2.0
+%
+% Unless required by applicable law or agreed to in writing, software
+% distributed under the License is distributed on an "AS IS" BASIS,
+% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+% See the License for the specific language governing permissions and
+% limitations under the License.
+
+function [ihc_out, state] = CARFAC_IHC_Step(filters_out, coeffs, state);
+% function [ihc_out, state] = CARFAC_IHC_Step(filters_out, coeffs, state);
+%
+% One sample-time update of inner-hair-cell (IHC) model, including the
+% detection nonlinearity and one or two capacitor state variables.
+
+just_hwr = coeffs.just_hwr;
+
+if just_hwr
+  ihc_out = max(0, filters_out);
+  state.ihc_accum = state.ihc_accum + ihc_out;
+else
+  one_cap = coeffs.one_cap;
+
+  detect = CARFAC_Detect(filters_out);  % detect with HWR or so
+
+  if one_cap
+    ihc_out = detect .* state.cap_voltage;
+    state.cap_voltage = state.cap_voltage - ihc_out .* coeffs.out_rate + ...
+      (1 - state.cap_voltage) .* coeffs.in_rate;
+  else
+    % change to 2-cap version more like Meddis's:
+    ihc_out = detect .* state.cap2_voltage;
+    state.cap1_voltage = state.cap1_voltage - ...
+      (state.cap1_voltage - state.cap2_voltage) .* coeffs.out1_rate + ...
+      (1 - state.cap1_voltage) .* coeffs.in1_rate;
+
+    state.cap2_voltage = state.cap2_voltage - ihc_out .* coeffs.out2_rate + ...
+      (state.cap1_voltage - state.cap2_voltage) .* coeffs.in2_rate;
+  end
+
+  % smooth it twice with LPF:
+
+  state.lpf1_state = state.lpf1_state + coeffs.lpf_coeff * ...
+    (ihc_out - state.lpf1_state);
+
+  state.lpf2_state = state.lpf2_state + coeffs.lpf_coeff * ...
+    (state.lpf1_state - state.lpf2_state);
+
+  ihc_out = state.lpf2_state - coeffs.rest_output;
+
+  state.ihc_accum = state.ihc_accum + max(0, ihc_out);
+end