00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "Flux.h"
00020
00021 using namespace std;
00022 using std::abs;
00023
00024 using namespace Marsyas;
00025
00026 Flux::Flux(mrs_string name):MarSystem("Flux",name)
00027 {
00028 addControls();
00029
00030 diff_ = 0.0;
00031 flux_ = 0.0;
00032 max_ = 0.0;
00033 addToStabilizingDelay_ = 1;
00034 }
00035
00036 Flux::Flux(const Flux& a) : MarSystem(a)
00037 {
00038 ctrl_reset_ = getctrl("mrs_bool/reset");
00039 ctrl_mode_ = getctrl("mrs_string/mode");
00040 addToStabilizingDelay_ = 1;
00041 }
00042
00043 Flux::~Flux()
00044 {
00045 }
00046
00047 MarSystem*
00048 Flux::clone() const
00049 {
00050 return new Flux(*this);
00051 }
00052
00053 void
00054 Flux::addControls()
00055 {
00056 addctrl("mrs_string/mode", "marsyas", ctrl_mode_);
00057
00058 addctrl("mrs_bool/reset", true, ctrl_reset_);
00059 setctrlState("mrs_bool/reset", true);
00060 }
00061
00062 void
00063 Flux::myUpdate(MarControlPtr sender)
00064 {
00065 (void) sender;
00066 MRSDIAG("Flux.cpp - Flux:myUpdate");
00067 ctrl_onSamples_->setValue(ctrl_inSamples_, NOUPDATE);
00068 ctrl_onObservations_->setValue((mrs_natural)1, NOUPDATE);
00069 ctrl_osrate_->setValue(ctrl_israte_, NOUPDATE);
00070 ctrl_onObsNames_->setValue("Flux_" + ctrl_inObsNames_->to<mrs_string>() , NOUPDATE);
00071
00072 reset_ = ctrl_reset_->to<mrs_bool>();
00073
00074 prevWindow_.create(ctrl_inObservations_->to<mrs_natural>(),
00075 ctrl_inSamples_->to<mrs_natural>());
00076 }
00077
00078 void
00079 Flux::myProcess(realvec& in, realvec& out)
00080 {
00081 mrs_natural o,t;
00082 mrs_string mode = ctrl_mode_->to<mrs_string>();
00083
00084 if (reset_) {
00085 prevWindow_.setval(0.0);
00086
00087
00088
00089 reset_ = false;
00090 }
00091
00092 for (t = 0; t < inSamples_; t++)
00093 {
00094 if(mode == "marsyas")
00095 {
00096 flux_ = 0.0;
00097 diff_ = 0.0;
00098 max_ = 0.0;
00099 for(o = 1; o < inObservations_; ++o)
00100 {
00101 logtmp_ = log(in(o,t) + MINREAL);
00102 diff_ = pow((mrs_real)logtmp_ - prevWindow_(o,t), (mrs_real)2.0);
00103 if(diff_ > max_)
00104 max_ = diff_;
00105 flux_ += diff_;
00106
00107 prevWindow_(o,t) = logtmp_;
00108 }
00109
00110 if(max_ != 0.0)
00111 flux_ /= (max_ * inObservations_);
00112 else
00113 flux_ = 0.0;
00114
00115 out(0,t) = flux_;
00116 }
00117 else if (mode == "Laroche2003")
00118 {
00119 flux_ = 0.0;
00120
00121 for (o=1; o < inObservations_; o++)
00122 {
00123 mrs_real tmp = in(o,t) - prevWindow_(o,t);
00124 flux_ += tmp;
00125
00126 }
00127 if (flux_ <= 0.0)
00128 flux_ = 0.0;
00129
00130 out(0,t) = flux_;
00131 }
00132
00133 else if(mode=="DixonDAFX06")
00134 {
00135 flux_ = 0.0;
00136
00137
00138
00139 for(o = 1 ; o < inObservations_; o++)
00140 {
00141
00142
00143 mrs_real tmp = in(o,t) - prevWindow_(o,t);
00144
00145 diff_ = (tmp+abs(tmp))/2;
00146
00147
00148
00149
00150
00151
00152
00153
00154 flux_ += diff_;
00155 prevWindow_(o,t) = in(o,t);
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165 }
00166
00167
00168
00169
00170
00171
00172
00173 out(0,t) = flux_;
00174
00175 }
00176 }
00177
00178
00179
00180
00181
00182 }