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;
00057 mrs_natural i, j, o;
00058 ostringstream oss;
00059 realvec tmpvec;
00060 (void) sender;
00061
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
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
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
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;
00116 i=0;
00117 while(freq_(i) < highFreq_ && i<inObservations_){
00118 ++i;
00119 }
00120 rootMax_ = i;
00121
00122
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
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
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 }