alexbrandmeyer@685: // alexbrandmeyer@685: // agc.h alexbrandmeyer@685: // CARFAC Open Source C++ Library alexbrandmeyer@685: // alexbrandmeyer@685: // Created by Alex Brandmeyer on 5/30/13. alexbrandmeyer@685: // alexbrandmeyer@685: // This C++ file is part of an implementation of Lyon's cochlear model: alexbrandmeyer@685: // "Cascade of Asymmetric Resonators with Fast-Acting Compression" alexbrandmeyer@685: // to supplement Lyon's upcoming book "Human and Machine Hearing" alexbrandmeyer@685: // alexbrandmeyer@685: // Licensed under the Apache License, Version 2.0 (the "License"); alexbrandmeyer@685: // you may not use this file except in compliance with the License. alexbrandmeyer@685: // You may obtain a copy of the License at alexbrandmeyer@685: // alexbrandmeyer@685: // http://www.apache.org/licenses/LICENSE-2.0 alexbrandmeyer@685: // alexbrandmeyer@685: // Unless required by applicable law or agreed to in writing, software alexbrandmeyer@685: // distributed under the License is distributed on an "AS IS" BASIS, alexbrandmeyer@685: // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. alexbrandmeyer@685: // See the License for the specific language governing permissions and alexbrandmeyer@685: // limitations under the License. alexbrandmeyer@685: alexbrandmeyer@685: #ifndef CARFAC_AGC_H alexbrandmeyer@685: #define CARFAC_AGC_H alexbrandmeyer@685: alexbrandmeyer@685: #include alexbrandmeyer@685: #include "common.h" alexbrandmeyer@685: alexbrandmeyer@685: struct AGCParams { alexbrandmeyer@685: AGCParams() { alexbrandmeyer@685: num_stages = 4; alexbrandmeyer@685: agc_stage_gain = 2.0; alexbrandmeyer@685: time_constants.resize(num_stages); alexbrandmeyer@685: agc1_scales.resize(num_stages); alexbrandmeyer@685: agc2_scales.resize(num_stages); alexbrandmeyer@685: agc1_scales[0] = 1.0; alexbrandmeyer@685: agc2_scales[0] = 1.65; alexbrandmeyer@685: time_constants[0] = 0.002; alexbrandmeyer@685: for (int i = 1; i < num_stages; ++i) { alexbrandmeyer@685: agc1_scales[i] = agc1_scales[i - 1] * sqrt(2.0); alexbrandmeyer@685: agc2_scales[i] = agc2_scales[i - 1] * sqrt(2.0); alexbrandmeyer@685: time_constants[i] = time_constants[i - 1] * 4.0; alexbrandmeyer@685: } alexbrandmeyer@685: decimation = {8, 2, 2, 2}; alexbrandmeyer@685: agc_mix_coeff = 0.5; alexbrandmeyer@685: } alexbrandmeyer@685: int num_stages; alexbrandmeyer@685: FPType agc_stage_gain; alexbrandmeyer@685: FPType agc_mix_coeff; alexbrandmeyer@685: std::vector time_constants; alexbrandmeyer@685: std::vector decimation; alexbrandmeyer@685: std::vector agc1_scales; alexbrandmeyer@685: std::vector agc2_scales; alexbrandmeyer@685: }; alexbrandmeyer@685: alexbrandmeyer@685: struct AGCCoeffs { alexbrandmeyer@685: int num_agc_stages; alexbrandmeyer@685: FPType agc_stage_gain; alexbrandmeyer@685: FPType agc_epsilon; alexbrandmeyer@685: int decimation; alexbrandmeyer@685: FPType agc_pole_z1; alexbrandmeyer@685: FPType agc_pole_z2; alexbrandmeyer@685: int agc_spatial_iterations; alexbrandmeyer@685: FPType agc_spatial_fir_left; alexbrandmeyer@685: FPType agc_spatial_fir_mid; alexbrandmeyer@685: FPType agc_spatial_fir_right; alexbrandmeyer@685: int agc_spatial_n_taps; alexbrandmeyer@685: FPType agc_mix_coeffs; alexbrandmeyer@685: FPType agc_gain; alexbrandmeyer@685: FPType detect_scale; alexbrandmeyer@685: FPType decim; alexbrandmeyer@685: }; alexbrandmeyer@685: alexbrandmeyer@685: struct AGCState { alexbrandmeyer@685: ArrayX agc_memory; alexbrandmeyer@685: ArrayX input_accum; alexbrandmeyer@685: int decim_phase; alexbrandmeyer@685: }; alexbrandmeyer@685: alexbrandmeyer@685: #endif // CARFAC_AGC_H