annotate trunk/carfac/agc.h @ 685:d0612798f6de

Additional changes to C++ CARFAC on the basis of ronw's comments on r289. Moved CARFAC::Design to CARFAC::CARFAC and CARFAC::Reset(), moved carfac_common.h to common.h, CARFACDetect to carfac_util.h/cc, FloatArray and Float2dArray to ArrayX and ArrayXX, improved variable naming, made a start on improved commenting documentation.
author alexbrandmeyer
date Tue, 04 Jun 2013 18:30:22 +0000
parents
children e50aee5046b1
rev   line source
alexbrandmeyer@685 1 //
alexbrandmeyer@685 2 // agc.h
alexbrandmeyer@685 3 // CARFAC Open Source C++ Library
alexbrandmeyer@685 4 //
alexbrandmeyer@685 5 // Created by Alex Brandmeyer on 5/30/13.
alexbrandmeyer@685 6 //
alexbrandmeyer@685 7 // This C++ file is part of an implementation of Lyon's cochlear model:
alexbrandmeyer@685 8 // "Cascade of Asymmetric Resonators with Fast-Acting Compression"
alexbrandmeyer@685 9 // to supplement Lyon's upcoming book "Human and Machine Hearing"
alexbrandmeyer@685 10 //
alexbrandmeyer@685 11 // Licensed under the Apache License, Version 2.0 (the "License");
alexbrandmeyer@685 12 // you may not use this file except in compliance with the License.
alexbrandmeyer@685 13 // You may obtain a copy of the License at
alexbrandmeyer@685 14 //
alexbrandmeyer@685 15 // http://www.apache.org/licenses/LICENSE-2.0
alexbrandmeyer@685 16 //
alexbrandmeyer@685 17 // Unless required by applicable law or agreed to in writing, software
alexbrandmeyer@685 18 // distributed under the License is distributed on an "AS IS" BASIS,
alexbrandmeyer@685 19 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
alexbrandmeyer@685 20 // See the License for the specific language governing permissions and
alexbrandmeyer@685 21 // limitations under the License.
alexbrandmeyer@685 22
alexbrandmeyer@685 23 #ifndef CARFAC_AGC_H
alexbrandmeyer@685 24 #define CARFAC_AGC_H
alexbrandmeyer@685 25
alexbrandmeyer@685 26 #include <vector>
alexbrandmeyer@685 27 #include "common.h"
alexbrandmeyer@685 28
alexbrandmeyer@685 29 struct AGCParams {
alexbrandmeyer@685 30 AGCParams() {
alexbrandmeyer@685 31 num_stages = 4;
alexbrandmeyer@685 32 agc_stage_gain = 2.0;
alexbrandmeyer@685 33 time_constants.resize(num_stages);
alexbrandmeyer@685 34 agc1_scales.resize(num_stages);
alexbrandmeyer@685 35 agc2_scales.resize(num_stages);
alexbrandmeyer@685 36 agc1_scales[0] = 1.0;
alexbrandmeyer@685 37 agc2_scales[0] = 1.65;
alexbrandmeyer@685 38 time_constants[0] = 0.002;
alexbrandmeyer@685 39 for (int i = 1; i < num_stages; ++i) {
alexbrandmeyer@685 40 agc1_scales[i] = agc1_scales[i - 1] * sqrt(2.0);
alexbrandmeyer@685 41 agc2_scales[i] = agc2_scales[i - 1] * sqrt(2.0);
alexbrandmeyer@685 42 time_constants[i] = time_constants[i - 1] * 4.0;
alexbrandmeyer@685 43 }
alexbrandmeyer@685 44 decimation = {8, 2, 2, 2};
alexbrandmeyer@685 45 agc_mix_coeff = 0.5;
alexbrandmeyer@685 46 }
alexbrandmeyer@685 47 int num_stages;
alexbrandmeyer@685 48 FPType agc_stage_gain;
alexbrandmeyer@685 49 FPType agc_mix_coeff;
alexbrandmeyer@685 50 std::vector<FPType> time_constants;
alexbrandmeyer@685 51 std::vector<int> decimation;
alexbrandmeyer@685 52 std::vector<FPType> agc1_scales;
alexbrandmeyer@685 53 std::vector<FPType> agc2_scales;
alexbrandmeyer@685 54 };
alexbrandmeyer@685 55
alexbrandmeyer@685 56 struct AGCCoeffs {
alexbrandmeyer@685 57 int num_agc_stages;
alexbrandmeyer@685 58 FPType agc_stage_gain;
alexbrandmeyer@685 59 FPType agc_epsilon;
alexbrandmeyer@685 60 int decimation;
alexbrandmeyer@685 61 FPType agc_pole_z1;
alexbrandmeyer@685 62 FPType agc_pole_z2;
alexbrandmeyer@685 63 int agc_spatial_iterations;
alexbrandmeyer@685 64 FPType agc_spatial_fir_left;
alexbrandmeyer@685 65 FPType agc_spatial_fir_mid;
alexbrandmeyer@685 66 FPType agc_spatial_fir_right;
alexbrandmeyer@685 67 int agc_spatial_n_taps;
alexbrandmeyer@685 68 FPType agc_mix_coeffs;
alexbrandmeyer@685 69 FPType agc_gain;
alexbrandmeyer@685 70 FPType detect_scale;
alexbrandmeyer@685 71 FPType decim;
alexbrandmeyer@685 72 };
alexbrandmeyer@685 73
alexbrandmeyer@685 74 struct AGCState {
alexbrandmeyer@685 75 ArrayX agc_memory;
alexbrandmeyer@685 76 ArrayX input_accum;
alexbrandmeyer@685 77 int decim_phase;
alexbrandmeyer@685 78 };
alexbrandmeyer@685 79
alexbrandmeyer@685 80 #endif // CARFAC_AGC_H