00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "Rolloff.h"
00020
00021 using namespace std;
00022 using namespace Marsyas;
00023
00024 Rolloff::Rolloff(mrs_string name):MarSystem("Rolloff",name)
00025 {
00026 perc_ = 0.0;
00027 sum_ = 0.0;
00028 total_ = 0.0;
00029
00030 addControls();
00031 }
00032
00033 Rolloff::Rolloff(const Rolloff& a):MarSystem(a)
00034 {
00035 ctrl_percentage_ = getctrl("mrs_real/percentage");
00036 }
00037
00038 Rolloff::~Rolloff()
00039 {
00040 }
00041
00042 MarSystem*
00043 Rolloff::clone() const
00044 {
00045 return new Rolloff(*this);
00046 }
00047
00048 void
00049 Rolloff::addControls()
00050 {
00051 addctrl("mrs_real/percentage", 0.9, ctrl_percentage_);
00052 setctrlState("mrs_real/percentage", true);
00053 }
00054
00055 void
00056 Rolloff::myUpdate(MarControlPtr sender)
00057 {
00058 (void) sender;
00059 MRSDIAG("Rolloff.cpp - Rolloff:myUpdate");
00060
00061 ctrl_onSamples_->setValue(ctrl_inSamples_, NOUPDATE);
00062 ctrl_onObservations_->setValue((mrs_natural)1, NOUPDATE);
00063 ctrl_osrate_->setValue(ctrl_israte_, NOUPDATE);
00064 ctrl_onObsNames_->setValue("Rolloff_" + ctrl_inObsNames_->to<mrs_string>() , NOUPDATE);
00065
00066 sumWindow_.create(ctrl_inObservations_->to<mrs_natural>());
00067
00068 perc_ = ctrl_percentage_->to<mrs_real>();
00069 }
00070
00071 void
00072 Rolloff::myProcess(realvec& in, realvec& out)
00073 {
00074 mrs_natural o,t;
00075
00076 for (t = 0; t < inSamples_; t++)
00077 {
00078 sum_ = 0.0;
00079 sumWindow_.setval(0.0);
00080 for (o=0; o < inObservations_; o++)
00081 {
00082 sum_ += in(o,t);
00083 sumWindow_(o) = sum_;
00084 }
00085 total_ = sumWindow_(inObservations_-1);
00086 for (o=inObservations_-1; o>1; o--)
00087 {
00088 if (sumWindow_(o) < perc_ *total_)
00089 {
00090 out(0,t) = (mrs_real)o / inObservations_;
00091 return;
00092 }
00093 }
00094 out(0,t) = 1.0;
00095 }
00096 }