00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "AimPZFC.h"
00020
00021 using std::ostringstream;
00022 using std::cout;
00023 using std::endl;
00024
00025 using namespace Marsyas;
00026
00027 AimPZFC::AimPZFC(mrs_string name):MarSystem("AimPZFC",name)
00028 {
00029 is_initialized = false;
00030 initialized_israte = 0.0;
00031 initialized_inobservations = 0;
00032 initialized_mindamp = 0.0;
00033 initialized_maxdamp = 0.0;
00034 initialized_cf_max = 0.0;
00035 initialized_cf_min = 0.0;
00036 channel_count_ = 1;
00037
00038 is_reset = false;
00039 reseted_inobservations = 0;
00040 reseted_agc_factor = 0;
00041
00042 addControls();
00043 }
00044
00045 AimPZFC::AimPZFC(const AimPZFC& a): MarSystem(a)
00046 {
00047 is_initialized = false;
00048 initialized_israte = 0.0;
00049 initialized_inobservations = 0;
00050 initialized_mindamp = 0.0;
00051 initialized_maxdamp = 0.0;
00052 initialized_cf_max = 0.0;
00053 initialized_cf_min = 0.0;
00054
00055
00056 channel_count_ = 1;
00057
00058 is_reset = false;
00059 reseted_inobservations = 0;
00060 reseted_agc_factor = 0;
00061
00062 ctrl_pole_damping_ = getctrl("mrs_real/pole_damping");
00063 ctrl_zero_damping_ = getctrl("mrs_real/zero_damping");
00064 ctrl_zero_factor_ = getctrl("mrs_real/zero_factor");
00065 ctrl_step_factor_ = getctrl("mrs_real/step_factor");
00066 ctrl_bandwidth_over_cf_ = getctrl("mrs_real/bandwidth_over_cf");
00067 ctrl_min_bandwidth_hz_ = getctrl("mrs_real/min_bandwidth_hz");
00068 ctrl_agc_factor_ = getctrl("mrs_real/agc_factor");
00069 ctrl_cf_max_ = getctrl("mrs_real/cf_max");
00070 ctrl_cf_min_ = getctrl("mrs_real/cf_min");
00071 ctrl_mindamp_ = getctrl("mrs_real/mindamp");
00072 ctrl_maxdamp_ = getctrl("mrs_real/maxdamp");
00073 ctrl_do_agc_step_ = getctrl("mrs_bool/do_agc_step");
00074 ctrl_use_fit_ = getctrl("mrs_bool/use_fit");
00075
00076 }
00077
00078
00079 AimPZFC::~AimPZFC()
00080 {
00081 }
00082
00083
00084 MarSystem*
00085 AimPZFC::clone() const
00086 {
00087 return new AimPZFC(*this);
00088 }
00089
00090 void
00091 AimPZFC::addControls()
00092 {
00093 addControl("mrs_real/pole_damping", 0.12 , ctrl_pole_damping_);
00094 addControl("mrs_real/zero_damping", 0.2 , ctrl_zero_damping_);
00095 addControl("mrs_real/zero_factor", 1.4 , ctrl_zero_factor_);
00096 addControl("mrs_real/step_factor", 1.0/3.0 , ctrl_step_factor_);
00097 addControl("mrs_real/bandwidth_over_cf", 0.11 , ctrl_bandwidth_over_cf_);
00098 addControl("mrs_real/min_bandwidth_hz", 27.0 , ctrl_min_bandwidth_hz_);
00099 addControl("mrs_real/agc_factor", 12.0, ctrl_agc_factor_);
00100 addControl("mrs_real/cf_max", 6000.0, ctrl_cf_max_);
00101 addControl("mrs_real/cf_min", 100.0, ctrl_cf_min_);
00102 addControl("mrs_real/mindamp", 0.18 , ctrl_mindamp_);
00103 addControl("mrs_real/maxdamp", 0.4 , ctrl_maxdamp_);
00104 addControl("mrs_bool/do_agc_step", true , ctrl_do_agc_step_);
00105 addControl("mrs_bool/use_fit", false , ctrl_use_fit_);
00106 }
00107
00108 void
00109 AimPZFC::myUpdate(MarControlPtr sender)
00110 {
00111
00112 (void) sender;
00113 MRSDIAG("AimPZFC.cpp - AimPZFC:myUpdate");
00114 ctrl_onSamples_->setValue(ctrl_inSamples_, NOUPDATE);
00115 ctrl_osrate_->setValue(ctrl_israte_, NOUPDATE);
00116 ctrl_onObsNames_->setValue("AimPZFC_" + ctrl_inObsNames_->to<mrs_string>() , NOUPDATE);
00117
00118
00119
00120
00121 ctrl_onObservations_->setValue(channel_count_ * 2, NOUPDATE);
00122
00123
00124
00125
00126 if (initialized_israte != ctrl_israte_->to<mrs_real>() ||
00127 initialized_inobservations != ctrl_inObservations_->to<mrs_natural>() ||
00128 initialized_mindamp != ctrl_mindamp_->to<mrs_real>() ||
00129 initialized_maxdamp != ctrl_maxdamp_->to<mrs_real>() ||
00130 initialized_cf_max != ctrl_cf_max_->to<mrs_real>() ||
00131 initialized_cf_min != ctrl_cf_min_->to<mrs_real>()) {
00132 is_initialized = false;
00133 }
00134
00135 if (!is_initialized) {
00136 InitializeInternal();
00137 is_initialized = true;
00138 initialized_israte = ctrl_israte_->to<mrs_real>();
00139 initialized_inobservations = ctrl_inObservations_->to<mrs_natural>();
00140 initialized_mindamp = ctrl_mindamp_->to<mrs_real>();
00141 initialized_maxdamp = ctrl_maxdamp_->to<mrs_real>();
00142 initialized_cf_max = ctrl_cf_max_->to<mrs_real>();
00143 initialized_cf_min = ctrl_cf_min_->to<mrs_real>();
00144 }
00145
00146
00147
00148
00149 if (reseted_inobservations != ctrl_inObservations_->to<mrs_natural>() ||
00150 reseted_agc_factor != ctrl_agc_factor_->to<mrs_real>()) {
00151 is_reset = false;
00152 }
00153
00154 if (!is_reset) {
00155 ResetInternal();
00156 is_reset = true;
00157 reseted_inobservations = ctrl_inObservations_->to<mrs_natural>();
00158 reseted_agc_factor = ctrl_agc_factor_->to<mrs_real>();
00159 }
00160
00161 }
00162
00163 bool
00164 AimPZFC::InitializeInternal() {
00165 channel_count_ = 0;
00166 SetPZBankCoeffs();
00167 return true;
00168 }
00169
00170 void
00171 AimPZFC::ResetInternal() {
00172
00173
00174
00175 agc_state_.clear();
00176 agc_state_.resize(channel_count_);
00177 for (int i = 0; i < channel_count_; ++i) {
00178 agc_state_[i].clear();
00179 agc_state_[i].resize(agc_stage_count_, 0.0);
00180 }
00181
00182 state_1_.clear();
00183 state_1_.resize(channel_count_, 0.0);
00184
00185 state_2_.clear();
00186 state_2_.resize(channel_count_, 0.0);
00187
00188 previous_out_.clear();
00189 previous_out_.resize(channel_count_, 0.0);
00190
00191 pole_damps_mod_.clear();
00192 pole_damps_mod_.resize(channel_count_, 0.0);
00193
00194 inputs_.clear();
00195 inputs_.resize(channel_count_, 0.0);
00196
00197
00198 offset_ = 1.0 - ctrl_agc_factor_->to<mrs_real>() * DetectFun(0.0);
00199 agc_factor_ = ctrl_agc_factor_->to<mrs_real>();
00200 AGCDampStep();
00201
00202
00203
00204
00205 for (int i = 0; i < channel_count_; ++i) {
00206 pole_damps_mod_[i] += 0.05;
00207 for (int j = 0; j < agc_stage_count_; ++j)
00208 agc_state_[i][j] += 0.05;
00209 }
00210
00211 last_input_ = 0.0;
00212 }
00213
00214 bool
00215 AimPZFC::SetPZBankCoeffs() {
00218 if (ctrl_use_fit_->to<mrs_bool>()) {
00219 if (!SetPZBankCoeffsERBFitted())
00220 return false;
00221 } else {
00222 if (!SetPZBankCoeffsOrig())
00223 return false;
00224 }
00225
00226 double mindamp = ctrl_mindamp_->to<mrs_real>();
00227 double maxdamp = ctrl_maxdamp_->to<mrs_real>();
00228
00229 rmin_.resize(channel_count_);
00230 rmax_.resize(channel_count_);
00231 xmin_.resize(channel_count_);
00232 xmax_.resize(channel_count_);
00233
00234 for (int c = 0; c < channel_count_; ++c) {
00235
00236 rmin_[c] = exp(-mindamp * pole_frequencies_[c]);
00237 rmax_[c] = exp(-maxdamp * pole_frequencies_[c]);
00238
00239 xmin_[c] = rmin_[c] * cos(pole_frequencies_[c]
00240 * pow((1-pow(mindamp, 2)), 0.5));
00241 xmax_[c] = rmax_[c] * cos(pole_frequencies_[c]
00242 * pow((1-pow(maxdamp, 2)), 0.5));
00243
00244 }
00245
00246
00247 agc_stage_count_ = 4;
00248 agc_epsilons_.resize(agc_stage_count_);
00249 agc_epsilons_[0] = 0.0064;
00250 agc_epsilons_[1] = 0.0016;
00251 agc_epsilons_[2] = 0.0004;
00252 agc_epsilons_[3] = 0.0001;
00253
00254 agc_gains_.resize(agc_stage_count_);
00255 agc_gains_[0] = 1.0;
00256 agc_gains_[1] = 1.4;
00257 agc_gains_[2] = 2.0;
00258 agc_gains_[3] = 2.8;
00259
00260 double mean_agc_gain = 0.0;
00261 for (int c = 0; c < agc_stage_count_; ++c)
00262 mean_agc_gain += agc_gains_[c];
00263 mean_agc_gain /= static_cast<double>(agc_stage_count_);
00264
00265 for (int c = 0; c < agc_stage_count_; ++c)
00266 agc_gains_[c] /= mean_agc_gain;
00267
00268 return true;
00269 }
00270
00271 bool
00272 AimPZFC::SetPZBankCoeffsOrig() {
00273
00274
00275
00276
00277
00278
00279
00280 double sample_rate = getctrl("mrs_real/israte")->to<mrs_real>();
00281 double cf_max = getctrl("mrs_real/cf_max")->to<mrs_real>();
00282 double cf_min = getctrl("mrs_real/cf_min")->to<mrs_real>();
00283 double bandwidth_over_cf = getctrl("mrs_real/bandwidth_over_cf")->to<mrs_real>();
00284 double min_bandwidth_hz = getctrl("mrs_real/min_bandwidth_hz")->to<mrs_real>();
00285 double step_factor = getctrl("mrs_real/step_factor")->to<mrs_real>();
00286 double pole_damping = getctrl("mrs_real/pole_damping")->to<mrs_real>();
00287 double zero_factor = getctrl("mrs_real/zero_factor")->to<mrs_real>();
00288 double zero_damping = getctrl("mrs_real/zero_damping")->to<mrs_real>();
00289
00290
00291
00292
00293
00294 double pole_frequency = cf_max / sample_rate * (2.0 * PI);
00295 channel_count_ = 0;
00296 while ((pole_frequency / (2.0 * PI)) * sample_rate > cf_min) {
00297 double bw = bandwidth_over_cf * pole_frequency + 2 * PI * min_bandwidth_hz / sample_rate;
00298 pole_frequency -= step_factor * bw;
00299 channel_count_++;
00300 }
00301
00302
00303
00304
00305
00306 pole_dampings_.clear();
00307 pole_dampings_.resize(channel_count_, pole_damping);
00308 pole_frequencies_.clear();
00309 pole_frequencies_.resize(channel_count_, 0.0);
00310
00311
00312 za0_.clear();
00313 za0_.resize(channel_count_, 0.0);
00314 za1_.clear();
00315 za1_.resize(channel_count_, 0.0);
00316 za2_.clear();
00317 za2_.resize(channel_count_, 0.0);
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327 pole_frequency = cf_max / sample_rate * (2.0 * PI);
00328
00329
00330
00331
00332 centre_frequencies_.clear();
00333 centre_frequencies_.resize(channel_count_);
00334
00335 for (int i = channel_count_ - 1; i > -1; --i) {
00336
00337
00338
00339 pole_frequencies_[i] = pole_frequency;
00340
00341
00342 double frequency = pole_frequency / (2.0 * PI) * sample_rate;
00343
00344
00345
00346 centre_frequencies_[i] = frequency;
00347
00348
00349 double zero_frequency = Minimum(PI, zero_factor * pole_frequency);
00350
00351
00352
00353 double z_plane_theta = zero_frequency * sqrt(1.0 - pow(zero_damping, 2));
00354 double z_plane_rho = exp(-zero_damping * zero_frequency);
00355
00356
00357
00358
00359 double a1 = -2.0 * z_plane_rho * cos(z_plane_theta);
00360 double a2 = z_plane_rho * z_plane_rho;
00361
00362
00363 double a_sum = 1.0 + a1 + a2;
00364
00365
00366
00367
00368 za0_[i] = 1.0 / a_sum;
00369 za1_[i] = a1 / a_sum;
00370 za2_[i] = a2 / a_sum;
00371
00372
00373
00374 double bw = bandwidth_over_cf * pole_frequency + 2 * PI * min_bandwidth_hz / sample_rate;
00375
00376
00377
00378 pole_frequency -= step_factor * bw;
00379 }
00380
00381 return true;
00382 }
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413
00414
00415
00416
00417
00418
00419
00420
00421
00422
00423
00424
00425
00426
00427
00428
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444
00445
00446
00447
00448
00449
00450
00451
00452
00453
00454
00455
00456
00457
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471
00472 bool
00473 AimPZFC::SetPZBankCoeffsERBFitted() {
00474
00475
00476
00478
00479
00480
00482
00483
00484
00485
00487
00488
00489 double parameter_values[3 * 7] = {
00490
00491
00492 1.72861, 0.00000, 0.00000,
00493 0.56657, -0.93911, 0.89163,
00494 0.39469, 0.00000, 0.00000,
00495
00496 0.00000, 0.00000, 0.00000,
00497 2.00000, 0.00000, 0.00000,
00498 1.27393, 0.00000, 0.00000,
00499 11.46247, 5.46894, 0.11800
00500
00501 };
00502
00503 double sample_rate = getctrl("mrs_real/israte")->to<mrs_real>();
00504 double cf_max = getctrl("mrs_real/cf_max")->to<mrs_real>();
00505 double cf_min = getctrl("mrs_real/cf_min")->to<mrs_real>();
00506
00507
00508
00509
00510
00511
00512 double pole_frequency = cf_max / sample_rate * (2.0 * PI);
00513
00514 channel_count_ = 0;
00515 while ((pole_frequency / (2.0 * PI)) * sample_rate > cf_min) {
00516 double frequency = pole_frequency / (2.0 * PI) * sample_rate;
00517 double f_dep = ERBTools::Freq2ERB(frequency)
00518 / ERBTools::Freq2ERB(1000.0) - 1.0;
00519 double bw = ERBTools::Freq2ERBw(pole_frequency
00520 / (2.0 * PI) * sample_rate);
00521 double step_factor = 1.0
00522 / (parameter_values[4*3] + parameter_values[4 * 3 + 1]
00523 * f_dep + parameter_values[4 * 3 + 2] * f_dep * f_dep);
00524 pole_frequency -= step_factor * (bw * (2.0 * PI) / sample_rate);
00525 channel_count_++;
00526 }
00527
00528
00529
00530 pole_dampings_.clear();
00531 pole_dampings_.resize(channel_count_, 0.0);
00532 pole_frequencies_.clear();
00533 pole_frequencies_.resize(channel_count_, 0.0);
00534
00535
00536 za0_.clear();
00537 za0_.resize(channel_count_, 0.0);
00538 za1_.clear();
00539 za1_.resize(channel_count_, 0.0);
00540 za2_.clear();
00541 za2_.resize(channel_count_, 0.0);
00542
00543
00544
00545
00546
00547 pole_frequency = cf_max / sample_rate * (2.0 * PI);
00548
00549 for (int i = channel_count_ - 1; i > -1; --i) {
00550
00551 pole_frequencies_[i] = pole_frequency;
00552
00553
00554 double frequency = pole_frequency / (2.0 * PI) * sample_rate;
00555
00556
00557
00558
00559
00560
00561 double DpndF = ERBTools::Freq2ERB(frequency)
00562 / ERBTools::Freq2ERB(1000.0) - 1.0;
00563
00564 double p[8];
00565
00566
00567 for (int param = 0; param < 7; ++param)
00568 p[param] = parameter_values[param * 3]
00569 + parameter_values[param * 3 + 1] * DpndF
00570 + parameter_values[param * 3 + 2] * DpndF * DpndF;
00571
00572
00573 p[7] = p[1] * pow(10.0, (p[2] / (p[1] * p[4])) * (p[6] - 60.0) / 20.0);
00574 if (p[7] < 0.2)
00575 p[7] = 0.2;
00576
00577
00578 double fERBw = ERBTools::Freq2ERBw(frequency);
00579
00580
00581 double fPBW = ((p[7] * fERBw * (2 * PI) / sample_rate) / 2)
00582 * pow(p[4], 0.5);
00583
00584
00585 double pole_damping = fPBW / sqrt(pow(pole_frequency, 2) + pow(fPBW, 2));
00586
00587 cout << "pole_damping = " << pole_damping << endl;
00588
00589
00590 pole_dampings_[i] = pole_damping;
00591
00592
00593 double fZBW = ((p[0] * p[5] * fERBw * (2 * PI) / sample_rate) / 2)
00594 * pow(p[4], 0.5);
00595
00596
00597 double zero_frequency = p[5] * pole_frequency;
00598
00599 if (zero_frequency > PI) {
00600 MRSWARN("Warning: Zero frequency is above the Nyquist frequency.");
00601 MRSWARN("Continuing anyway but results may not be accurate.");
00602 }
00603
00604
00605
00606
00607
00608 double fZDamp = fZBW / sqrt(pow(zero_frequency, 2) + pow(fZBW, 2));
00609
00610
00611 double fZTheta = zero_frequency * sqrt(1.0 - pow(fZDamp, 2));
00612 double fZRho = exp(-fZDamp * zero_frequency);
00613
00614
00615 double fA1 = -2.0 * fZRho * cos(fZTheta);
00616 double fA2 = fZRho * fZRho;
00617
00618
00619 double fASum = 1.0 + fA1 + fA2;
00620 za0_[i] = 1.0 / fASum;
00621 za1_[i] = fA1 / fASum;
00622 za2_[i] = fA2 / fASum;
00623
00624
00625
00626 pole_frequency -= ((1.0 / p[4])
00627 * (fERBw * (2.0 * PI) / sample_rate));
00628 }
00629 return true;
00630 }
00631
00632 void
00633 AimPZFC::AGCDampStep() {
00634
00635 if (detect_.size() == 0) {
00636
00637
00640 detect_.clear();
00641 double detect_zero = DetectFun(0.0);
00642 detect_.resize(channel_count_, detect_zero);
00643
00644 for (int c = 0; c < channel_count_; c++)
00645 for (int st = 0; st < agc_stage_count_; st++)
00646 agc_state_[c][st] = (1.2 * detect_[c] * agc_gains_[st]);
00647 }
00648
00649 double fAGCEpsLeft = 0.3;
00650 double fAGCEpsRight = 0.3;
00651
00652 for (int c = channel_count_ - 1; c > -1; --c) {
00653 for (int st = 0; st < agc_stage_count_; ++st) {
00654
00655
00658 double fPrevAGCState;
00659 double fCurrAGCState;
00660 double fNextAGCState;
00661
00662 if (c < channel_count_ - 1)
00663 fPrevAGCState = agc_state_[c + 1][st];
00664 else
00665 fPrevAGCState = agc_state_[c][st];
00666
00667 fCurrAGCState = agc_state_[c][st];
00668
00669 if (c > 0)
00670 fNextAGCState = agc_state_[c - 1][st];
00671 else
00672 fNextAGCState = agc_state_[c][st];
00673
00674
00678 double agc_avg = fAGCEpsLeft * fPrevAGCState
00679 + (1.0 - fAGCEpsLeft - fAGCEpsRight) * fCurrAGCState
00680 + fAGCEpsRight * fNextAGCState;
00681
00682 agc_state_[c][st] = agc_avg * (1.0 - agc_epsilons_[st])
00683 + agc_epsilons_[st] * detect_[c] * agc_gains_[st];
00684 }
00685 }
00686
00687
00688
00689
00690 for (int i = 0; i < channel_count_; ++i) {
00691 double fAGCStateMean = 0.0;
00692 for (int j = 0; j < agc_stage_count_; ++j)
00693 fAGCStateMean += agc_state_[i][j];
00694
00695 fAGCStateMean /= static_cast<double>(agc_stage_count_);
00696
00697
00698 pole_damps_mod_[i] = pole_dampings_[i] *
00699 (offset_ + agc_factor_ * fAGCStateMean);
00700 }
00701 }
00702
00703 double
00704 AimPZFC::DetectFun(double fIN)
00705 {
00706 if (fIN < 0.0)
00707 fIN = 0.0;
00708 double fDetect = Minimum(1.0, fIN);
00709 double fA = 0.25;
00710 return fA * fIN + (1.0 - fA) * (fDetect - pow(fDetect, 3) / 3.0);
00711 }
00712
00713 inline double AimPZFC::Minimum(double a, double b)
00714 {
00715 if (a < b)
00716 return a;
00717 else
00718 return b;
00719 }
00720
00721
00722 void
00723 AimPZFC::myProcess(realvec& in, realvec& out)
00724 {
00725 double damp_rate = 1.0 / (ctrl_maxdamp_->to<mrs_real>() - ctrl_mindamp_->to<mrs_real>());
00726 double min_damp = ctrl_mindamp_->to<mrs_real>();
00727 double interp_factor;
00728 bool do_agc = ctrl_do_agc_step_->to<mrs_bool>();
00729
00730 for (t = 0; t < inSamples_; t++)
00731 {
00732 double input_sample = in(0, t);
00733
00734
00735 input_sample = 0.5 * input_sample + 0.5 * last_input_;
00736 last_input_ = in(0, t);
00737
00738 inputs_[channel_count_ - 1] = input_sample;
00739 for (int c = 0; c < channel_count_ - 1; ++c)
00740 {
00741 inputs_[c] = previous_out_[c + 1];
00742
00743 }
00744
00745
00746
00747 for (int c = channel_count_ - 1; c > -1; --c)
00748 {
00749 interp_factor = (pole_damps_mod_[c] -min_damp) * damp_rate;
00750
00751 double x = xmin_[c] + (xmax_[c] - xmin_[c]) * interp_factor;
00752 double r = rmin_[c] + (rmax_[c] - rmin_[c]) * interp_factor;
00753
00754
00755 double fd = pole_frequencies_[c] * pole_damps_mod_[c];
00756
00757 r = r + 0.25 * fd * Minimum(0.05, fd);
00758
00759 double zb1 = -2.0 * x;
00760 double zb2 = r * r;
00761
00762
00763
00764
00765 double new_state = inputs_[c] - (state_1_[c] - inputs_[c]) * zb1
00766 - (state_2_[c] - inputs_[c]) * zb2;
00767
00768
00769
00770
00771
00772
00773
00774
00775 double output = za0_[c] * new_state + za1_[c] * state_1_[c]
00776 + za2_[c] * state_2_[c];
00777
00778
00779 output -= 0.0001 * pow(output, 3);
00780
00781
00782 out(c, t) = output;
00783 detect_[c] = DetectFun(output);
00784 state_2_[c] = state_1_[c];
00785 state_1_[c] = new_state;
00786 }
00787
00788 if (do_agc)
00789 {
00790
00791
00792 AGCDampStep();
00793 }
00794
00795 for (int c = 0; c < channel_count_; ++c)
00796 previous_out_[c] = out(c,t);
00797 }
00798
00799
00800
00801 for (t = 0; t < inSamples_; t++)
00802 {
00803 for (o = 0; o < channel_count_; o++)
00804 {
00805 out(o + channel_count_, t) = centre_frequencies_[o];
00806 }
00807 }
00808
00809 }