Marsyas  0.6.0-alpha
/usr/src/RPM/BUILD/marsyas-0.6.0/src/marsyas/marsystems/UpdatingBassModel.cpp
Go to the documentation of this file.
00001 #include "UpdatingBassModel.h"
00002 
00003 using namespace std;
00004 using namespace Marsyas;
00005 
00006 UpdatingBassModel::UpdatingBassModel(mrs_string name):MarSystem("MatchBassModel", name)
00007 {
00008   addControls();
00009 }
00010 
00011 UpdatingBassModel::UpdatingBassModel(const UpdatingBassModel& a):MarSystem(a)
00012 {
00013   ctrl_nTemplates_ = getctrl("mrs_natural/nTemplates");
00014   ctrl_nDevision_ = getctrl("mrs_natural/nDevision");
00015   ctrl_intervals_ = getctrl("mrs_realvec/intervals");
00016   ctrl_selections_ = getctrl("mrs_realvec/selections");
00017   ctrl_segmentation_ = getctrl("mrs_realvec/segmentation");
00018   ctrl_time_ = getctrl("mrs_realvec/time");
00019   ctrl_freq_ = getctrl("mrs_realvec/freq");
00020   ctrl_lowFreq_ = getctrl("mrs_real/lowFreq");
00021   ctrl_highFreq_ = getctrl("mrs_real/highFreq");
00022   ctrl_rootFreq_ = getctrl("mrs_real/rootFreq");
00023   ctrl_templates_ = getctrl("mrs_realvec/templates");
00024   ctrl_counts_ = getctrl("mrs_realvec/counts");
00025 }
00026 
00027 UpdatingBassModel::~UpdatingBassModel()
00028 {
00029 }
00030 
00031 MarSystem*
00032 UpdatingBassModel::clone() const
00033 {
00034   return new UpdatingBassModel(*this);
00035 }
00036 
00037 void
00038 UpdatingBassModel::addControls()
00039 {
00040   addControl("mrs_natural/nTemplates", 3, ctrl_nTemplates_);
00041   addControl("mrs_natural/nDevision", 64, ctrl_nDevision_);
00042   addControl("mrs_realvec/intervals", realvec(), ctrl_intervals_);
00043   addControl("mrs_realvec/selections", realvec(), ctrl_selections_);
00044   addControl("mrs_realvec/segmentation", realvec(), ctrl_segmentation_);
00045   addControl("mrs_realvec/time", realvec(), ctrl_time_);
00046   addControl("mrs_realvec/freq", realvec(), ctrl_freq_);
00047   addControl("mrs_real/lowFreq", 40.0, ctrl_lowFreq_);
00048   addControl("mrs_real/highFreq", 220.0, ctrl_highFreq_);
00049   addControl("mrs_real/rootFreq", 110.0, ctrl_rootFreq_);
00050   addControl("mrs_realvec/templates", realvec(), ctrl_templates_);
00051   addControl("mrs_realvec/counts", realvec(), ctrl_counts_);
00052 }
00053 
00054 void UpdatingBassModel::myUpdate(MarControlPtr sender)
00055 {
00056   (void) sender;  //suppress warning of unused parameter(s)
00057   mrs_natural i, j, o;
00058   ostringstream oss;
00059   realvec tmpvec;
00060   (void) sender;  //suppress warning of unused parameter(s)
00061   // get value from controller
00062   K_ = ctrl_nTemplates_->to<mrs_natural>();
00063   I_ = ctrl_nDevision_->to<mrs_natural>();
00064   seg_ = ctrl_segmentation_->to<mrs_realvec>();
00065   time_ = ctrl_time_->to<mrs_realvec>();
00066   freq_ = ctrl_freq_->to<mrs_realvec>();
00067   lowFreq_ = ctrl_lowFreq_->to<mrs_real>();
00068   highFreq_ = ctrl_highFreq_->to<mrs_real>();
00069   rootFreq_ = ctrl_rootFreq_->to<mrs_real>();
00070   d_ = ctrl_intervals_->to<mrs_realvec>();
00071   k_ = ctrl_selections_->to<mrs_realvec>();
00072   templates_ = ctrl_templates_->to<mrs_realvec>();
00073   counts_ = ctrl_counts_->to<mrs_realvec>();
00074 
00075   // check size
00076   ctrl_inSamples_->setValue(time_.getSize());
00077   ctrl_inObservations_->setValue(freq_.getSize());
00078   ctrl_onObservations_->setValue(inObservations_, NOUPDATE);
00079   ctrl_onSamples_->setValue(inSamples_, NOUPDATE);
00080   ctrl_osrate_->setValue(inSamples_, NOUPDATE);
00081   for(o=0; o<inObservations_; o++)
00082     oss << "UpdatingBassModel_" << o << ",";
00083   ctrl_onObsNames_->setValue(oss.str(), NOUPDATE);
00084 
00085   // calculate log frequency
00086   logFreq_.create(freq_.getSize());
00087   for(i=0; i<logFreq_.getSize(); ++i) {
00088     logFreq_(i) = log(lowFreq_)+(log(highFreq_)-log(lowFreq_))/(double)(logFreq_.getSize()-1)*(double)i;
00089   }
00090   // calculate start vector
00091   start_.create(seg_.getSize());
00092   i=0;
00093   j=0;
00094   while(i<inSamples_ && j<seg_.getSize()) {
00095     if(seg_(j) <= time_(i)) {
00096       start_(j) = i;
00097       j++;
00098     } else {
00099       ++i;
00100     }
00101   }
00102   if(j<seg_.getSize()) {
00103     start_.stretch(j+1);
00104     start_(j) = i;
00105   }
00106   i=0;
00107   while(freq_(i) < rootFreq_ && i<inObservations_) {
00108     ++i;
00109   }
00110   rootBin_ = i;
00111   i=0;
00112   while(freq_(i) < lowFreq_ && i<inObservations_) {
00113     ++i;
00114   }
00115   rootMin_ = i;// - rootBin_;
00116   i=0;
00117   while(freq_(i) < highFreq_ && i<inObservations_) {
00118     ++i;
00119   }
00120   rootMax_ = i;// - rootBin_;
00121 
00122   // memory allocation
00123   if(templates_.getSize() <= 0) {
00124     templates_.create((rootMax_-rootMin_)*2,K_*I_);
00125   }
00126   if(counts_.getSize() <= 0) {
00127     counts_.create((rootMax_-rootMin_)*2,K_);
00128   }
00129 
00130 }
00131 
00132 void
00133 UpdatingBassModel::myProcess(realvec& in, realvec& out)
00134 {
00135   mrs_natural i, j, k, l, m, tmpnatural;
00136   mrs_real tmpreal;
00137   realvec covMatrix, tmpvec;
00138   if(inSamples_ > 0) {
00139     // copy input realvec to output realvec
00140     for(i=0; i<inSamples_; ++i) {
00141       for(j=0; j<inObservations_; j++) {
00142         out(j,i) = in(j,i);
00143       }
00144     }
00145     tmpvec = templates_;
00146 
00147     for(k=0; k<K_; k++) {
00148       for(l=0; l<counts_.getRows(); l++) {
00149         for(i=0; i<I_; ++i) {
00150           templates_(l, k*I_+i) *= counts_(l,k);
00151         }
00152       }
00153     }
00154 
00155     // update templates realvec
00156     for(j=0; j< (int)start_.getSize()-1; j++) {
00157       for(l=0; l<rootMax_-rootMin_; l++) {
00158         for(i=0; i<I_; ++i) {
00159           tmpreal = 0.0;
00160           tmpnatural = 0;
00161           for(m=(int)(((double)i/I_*(start_(j+1)-start_(j)))+start_(j)); m<(int)((double)(i+1)/I_*(start_(j+1)-start_(j)))+start_(j); m++) {
00162             tmpreal += in(rootMin_+l,m);
00163             tmpnatural ++;
00164           }
00165           if(tmpnatural > 0) {
00166             tmpreal /= (mrs_real)tmpnatural;
00167           }
00168           templates_((mrs_natural)(l+(rootMax_-rootMin_)-d_(j)),(mrs_natural)((k_(j)*I_+i))) += tmpreal;
00169         }
00170         counts_((mrs_natural)(l+(rootMax_-rootMin_)-d_(j)),(mrs_natural)k_(j))++;
00171       }
00172     }
00173     for(l=0; l<(rootMax_-rootMin_)*2; l++) {
00174       for(k=0; k<K_; k++) {
00175         if(counts_(l,k) > 0) {
00176           for(i=0; i<I_; ++i) {
00177             templates_(l,k*I_+i) /= counts_(l,k);
00178           }
00179         } else {
00180           for(i=0; i<I_; ++i) {
00181             templates_(l,k*I_+i) = tmpvec(l,k*I_+i);
00182           }
00183         }
00184       }
00185     }
00186     ctrl_templates_->setValue(templates_);
00187     ctrl_counts_->setValue(counts_);
00188   } else {
00189     cout << "Not ready" << endl;
00190   }
00191 }