annotate matlab/bmm/carfac/CARFAC_IHC_Step.m @ 646:e76951e4da20

Style fixes. - Fix most lint errors found by http://google-styleguide.googlecode.com/svn/trunk/cpplint/cpplint.py - Clean up commenting style. - Alphabetize #includes and using statements.
author ronw@google.com
date Tue, 11 Jun 2013 20:41:15 +0000
parents a0869cb1c99b
children
rev   line source
dicklyon@473 1 % Copyright 2012, Google, Inc.
dicklyon@473 2 % Author: Richard F. Lyon
dicklyon@473 3 %
dicklyon@473 4 % This Matlab file is part of an implementation of Lyon's cochlear model:
dicklyon@473 5 % "Cascade of Asymmetric Resonators with Fast-Acting Compression"
dicklyon@473 6 % to supplement Lyon's upcoming book "Human and Machine Hearing"
dicklyon@473 7 %
dicklyon@473 8 % Licensed under the Apache License, Version 2.0 (the "License");
dicklyon@473 9 % you may not use this file except in compliance with the License.
dicklyon@473 10 % You may obtain a copy of the License at
dicklyon@473 11 %
dicklyon@473 12 % http://www.apache.org/licenses/LICENSE-2.0
dicklyon@473 13 %
dicklyon@473 14 % Unless required by applicable law or agreed to in writing, software
dicklyon@473 15 % distributed under the License is distributed on an "AS IS" BASIS,
dicklyon@473 16 % WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
dicklyon@473 17 % See the License for the specific language governing permissions and
dicklyon@473 18 % limitations under the License.
dicklyon@473 19
dicklyon@473 20 function [ihc_out, state] = CARFAC_IHC_Step(filters_out, coeffs, state);
dicklyon@473 21 % function [ihc_out, state] = CARFAC_IHC_Step(filters_out, coeffs, state);
dicklyon@473 22 %
dicklyon@473 23 % One sample-time update of inner-hair-cell (IHC) model, including the
dicklyon@473 24 % detection nonlinearity and one or two capacitor state variables.
dicklyon@473 25
dicklyon@504 26 % AC couple the filters_out, with 20 Hz corner
dicklyon@504 27 ac_diff = filters_out - state.ac_coupler;
dicklyon@504 28 state.ac_coupler = state.ac_coupler + coeffs.ac_coeff * ac_diff;
dicklyon@473 29
dicklyon@504 30 if coeffs.just_hwr
dicklyon@504 31 ihc_out = min(2, max(0, ac_diff)); % limit it for stability
dicklyon@473 32 else
dicklyon@504 33 conductance = CARFAC_Detect(ac_diff); % rectifying nonlinearity
dicklyon@504 34
dicklyon@495 35 if coeffs.one_cap;
dicklyon@495 36 ihc_out = conductance .* state.cap_voltage;
dicklyon@473 37 state.cap_voltage = state.cap_voltage - ihc_out .* coeffs.out_rate + ...
dicklyon@473 38 (1 - state.cap_voltage) .* coeffs.in_rate;
dicklyon@473 39 else
dicklyon@473 40 % change to 2-cap version more like Meddis's:
dicklyon@495 41 ihc_out = conductance .* state.cap2_voltage;
dicklyon@473 42 state.cap1_voltage = state.cap1_voltage - ...
dicklyon@473 43 (state.cap1_voltage - state.cap2_voltage) .* coeffs.out1_rate + ...
dicklyon@473 44 (1 - state.cap1_voltage) .* coeffs.in1_rate;
dicklyon@473 45
dicklyon@473 46 state.cap2_voltage = state.cap2_voltage - ihc_out .* coeffs.out2_rate + ...
dicklyon@473 47 (state.cap1_voltage - state.cap2_voltage) .* coeffs.in2_rate;
dicklyon@473 48 end
dicklyon@473 49
dicklyon@473 50 % smooth it twice with LPF:
dicklyon@473 51
dicklyon@499 52 ihc_out = ihc_out * coeffs.output_gain;
dicklyon@473 53 state.lpf1_state = state.lpf1_state + coeffs.lpf_coeff * ...
dicklyon@473 54 (ihc_out - state.lpf1_state);
dicklyon@473 55 state.lpf2_state = state.lpf2_state + coeffs.lpf_coeff * ...
dicklyon@473 56 (state.lpf1_state - state.lpf2_state);
dicklyon@499 57 ihc_out = state.lpf2_state - coeffs.rest_output;
dicklyon@473 58 end
dicklyon@504 59
dicklyon@504 60 state.ihc_accum = state.ihc_accum + ihc_out; % for where decimated output is useful
dicklyon@504 61