00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include <string>
00020 #include <sstream>
00021
00022 #include "RunningStatistics.h"
00023
00024 using namespace std;
00025 using namespace Marsyas;
00026
00027 RunningStatistics::RunningStatistics(mrs_string name) :
00028 MarSystem("RunningStatistics", name)
00029 {
00031 addControls();
00032 }
00033
00034 RunningStatistics::RunningStatistics(const RunningStatistics& a) :
00035 MarSystem(a)
00036 {
00039 ctrl_enable_mean_ = getctrl("mrs_bool/enableMean");
00040 ctrl_enable_stddev_ = getctrl("mrs_bool/enableStddev");
00041 ctrl_enable_skewness_ = getctrl("mrs_bool/enableSkewness");
00042 ctrl_clear_ = getctrl("mrs_bool/clear");
00043 ctrl_clearPerTick_ = getctrl("mrs_bool/clearPerTick");
00044
00045 }
00046
00047 RunningStatistics::~RunningStatistics()
00048 {
00049 }
00050
00051 MarSystem*
00052 RunningStatistics::clone() const
00053 {
00054 return new RunningStatistics(*this);
00055 }
00056
00057 void RunningStatistics::addControls()
00058 {
00059 addctrl("mrs_bool/enableMean", true, ctrl_enable_mean_);
00060 ctrl_enable_mean_->setState(true);
00061 addctrl("mrs_bool/enableStddev", true, ctrl_enable_stddev_);
00062 ctrl_enable_stddev_->setState(true);
00063 addctrl("mrs_bool/enableSkewness", false, ctrl_enable_skewness_);
00064 ctrl_enable_skewness_->setState(true);
00065 addctrl("mrs_bool/clear", false, ctrl_clear_);
00066 addctrl("mrs_bool/clearPerTick", false, ctrl_clearPerTick_);
00067
00068 }
00069
00070 void RunningStatistics::myUpdate(MarControlPtr sender)
00071 {
00072 MRSDIAG("RunningStatistics.cpp - RunningStatistics:myUpdate");
00073
00074
00075 enable_mean_ = ctrl_enable_mean_->to<mrs_bool> ();
00076 enable_stddev_ = ctrl_enable_stddev_->to<mrs_bool> ();
00077 enable_skewsness_ = ctrl_enable_skewness_->to<mrs_bool> ();
00078
00079 mrs_natural fanout = (mrs_natural) enable_mean_
00080 + (mrs_natural) enable_stddev_ + (mrs_natural) enable_skewsness_;
00081
00082
00083
00084 ctrl_onSamples_->setValue((mrs_natural) 1, NOUPDATE);
00085 onObservations_ = fanout * ctrl_inObservations_->to<mrs_natural> ();
00086 ctrl_onObservations_->setValue(onObservations_, NOUPDATE);
00087 ctrl_osrate_->setValue(ctrl_israte_, NOUPDATE);
00088
00089
00090 mrs_string inObsNames = ctrl_inObsNames_->to<mrs_string> ();
00091 mrs_string onObsNames("");
00092 if (enable_mean_)
00093 {
00094 onObsNames += obsNamesAddPrefix(inObsNames, "RunningMean_");
00095 }
00096 if (enable_stddev_)
00097 {
00098 onObsNames += obsNamesAddPrefix(inObsNames, "RunningStddev_");
00099 }
00100 if (enable_skewsness_)
00101 {
00102 onObsNames += obsNamesAddPrefix(inObsNames, "RunningSkewness_");
00103 }
00104
00105 ctrl_onObsNames_->setValue(onObsNames, NOUPDATE);
00106
00107
00108 sumxBuffer_.stretch(onObservations_, 1);
00109 sumx2Buffer_.stretch(onObservations_, 1);
00110 sumx3Buffer_.stretch(onObservations_, 1);
00111
00112 clear();
00113 }
00114
00115 void RunningStatistics::clear(void) {
00116 sumxBuffer_.setval(0.0);
00117 sumx2Buffer_.setval(0.0);
00118 sumx3Buffer_.setval(0.0);
00119 samplecounter_ = 0;
00120
00121 ctrl_clear_->setValue(false, NOUPDATE);
00122 }
00123
00124 void RunningStatistics::myProcess(realvec& in, realvec& out)
00125 {
00126 mrs_natural o,t;
00127 if (ctrl_clear_->to<mrs_bool>() || ctrl_clearPerTick_->to<mrs_bool>()) {
00128 clear();
00129 }
00130
00131
00132 samplecounter_ += inSamples_;
00133
00134 mrs_real mean, var, stddev, skewness;
00135
00136 mrs_real tmp;
00137
00138
00139 mrs_natural o_offset_stdev = (mrs_natural) enable_mean_ * inObservations_;
00140 mrs_natural o_offset_skewness = o_offset_stdev
00141 + (mrs_natural) enable_stddev_ * inObservations_;
00142
00143 for (o = 0; o < inObservations_; o++)
00144 {
00145
00146 for (t = 0; t < inSamples_; t++)
00147 {
00148 sumxBuffer_(o, 0) += in(o, t);
00149 sumx2Buffer_(o, 0) += (tmp = in(o, t) * in(o, t));
00150 sumx3Buffer_(o, 0) += (tmp * in(o, t));
00151 }
00152
00153 mean = sumxBuffer_(o, 0) / samplecounter_;
00154 var = sumx2Buffer_(o, 0) / samplecounter_ - mean * mean;
00155 stddev = sqrt(var);
00156 skewness = (sumx3Buffer_(o, 0) / samplecounter_ - 3 * mean * var - mean
00157 * mean * mean);
00158 skewness = var > 0.0 ? skewness / (var * stddev) : 0.0;
00159
00160
00161 if (enable_mean_)
00162 {
00163 out(o, 0) = mean;
00164 }
00165 if (enable_stddev_)
00166 {
00167 out(o + o_offset_stdev, 0) = stddev;
00168 }
00169 if (enable_skewsness_)
00170 {
00171 out(o + o_offset_skewness, 0) = skewness;
00172 }
00173
00174 }
00175 }