00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "Kurtosis.h"
00021
00022 using std::ostringstream;
00023 using namespace Marsyas;
00024
00025
00026 Kurtosis::Kurtosis(mrs_string name):MarSystem("Kurtosis",name)
00027 {
00028 z_ = 0.0;
00029 b_ = 0.0;
00030 q_ = 0.0;
00031 }
00032
00033
00034 Kurtosis::~Kurtosis()
00035 {
00036 }
00037
00038
00039 MarSystem*
00040 Kurtosis::clone() const
00041 {
00042 return new Kurtosis(*this);
00043 }
00044
00045 void
00046 Kurtosis::myUpdate(MarControlPtr sender)
00047 {
00048 (void) sender;
00049 MRSDIAG("Kurtosis.cpp - Kurtosis:myUpdate");
00050
00051 setctrl("mrs_natural/onSamples", getctrl("mrs_natural/inSamples"));
00052 setctrl("mrs_natural/onObservations", (mrs_natural)1);
00053 setctrl("mrs_real/osrate", getctrl("mrs_real/israte"));
00054 setctrl("mrs_string/onObsNames", "Kurtosis,");
00055
00056
00057 inObservations_ = getctrl("mrs_natural/inObservations")->to<mrs_natural>();
00058
00059 obsrow_.create(inObservations_);
00060 }
00061
00062
00063 void
00064 Kurtosis::myProcess(realvec& in, realvec& out)
00065 {
00066 mrs_natural o,t;
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106 for (t = 0; t < inSamples_; t++)
00107 {
00108
00109 for (o=0; o < inObservations_; o++)
00110 {
00111 obsrow_(o) = in(o,t);
00112 }
00113 z_ = 0.0;
00114 mrs_real mean = obsrow_.mean();
00115 for (o=0; o < inObservations_; o++)
00116 {
00117 obsrow_(o) = obsrow_(o) - mean ;
00118 b_ = obsrow_(o);
00119
00120 z_ += (b_ * b_ * b_ * b_);
00121 q_ += (b_ * b_);
00122 }
00123 q_ = q_ * q_;
00124 q_ = q_ / inObservations_;
00125
00126 if ((z_ < 1.0e-45)||(q_ < 1.0e-45))
00127 out(0,t) = 0.5;
00128 else
00129 {
00130 out(0,t) = (mrs_real)((z_ / q_ ) - 3.0);
00131 }
00132 }
00133
00134
00135
00136 }