changeset 494:24828350536a carfac_cpp

Fixed the ERB_Hz default parameter bug also in c++ Introduced FloatMatrix to build on the concept of FloatArray typedef
author Ulf.Hammarqvist@gmail.com
date Sun, 08 Apr 2012 19:40:13 +0000
parents 3029dec89440
children 5a5fc3a6051b
files src/AGC.h src/CAR.cpp src/CAR.h src/CARFAC.cpp src/CARFAC.h src/CARFAC_common.h
diffstat 6 files changed, 23 insertions(+), 21 deletions(-) [+]
line wrap: on
line diff
--- a/src/AGC.h	Sun Apr 08 14:28:55 2012 +0000
+++ b/src/AGC.h	Sun Apr 08 19:40:13 2012 +0000
@@ -44,7 +44,7 @@
   FloatArray agc_polez1_;
   FloatArray agc_polez2_;
   FloatArray agc_spatial_iterations_;
-  std::vector<FloatArray> agc_spatial_fir_;
+  FloatMatrix agc_spatial_fir_;
   FloatArray agc_spatial_n_taps_;
   FloatArray agc_mix_coeffs_;
   float agc_gain_;
--- a/src/CAR.cpp	Sun Apr 08 14:28:55 2012 +0000
+++ b/src/CAR.cpp	Sun Apr 08 19:40:13 2012 +0000
@@ -8,7 +8,7 @@
 
   float f = pow(car_params->zero_ratio_, 2) + 1;
 
-  // TODO: dirty FloatArray initialisation. Redo this later
+  // TODO: dirty FloatArray initialization.
   r1_coeffs_= pole_freqs;
   a0_coeffs_= pole_freqs;
   c0_coeffs_= pole_freqs;
@@ -31,8 +31,11 @@
       x = theta[i]/kPi;
       zr_coeffs_[i] = kPi * (x - ff * x*x*x);
 
-      min_zeta_mod = (car_params->min_zeta_ + 0.25 *
-          (CARFAC::ERB_Hz(pole_freqs[i])/pole_freqs[i]-car_params->min_zeta_));
+      min_zeta_mod = (car_params->min_zeta_ + 0.25 * (CARFAC::ERB_Hz(
+                      pole_freqs[i], car_params->erb_break_freq_,
+                      car_params->erb_q_) / pole_freqs[i]
+                     - car_params->min_zeta_));
+
       r1_coeffs_[i] = 1-zr_coeffs_[i]*min_zeta_mod;
 
       h_coeffs_[i] = c0_coeffs_[i] * f;
--- a/src/CAR.h	Sun Apr 08 14:28:55 2012 +0000
+++ b/src/CAR.h	Sun Apr 08 19:40:13 2012 +0000
@@ -4,6 +4,9 @@
 #include "CARFAC_common.h"
 #include <cmath>
 
+const double kDefaultErbBreakFreq = 165.3;
+const double kDefaultErbQ = 1000/(24.7*4.37);
+
 class CAR_parameters{
 public:
   CAR_parameters():
@@ -16,7 +19,10 @@
     zero_ratio_(sqrt(2)),
     high_f_damping_compression_(0.5),
     erb_per_step_(0.5),
-    min_pole_hz_(30){
+    min_pole_hz_(30),
+    erb_break_freq_(kDefaultErbBreakFreq),
+    erb_q_(kDefaultErbQ)
+  {
     // do nothing more
   }
 
@@ -34,6 +40,8 @@
   float high_f_damping_compression_;
   float erb_per_step_;
   float min_pole_hz_;
+  float erb_break_freq_;
+  float erb_q_;
 };
 
 class CAR_coefficients{
--- a/src/CARFAC.cpp	Sun Apr 08 14:28:55 2012 +0000
+++ b/src/CARFAC.cpp	Sun Apr 08 19:40:13 2012 +0000
@@ -10,9 +10,7 @@
 CARFAC::CARFAC(int fs = kDefaultFs,
               CAR_parameters* car_params = new CAR_parameters(),
               IHC_parameters* ihc_params = new IHC_parameters(),
-              AGC_parameters* agc_params = new AGC_parameters(),
-              float erb_break_freq = kDefaultErbBreakFreq,
-              float erb_q = kDefaultErbQ) : n_ears_(0) {
+              AGC_parameters* agc_params = new AGC_parameters()) : n_ears_(0) {
 
   // Design is to take ownership. Preferences? Make copies, call by value, etc?
   car_params_ = car_params;
@@ -23,7 +21,8 @@
   while (pole_hz > car_params->min_pole_hz_){
       pole_freqs_.push_back(pole_hz); // TODO: STL specific
       pole_hz = pole_hz - car_params->erb_per_step_ *
-                ERB_Hz(pole_hz, erb_break_freq, erb_q);
+                ERB_Hz(pole_hz, car_params->erb_break_freq_,
+                    car_params->erb_q_);
   }
   n_ch_ = pole_freqs_.size();
 
@@ -35,18 +34,12 @@
   agc_coeffs_ = new AGC_coefficients(agc_params_, fs_, n_ch_);
 
   //TODO: move this into AGC_coefficients constructor instead? This style
-  // makes me a bit wary.
+  // makes me (ulha) a bit wary.
   agc_coeffs_->detect_scale_ = agc_params_->detect_scale_ /
                                (ihc_coeffs_->saturation_output_ *
                                agc_coeffs_->agc_gain_);
-
-
 }
 
-//TODO: move this somewhere else?
-float CARFAC::ERB_Hz(float cf_hz){
-  return ERB_Hz(cf_hz, kDefaultErbBreakFreq, kDefaultErbQ);
-} // TODO: is it really intentional to use this default value thing in matlab code?
 float CARFAC::ERB_Hz(float cf_hz, float erb_break_freq, float erb_q){
   return (erb_break_freq + cf_hz) / erb_q;
 }
@@ -57,7 +50,7 @@
   delete agc_coeffs_;
 
   //TODO: as the current design takes ownership OR creates news params,
-  //deletion is a ambiguos. Revise this design!
+  //deletion is a ambiguos. Revise this design?
 
   //delete car_params_;
   //delete ihc_params_;
--- a/src/CARFAC.h	Sun Apr 08 14:28:55 2012 +0000
+++ b/src/CARFAC.h	Sun Apr 08 19:40:13 2012 +0000
@@ -5,15 +5,12 @@
 #include "IHC.h"
 #include "AGC.h"
 
-const double kDefaultErbBreakFreq = 165.3;
-const double kDefaultErbQ = 1000/(24.7*4.37);
 const double kDefaultFs = 22050;
 
 class CARFAC{
 public:
-  CARFAC(int, CAR_parameters*, IHC_parameters*, AGC_parameters*, float, float);
+  CARFAC(int, CAR_parameters*, IHC_parameters*, AGC_parameters*);
   virtual ~CARFAC();
-  static float ERB_Hz(float);
   static float ERB_Hz(float, float, float);
 
   float fs_;
--- a/src/CARFAC_common.h	Sun Apr 08 14:28:55 2012 +0000
+++ b/src/CARFAC_common.h	Sun Apr 08 19:40:13 2012 +0000
@@ -4,6 +4,7 @@
 #include <vector>
 
 typedef std::vector<float> FloatArray;
+typedef std::vector<FloatArray> FloatMatrix;
 const double kPi = 3.1415926;
 
 #endif /* CARFAC_COMMON_TYPEDEFS_H_ */