alexbrandmeyer@685: // alexbrandmeyer@685: // car.h alexbrandmeyer@685: // CARFAC Open Source C++ Library alexbrandmeyer@685: // alexbrandmeyer@685: // Created by Alex Brandmeyer on 5/10/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_CAR_H alexbrandmeyer@685: #define CARFAC_CAR_H alexbrandmeyer@685: alexbrandmeyer@685: #include "common.h" alexbrandmeyer@685: alexbrandmeyer@685: // A CARParams structure stores the necessary information needed by a CARFAC ronw@688: // object to design the set of CARCoeffs implementing 'The Cascade of alexbrandmeyer@685: // Asymmetric Resonators' described in the chapter of the same name in Lyon's ronw@688: // book "Human and Machine Hearing". alexbrandmeyer@685: struct CARParams { alexbrandmeyer@685: CARParams() { alexbrandmeyer@685: velocity_scale = 0.1; alexbrandmeyer@685: v_offset = 0.04; alexbrandmeyer@685: min_zeta = 0.1; alexbrandmeyer@685: max_zeta = 0.35; alexbrandmeyer@685: first_pole_theta = 0.85 * kPi; alexbrandmeyer@685: zero_ratio = sqrt(2.0); alexbrandmeyer@685: high_f_damping_compression = 0.5; alexbrandmeyer@685: erb_per_step = 0.5; alexbrandmeyer@685: min_pole_hz = 30; ronw@688: erb_break_freq = 165.3; // The Greenwood map's break frequency in Hertz. ronw@688: // Glassberg and Moore's high-cf ratio. ronw@688: erb_q = 1000 / (24.7 * 4.37); ronw@688: } ronw@688: ronw@688: FPType velocity_scale; // Used for the velocity nonlinearity. alexbrandmeyer@685: FPType v_offset; // The offset gives us quadratic part. ronw@688: FPType min_zeta; // The minimum damping factor in mid-freq channels. ronw@688: FPType max_zeta; // The maximum damping factor in mid-freq channels. alexbrandmeyer@685: FPType first_pole_theta; alexbrandmeyer@685: FPType zero_ratio; // This is how far zero is above the pole. alexbrandmeyer@685: FPType high_f_damping_compression; // A range from 0 to 1 to compress theta. alexbrandmeyer@685: FPType erb_per_step; alexbrandmeyer@685: FPType min_pole_hz; alexbrandmeyer@685: FPType erb_break_freq; alexbrandmeyer@685: FPType erb_q; alexbrandmeyer@685: }; alexbrandmeyer@685: ronw@688: // CAR filter coefficients, which are derived from a set of CARParams. alexbrandmeyer@685: struct CARCoeffs { alexbrandmeyer@685: FPType velocity_scale; alexbrandmeyer@685: FPType v_offset; alexbrandmeyer@685: ArrayX r1_coeffs; alexbrandmeyer@685: ArrayX a0_coeffs; alexbrandmeyer@685: ArrayX c0_coeffs; alexbrandmeyer@685: ArrayX h_coeffs; alexbrandmeyer@685: ArrayX g0_coeffs; alexbrandmeyer@685: ArrayX zr_coeffs; alexbrandmeyer@685: }; alexbrandmeyer@685: alexbrandmeyer@685: ronw@688: // CAR filter state. alexbrandmeyer@685: struct CARState { alexbrandmeyer@685: ArrayX z1_memory; alexbrandmeyer@685: ArrayX z2_memory; alexbrandmeyer@685: ArrayX za_memory; alexbrandmeyer@685: ArrayX zb_memory; alexbrandmeyer@685: ArrayX dzb_memory; alexbrandmeyer@685: ArrayX zy_memory; alexbrandmeyer@685: ArrayX g_memory; alexbrandmeyer@685: ArrayX dg_memory; alexbrandmeyer@685: }; alexbrandmeyer@685: ronw@688: #endif // CARFAC_CAR_H