annotate branches/carfac_cpp/src/CAR.cpp @ 586:f3dde307f4b8

some refactoring
author Ulf.Hammarqvist@gmail.com
date Thu, 11 Oct 2012 20:55:03 +0000
parents 9c4c3675c3f8
children d59c0d65624b
rev   line source
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 }