Marsyas
0.6.0-alpha
|
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 }