alexbrandmeyer@685
|
1 //
|
alexbrandmeyer@685
|
2 // car.h
|
alexbrandmeyer@685
|
3 // CARFAC Open Source C++ Library
|
alexbrandmeyer@685
|
4 //
|
alexbrandmeyer@685
|
5 // Created by Alex Brandmeyer on 5/10/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_CAR_H
|
alexbrandmeyer@685
|
24 #define CARFAC_CAR_H
|
alexbrandmeyer@685
|
25
|
alexbrandmeyer@685
|
26 #include "common.h"
|
alexbrandmeyer@685
|
27
|
alexbrandmeyer@685
|
28 // A CARParams structure stores the necessary information needed by a CARFAC
|
ronw@688
|
29 // object to design the set of CARCoeffs implementing 'The Cascade of
|
alexbrandmeyer@685
|
30 // Asymmetric Resonators' described in the chapter of the same name in Lyon's
|
ronw@688
|
31 // book "Human and Machine Hearing".
|
alexbrandmeyer@685
|
32 struct CARParams {
|
alexbrandmeyer@685
|
33 CARParams() {
|
alexbrandmeyer@685
|
34 velocity_scale = 0.1;
|
alexbrandmeyer@685
|
35 v_offset = 0.04;
|
alexbrandmeyer@685
|
36 min_zeta = 0.1;
|
alexbrandmeyer@685
|
37 max_zeta = 0.35;
|
alexbrandmeyer@685
|
38 first_pole_theta = 0.85 * kPi;
|
alexbrandmeyer@685
|
39 zero_ratio = sqrt(2.0);
|
alexbrandmeyer@685
|
40 high_f_damping_compression = 0.5;
|
alexbrandmeyer@685
|
41 erb_per_step = 0.5;
|
alexbrandmeyer@685
|
42 min_pole_hz = 30;
|
ronw@688
|
43 erb_break_freq = 165.3; // The Greenwood map's break frequency in Hertz.
|
ronw@688
|
44 // Glassberg and Moore's high-cf ratio.
|
ronw@688
|
45 erb_q = 1000 / (24.7 * 4.37);
|
ronw@688
|
46 }
|
ronw@688
|
47
|
ronw@688
|
48 FPType velocity_scale; // Used for the velocity nonlinearity.
|
alexbrandmeyer@685
|
49 FPType v_offset; // The offset gives us quadratic part.
|
ronw@688
|
50 FPType min_zeta; // The minimum damping factor in mid-freq channels.
|
ronw@688
|
51 FPType max_zeta; // The maximum damping factor in mid-freq channels.
|
alexbrandmeyer@685
|
52 FPType first_pole_theta;
|
alexbrandmeyer@685
|
53 FPType zero_ratio; // This is how far zero is above the pole.
|
alexbrandmeyer@685
|
54 FPType high_f_damping_compression; // A range from 0 to 1 to compress theta.
|
alexbrandmeyer@685
|
55 FPType erb_per_step;
|
alexbrandmeyer@685
|
56 FPType min_pole_hz;
|
alexbrandmeyer@685
|
57 FPType erb_break_freq;
|
alexbrandmeyer@685
|
58 FPType erb_q;
|
alexbrandmeyer@685
|
59 };
|
alexbrandmeyer@685
|
60
|
ronw@688
|
61 // CAR filter coefficients, which are derived from a set of CARParams.
|
alexbrandmeyer@685
|
62 struct CARCoeffs {
|
alexbrandmeyer@685
|
63 FPType velocity_scale;
|
alexbrandmeyer@685
|
64 FPType v_offset;
|
alexbrandmeyer@685
|
65 ArrayX r1_coeffs;
|
alexbrandmeyer@685
|
66 ArrayX a0_coeffs;
|
alexbrandmeyer@685
|
67 ArrayX c0_coeffs;
|
alexbrandmeyer@685
|
68 ArrayX h_coeffs;
|
alexbrandmeyer@685
|
69 ArrayX g0_coeffs;
|
alexbrandmeyer@685
|
70 ArrayX zr_coeffs;
|
alexbrandmeyer@685
|
71 };
|
alexbrandmeyer@685
|
72
|
alexbrandmeyer@685
|
73
|
ronw@688
|
74 // CAR filter state.
|
alexbrandmeyer@685
|
75 struct CARState {
|
alexbrandmeyer@685
|
76 ArrayX z1_memory;
|
alexbrandmeyer@685
|
77 ArrayX z2_memory;
|
alexbrandmeyer@685
|
78 ArrayX za_memory;
|
alexbrandmeyer@685
|
79 ArrayX zb_memory;
|
alexbrandmeyer@685
|
80 ArrayX dzb_memory;
|
alexbrandmeyer@685
|
81 ArrayX zy_memory;
|
alexbrandmeyer@685
|
82 ArrayX g_memory;
|
alexbrandmeyer@685
|
83 ArrayX dg_memory;
|
alexbrandmeyer@685
|
84 };
|
alexbrandmeyer@685
|
85
|
ronw@688
|
86 #endif // CARFAC_CAR_H
|