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