00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef MARSYAS_CARFAC_COEFFS_H
00020 #define MARSYAS_CARFAC_COEFFS_H
00021
00022 #include "MarSystem.h"
00023
00024 namespace Marsyas
00025 {
00046 class CF_class;
00047
00048 class filter_state_class {
00049 public:
00050 std::vector<double> z1_memory;
00051 std::vector<double> z2_memory;
00052 std::vector<double> zA_memory;
00053 std::vector<double> zB_memory;
00054 std::vector<double> dzB_memory;
00055 std::vector<double> zY_memory;
00056 std::vector<double> detect_accum;
00057
00058 std::vector<double> filterstep_inputs;
00059 std::vector<double> filterstep_zA;
00060 std::vector<double> filterstep_zB;
00061 std::vector<double> filterstep_zY;
00062 std::vector<double> filterstep_r;
00063 std::vector<double> filterstep_z1;
00064 std::vector<double> filterstep_z2;
00065
00066
00067 bool init;
00068
00069 public:
00070 filter_state_class();
00071 ~filter_state_class();
00072
00073 std::vector<double> FilterStep(CF_class &CF, double input_waves, std::vector<double> &detect);
00074
00075 friend std::ostream& operator<<(std::ostream&, const filter_state_class&);
00076 friend std::ostream& operator<<(std::ostream&, std::vector<std::vector<double> > a);
00077 friend std::ostream& operator<<(std::ostream&, std::vector<double> a);
00078 };
00079
00080 class AGC_state_class {
00081 public:
00082 std::vector<std::vector<double> > AGC_memory;
00083 std::vector<double> sum_AGC;
00084
00085
00086 public:
00087 AGC_state_class();
00088 ~AGC_state_class();
00089
00090 friend std::ostream& operator<<(std::ostream&, const AGC_state_class&);
00091 friend std::ostream& operator<<(std::ostream&, std::vector<double> a);
00092 };
00093
00094 class strobe_state_class {
00095 public:
00096 std::vector<double> lastdata;
00097 std::vector<double> thresholds;
00098
00099 std::vector<int> trigger_index;
00100 std::vector<int> sai_index;
00101
00102 public:
00103 strobe_state_class();
00104 ~strobe_state_class();
00105
00106 friend std::ostream& operator<<(std::ostream&, const strobe_state_class&);
00107 friend std::ostream& operator<<(std::ostream&, std::vector<double> a);
00108 };
00109
00110 class filter_coeffs_class {
00111 public:
00112 double velocity_scale;
00113
00114 std::vector<double> r_coeffs;
00115 std::vector<double> a_coeffs;
00116 std::vector<double> c_coeffs;
00117 std::vector<double> h_coeffs;
00118 std::vector<double> g_coeffs;
00119
00120 public:
00121 filter_coeffs_class();
00122 ~filter_coeffs_class();
00123
00124 void init(double velocity_scale, int n_ch);
00125
00126 friend std::ostream& operator<<(std::ostream&, const filter_coeffs_class&);
00127 };
00128
00129 class CF_AGC_params_class {
00130 public:
00131 int n_stages;
00132 std::vector<double> time_constants;
00133 int AGC_stage_gain;
00134 int decimation;
00135 std::vector<double> AGC1_scales;
00136 std::vector<double> AGC2_scales;
00137 double detect_scale;
00138 double AGC_mix_coeff;
00139
00140 public:
00141 CF_AGC_params_class();
00142 CF_AGC_params_class(const CF_AGC_params_class& a);
00143 ~CF_AGC_params_class();
00144
00145 friend std::ostream& operator<<(std::ostream&, const CF_AGC_params_class&);
00146 };
00147
00148 class AGC_coeffs_class {
00149 public:
00150 double detect_scale;
00151 double AGC_stage_gain;
00152 double AGC_mix_coeff;
00153 std::vector<double> AGC_epsilon;
00154 std::vector<double> AGC1_polez;
00155 std::vector<double> AGC2_polez;
00156
00157 public:
00158 AGC_coeffs_class();
00159 ~AGC_coeffs_class();
00160 };
00161
00162
00163 class CF_filter_params_class {
00164 public:
00165 double velocity_scale;
00166 double min_zeta;
00167 double first_pole_theta;
00168 double zero_ratio;
00169 double ERB_per_step;
00170 double min_pole_Hz;
00171
00172 public:
00173 CF_filter_params_class();
00174 ~CF_filter_params_class();
00175
00176 friend std::ostream& operator<<(std::ostream&, const CF_filter_params_class&);
00177 };
00178
00179 class CF_class {
00180 public:
00181 int fs;
00182 CF_filter_params_class CF_filter_params;
00183 CF_AGC_params_class CF_AGC_params;
00184 int n_ch;
00185 std::vector<double> pole_freqs;
00186 filter_coeffs_class filter_coeffs;
00187 AGC_coeffs_class AGC_coeffs;
00188 int n_mics;
00189 std::vector<filter_state_class> filter_state;
00190 std::vector<AGC_state_class> AGC_state;
00191 std::vector<strobe_state_class> strobe_state;
00192 std::vector<std::vector<std::vector<double> > > nap;
00193 int cum_k;
00194
00195 double strobe_threshold_start;
00196
00197 public:
00198 CF_class();
00199 CF_class(const CF_class& a);
00200 ~CF_class();
00201
00202 void CARFAC_Design(double fs = -1, double ERB_break_freq = -1, double ERB_q = -1);
00203 void CARFAC_DesignFilters();
00204 void CARFAC_DesignAGC();
00205 void CARFAC_Init(int n_mics = -1);
00206
00207 double ERB_Hz(double CF_Hz, double ERB_break_freq = -1, double ERB_Q = -1);
00208
00209 bool printstate;
00210 bool printcoeffs;
00211
00212 friend std::ostream& operator<<(std::ostream&, const CF_class&);
00213 };
00214
00215
00216 }
00217
00218 #endif