Ulf@538
|
1 #include "CAR.h"
|
Ulf@545
|
2 #include "CARFAC_common.h"
|
Ulf@548
|
3 #include "CARFAC.h"
|
Ulf@547
|
4 #include <cmath>
|
Ulf@538
|
5
|
Ulf@586
|
6 CAR_parameters::CAR_parameters():
|
Ulf@586
|
7 velocity_scale_(0.2),
|
Ulf@586
|
8 v_offset_(0.01),
|
Ulf@586
|
9 v2_corner_(0.2),
|
Ulf@586
|
10 v_damp_max_(0.01),
|
Ulf@586
|
11 min_zeta_(0.10),
|
Ulf@586
|
12 first_pole_theta_(0.085*kPi),
|
Ulf@586
|
13 zero_ratio_(sqrt(2)),
|
Ulf@586
|
14 high_f_damping_compression_(0.5),
|
Ulf@586
|
15 erb_per_step_(0.5),
|
Ulf@586
|
16 min_pole_hz_(30),
|
Ulf@586
|
17 erb_break_freq_(kDefaultErbBreakFreq),
|
Ulf@586
|
18 erb_q_(kDefaultErbQ)
|
Ulf@586
|
19 {
|
Ulf@586
|
20 // do nothing more!
|
Ulf@586
|
21 }
|
Ulf@586
|
22
|
Ulf@564
|
23 CAR_coefficients::CAR_coefficients(CAR_parameters* car_params_p, float fs,
|
Ulf@586
|
24 FloatArray pole_freqs)
|
Ulf@586
|
25 {
|
Ulf@547
|
26
|
Ulf@564
|
27 float f = pow(car_params_p->zero_ratio_, 2) + 1;
|
Ulf@547
|
28
|
Ulf@555
|
29 // TODO: dirty FloatArray initialization.
|
Ulf@548
|
30 r1_coeffs_= pole_freqs;
|
Ulf@548
|
31 a0_coeffs_= pole_freqs;
|
Ulf@548
|
32 c0_coeffs_= pole_freqs;
|
Ulf@548
|
33 h_coeffs_= pole_freqs;
|
Ulf@548
|
34 g0_coeffs_= pole_freqs;
|
Ulf@548
|
35 zr_coeffs_= pole_freqs;
|
Ulf@548
|
36
|
Ulf@547
|
37 FloatArray theta = pole_freqs;
|
Ulf@547
|
38
|
Ulf@548
|
39 float min_zeta_mod;
|
Ulf@548
|
40 float x;
|
Ulf@564
|
41 float ff = car_params_p->high_f_damping_compression_;
|
Ulf@548
|
42
|
Ulf@549
|
43 // TODO: temp loop until we get eigen in (or we just leave it like this)
|
Ulf@549
|
44 for(float i=0; i<pole_freqs.size(); i++){
|
Ulf@547
|
45 theta[i] *= (2*kPi*fs); // scalar mult.
|
Ulf@548
|
46 c0_coeffs_[i] = sin(theta[i]);
|
Ulf@548
|
47 a0_coeffs_[i] = cos(theta[i]);
|
Ulf@548
|
48
|
Ulf@548
|
49 x = theta[i]/kPi;
|
Ulf@548
|
50 zr_coeffs_[i] = kPi * (x - ff * x*x*x);
|
Ulf@548
|
51
|
Ulf@564
|
52 min_zeta_mod = (car_params_p->min_zeta_ + 0.25 * (CARFAC::ERB_Hz(
|
Ulf@564
|
53 pole_freqs[i], car_params_p->erb_break_freq_,
|
Ulf@564
|
54 car_params_p->erb_q_) / pole_freqs[i]
|
Ulf@564
|
55 - car_params_p->min_zeta_));
|
Ulf@555
|
56
|
Ulf@548
|
57 r1_coeffs_[i] = 1-zr_coeffs_[i]*min_zeta_mod;
|
Ulf@548
|
58
|
Ulf@548
|
59 h_coeffs_[i] = c0_coeffs_[i] * f;
|
Ulf@549
|
60
|
Ulf@550
|
61 //TODO: g0_coeffs_ calculated here for now. Let's talk about this, need
|
Ulf@550
|
62 // to see the whole picture of what makes sense.
|
Ulf@550
|
63 // Related: I believe CAR, IHC and AGC classes would be beneficial!
|
Ulf@550
|
64 float tmp = 1 - 2*r1_coeffs_[i]*a0_coeffs_[i] + r1_coeffs_[i]*r1_coeffs_[i];
|
Ulf@550
|
65 g0_coeffs_[i] = tmp / ( tmp + h_coeffs_[i]*r1_coeffs_[i]*c0_coeffs_[i]);
|
Ulf@547
|
66 }
|
Ulf@547
|
67
|
Ulf@538
|
68 }
|