00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "Skewness.h"
00020
00021 using namespace std;
00022 using namespace Marsyas;
00023
00024 Skewness::Skewness(mrs_string name):MarSystem("Skewness",name)
00025 {
00026
00027
00028 }
00029
00030
00031 Skewness::~Skewness()
00032 {
00033 }
00034
00035
00036 MarSystem*
00037 Skewness::clone() const
00038 {
00039 return new Skewness(*this);
00040 }
00041
00042
00043 void
00044 Skewness::myUpdate(MarControlPtr sender)
00045 {
00046 (void) sender;
00047 MRSDIAG("Skewness.cpp - Skewness:myUpdate");
00048
00049 setctrl("mrs_natural/onSamples", getctrl("mrs_natural/inSamples"));
00050 setctrl("mrs_natural/onObservations", (mrs_natural)1);
00051 setctrl("mrs_real/osrate", getctrl("mrs_real/israte"));
00052 setctrl("mrs_string/onObsNames", "Skewness,");
00053
00054
00055 inObservations_ = getctrl("mrs_natural/inObservations")->to<mrs_natural>();
00056
00057 obsrow_.create(inObservations_);
00058 }
00059
00060
00061 void
00062 Skewness::myProcess(realvec& in, realvec& out)
00063 {
00064 mrs_natural t,o;
00065
00066 for (t = 0; t < inSamples_; t++)
00067 {
00068
00069 for (o=0; o < inObservations_; o++)
00070 {
00071 obsrow_(o) = in(o,t);
00072 }
00073 z_ = 0.0;
00074 for (o=0; o < inObservations_; o++)
00075 {
00076 b_ = obsrow_(o) - obsrow_.mean() ;
00077
00078
00079 z_ += (b_ * b_ * b_);
00080 }
00081 if (z_ > 1.0e-45)
00082 z_ /= inObservations_;
00083 else
00084 z_ = 0.0;
00085
00086
00087
00088 q_ = pow(obsrow_.var(), (mrs_real)1.5);
00089
00090 if ((q_ < 1.0e-45)||(z_== 1.0e-45))
00091 out(0,t) = 0.5;
00092 else
00093 out(0,t) = (z_ / q_) / inObservations_;
00094 }
00095
00096 }