Marsyas  0.6.0-alpha
/usr/src/RPM/BUILD/marsyas-0.6.0/src/marsyas/marsystems/Rolloff.cpp
Go to the documentation of this file.
00001 /*
00002 ** Copyright (C) 1998-2006 George Tzanetakis <gtzan@cs.uvic.ca>
00003 **
00004 ** This program is free software; you can redistribute it and/or modify
00005 ** it under the terms of the GNU General Public License as published by
00006 ** the Free Software Foundation; either version 2 of the License, or
00007 ** (at your option) any later version.
00008 **
00009 ** This program is distributed in the hope that it will be useful,
00010 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
00011 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00012 ** GNU General Public License for more details.
00013 **
00014 ** You should have received a copy of the GNU General Public License
00015 ** along with this program; if not, write to the Free Software
00016 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
00017 */
00018 
00019 #include "Rolloff.h"
00020 #include "../common_source.h"
00021 
00022 using namespace std;
00023 using namespace Marsyas;
00024 
00025 Rolloff::Rolloff(mrs_string name):MarSystem("Rolloff",name)
00026 {
00027   perc_ = 0.0;
00028   sum_ = 0.0;
00029   total_ = 0.0;
00030 
00031   addControls();
00032 }
00033 
00034 Rolloff::Rolloff(const Rolloff& a):MarSystem(a)
00035 {
00036   ctrl_percentage_ = getctrl("mrs_real/percentage");
00037 }
00038 
00039 Rolloff::~Rolloff()
00040 {
00041 }
00042 
00043 MarSystem*
00044 Rolloff::clone() const
00045 {
00046   return new Rolloff(*this);
00047 }
00048 
00049 void
00050 Rolloff::addControls()
00051 {
00052   addctrl("mrs_real/percentage", 0.9, ctrl_percentage_);
00053   setctrlState("mrs_real/percentage", true);
00054 }
00055 
00056 void
00057 Rolloff::myUpdate(MarControlPtr sender)
00058 {
00059   (void) sender;  //suppress warning of unused parameter(s)
00060   MRSDIAG("Rolloff.cpp - Rolloff:myUpdate");
00061 
00062   ctrl_onSamples_->setValue(ctrl_inSamples_, NOUPDATE);
00063   ctrl_onObservations_->setValue((mrs_natural)1, NOUPDATE);
00064   ctrl_osrate_->setValue(ctrl_israte_, NOUPDATE);
00065   ctrl_onObsNames_->setValue("Rolloff_" + ctrl_inObsNames_->to<mrs_string>() , NOUPDATE);
00066 
00067   sumWindow_.create(ctrl_inObservations_->to<mrs_natural>());
00068 
00069   perc_ = ctrl_percentage_->to<mrs_real>();
00070 }
00071 
00072 void
00073 Rolloff::myProcess(realvec& in, realvec& out)
00074 {
00075   mrs_natural o,t;
00076   // computer rolloff of observations for each time sample
00077   for (t = 0; t < inSamples_; t++)
00078   {
00079     sum_ = 0.0;
00080     sumWindow_.setval(0.0);
00081     for (o=0; o < inObservations_; o++)
00082     {
00083       sum_ += in(o,t);
00084       sumWindow_(o) = sum_;
00085     }
00086     total_ = sumWindow_(inObservations_-1);
00087     for (o=inObservations_-1; o>1; o--)
00088     {
00089       if (sumWindow_(o) < perc_ *total_)
00090       {
00091         out(0,t) = (mrs_real)o / inObservations_;
00092         return;
00093       }
00094     }
00095     out(0,t) = 1.0;         // default
00096   }
00097 }