Marsyas  0.2
/home/gperciva/src/marsyas/src/marsyas/Delta.cpp
00001 /*
00002  *  Delta.cpp
00003  *  testDelta
00004  *
00005  *  Created by tsunoo on 09/05/07.
00006  *  Copyright 2009 Emiru Tsunoo. All rights reserved.
00007  *
00008  */
00009 
00010 #include "Delta.h"
00011 
00012 using std::ostringstream;
00013 using namespace Marsyas;
00014 
00015 Delta::Delta(mrs_string name): MarSystem("Delta", name)
00016 {
00017   addControls();
00018 }
00019 
00020 Delta::Delta(const Delta& a): MarSystem(a)
00021 {
00022   ctrl_absolute_ = getctrl("mrs_bool/absolute");
00023   ctrl_sum_ = getctrl("mrs_bool/sum");
00024   ctrl_normalize_ = getctrl("mrs_bool/normalize");
00025   ctrl_normSize_ = getctrl("mrs_natural/normSize");
00026   ctrl_positive_ = getctrl("mrs_bool/positive");
00027 }
00028 
00029 Delta::~Delta()
00030 {
00031 }
00032 
00033 MarSystem*
00034 Delta::clone() const
00035 {
00036   return new Delta(*this);
00037 }
00038 
00039 void 
00040 Delta::addControls()
00041 {
00042   addControl("mrs_bool/absolute", false, ctrl_absolute_);
00043   addControl("mrs_bool/sum", false, ctrl_sum_);
00044   addControl("mrs_bool/normalize", false, ctrl_normalize_);
00045   addControl("mrs_natural/normSize", 10, ctrl_normSize_);
00046   addControl("mrs_bool/positive", false, ctrl_positive_);
00047 }
00048 
00049 void 
00050 Delta::myUpdate(MarControlPtr sender)
00051 {
00052   mrs_natural o;
00053   (void)sender;
00054   absolute_ = ctrl_absolute_->to<mrs_bool>();
00055   sum_ = ctrl_sum_->to<mrs_bool>();
00056   normalize_ = ctrl_normalize_->to<mrs_bool>();
00057   size_ = ctrl_normSize_->to<mrs_natural>();
00058   positive_ = ctrl_positive_->to<mrs_bool>();
00059 
00060   if(sum_){
00061     ctrl_onObservations_->setValue(1, NOUPDATE);
00062   } else {
00063     ctrl_onObservations_->setValue(inObservations_, NOUPDATE);
00064   }
00065   ctrl_onSamples_->setValue(inSamples_, NOUPDATE);
00066   ctrl_osrate_->setValue(israte_, NOUPDATE);
00067 
00068   ostringstream oss;
00069   for(o=0; o<ctrl_onObservations_->to<mrs_natural>(); o++){
00070     oss << "Delta_" << o << ",";
00071   }
00072   ctrl_onObsNames_->setValue(oss.str(), NOUPDATE);
00073   
00074   // memory allocation
00075   if(normalize_ && inSamples_ == 1){
00076     delta_.create(inObservations_, size_);
00077   } else {
00078     delta_.create(inObservations_, inSamples_);
00079   }
00080   prevData_.create(inObservations_, 1);
00081   if(sum_){
00082     normVec_.create(1,size_);
00083   } else {
00084     normVec_.create(inObservations_, size_);
00085   }
00086 
00087 }
00088 
00089 void 
00090 Delta::myProcess(realvec& in, realvec& out)
00091 {
00092   mrs_natural i, j, k;
00093   if(inSamples_ > 0){
00094     for(j=0; j<onObservations_; j++){
00095       for(i=0; i<onSamples_; ++i){
00096     out(j,i) = 0.0;
00097       }
00098     }
00099 
00100     if(inSamples_ == 1){
00101       if(normalize_){
00102     for(j=0; j<inObservations_; j++){
00103       for(i=0; i<size_-1; ++i){
00104         delta_(j,i) = delta_(j,i+1);
00105       }
00106     }
00107     for(j=0; j<inObservations_; j++){
00108       delta_(j,size_-1) = in(j,0) - prevData_(j,0);
00109     }
00110       } else {
00111     for(j=0; j<inObservations_; j++){
00112       delta_(j,0) = in(j,0) = prevData_(j,0);
00113     }
00114       }
00115     } else {
00116       for(j=0; j<inObservations_; j++){
00117     delta_(j,0) = in(j,0);
00118       }
00119       for(j=0; j<inObservations_; j++){
00120     for(i=1; i<inSamples_; ++i){
00121       delta_(j,i) = in(j,i)-in(j,i-1);
00122     }
00123       }
00124     }
00125     
00126     if(positive_){
00127       for(j=0; j<inObservations_; j++){
00128     for(i=0; i<delta_.getCols(); ++i){
00129       if(delta_(j,i) < 0){
00130         delta_(j,i) = 0.0;
00131       }
00132     }
00133       }
00134     } else if(absolute_){
00135       for(j=0; j<inObservations_; j++){
00136     for(i=0; i<delta_.getCols(); ++i){
00137       if(delta_(j,i) < 0){
00138         delta_(j,i) = -delta_(j,i);
00139       }
00140     }
00141       }
00142     }
00143 
00144     if(inSamples_ == 1){
00145       for(j=0; j<inObservations_; j++){
00146     prevData_(j,0) = in(j,0);
00147       }
00148     }
00149     
00150     if(normalize_){
00151       if(inSamples_ == 1){
00152     if(sum_){
00153       for(i=0; i<size_; ++i){
00154         normVec_(0,i) = 0.0;
00155       }
00156       for(j=0; j<inObservations_; j++){
00157         for(i=0; i<size_; ++i){
00158           normVec_(0,i) += delta_(j,i);
00159         }
00160       }
00161     } else {
00162       normVec_ = delta_;
00163     }
00164     normVec_.normObsMinMax();
00165     for(j=0; j<normVec_.getRows(); j++){
00166       out(j,0) = normVec_(j,size_-1);
00167     }
00168       } else {
00169     for(k=0; k<size_/2; k++){
00170       for(i=size_/2-k; i<size_; ++i){
00171         if(sum_){
00172           normVec_(0,i) = 0.0;
00173           for(j=0; j<inObservations_; j++){
00174         normVec_(0,i) += delta_(j,i-size_/2+k);
00175           }
00176         } else {
00177           for(j=0; j<inObservations_; j++){
00178         normVec_(j,i) = delta_(j,i-size_/2+k);
00179           }
00180         }
00181       }
00182       normVec_.normObsMinMax();
00183       for(j=0; j<normVec_.getRows(); j++){
00184         out(j,k) = normVec_(j,size_/2);
00185       }
00186     }
00187     for(k=size_/2; k<inSamples_-size_/2; k++){
00188       for(i=0; i<size_; ++i){
00189         if(sum_){
00190           normVec_(0,i) = 0.0;
00191           for(j=0; j<inObservations_; j++){
00192         normVec_(0,i) += delta_(j,i+k-size_/2);
00193           }
00194         } else {
00195           for(j=0; j<inObservations_; j++){
00196         normVec_(j,i) = delta_(j,i+k-size_/2);
00197           }
00198         }
00199       }
00200       normVec_.normObsMinMax();
00201       for(j=0; j<normVec_.getRows(); j++){
00202         out(j,k) = normVec_(j,size_/2);
00203       }
00204     }
00205     for(k=inSamples_-size_/2; k<inSamples_; k++){
00206       for(i=k-size_/2; i<inSamples_; ++i){
00207         if(sum_){
00208           normVec_(0,i+size_/2-k) = 0.0;
00209           for(j=0; j<inObservations_; j++){
00210         normVec_(0,i+size_/2-k) += delta_(j,i);
00211           }
00212         } else {
00213           for(j=0; j<inObservations_; j++){
00214         normVec_(j,i+size_/2-k) = delta_(j,i);
00215           }
00216         }
00217       }
00218     }
00219       }
00220     } else {
00221       if(sum_){
00222     for(j=0; j<inObservations_; j++){
00223       for(i=0; i<inSamples_; ++i){
00224         out(0,i) += delta_(j,i);
00225       }
00226     }
00227       } else {
00228     for(j=0; j<inObservations_; j++){
00229       for(i=0; i<inSamples_; ++i){
00230         out(j,i) = delta_(j,i);
00231       }
00232     }
00233       }
00234     }
00235     
00236   }
00237 }
00238