diff options
| -rw-r--r-- | rotord/src/nodes_audio_analysis.cpp | 63 |
1 files changed, 49 insertions, 14 deletions
diff --git a/rotord/src/nodes_audio_analysis.cpp b/rotord/src/nodes_audio_analysis.cpp index eff7a37..7efb0f8 100644 --- a/rotord/src/nodes_audio_analysis.cpp +++ b/rotord/src/nodes_audio_analysis.cpp @@ -290,35 +290,68 @@ nned to retrieve total intensity by segment */ // segment group_intensity seg_intense segment vector<pair<double,vector<pair<double,int> > > > seggrps; + vector<pair<double,vector<pair<double,int> > > > oldgrps; for (i=0;i<totalsmap.size();i++){ vector<pair<double,int> > data; data.push_back(make_pair(totalsmap[i],i)); - seggrps.push_back(make_pair(totalsmap[i],data)); + oldgrps.push_back(make_pair(totalsmap[i],data)); } + for (auto s:similarities){ + //similarities is a collection of similarity groups in no particular order, referring to segment nos + //at this point seggrps is in segment order if (s.second.size()>1){ for (int j=s.second.size()-1;j>0;j--){ - seggrps[s.second[0]].second.push_back(make_pair(totalsmap[s.second[j]],s.second[j])); - //keep running average// should be by area? - //seggrps[s.second[0]].first+=(totalsmap[s.second[j]]*(1.0/max(1,(int)seggrps[s.second[0]].second.size()-1))); - //double div=seggrps[s.second[0]].second.size()==1?1.0:((double)seggrps[s.second[0]].second.size()-1/(double)seggrps[s.second[0]].second.size()); - //neat! this gives 1,1/2,2/3,3/4.. - //seggrps[s.second[0]].first*=div; + oldgrps[s.second[0]].second.push_back(make_pair(totalsmap[s.second[j]],s.second[j])); + //keep running average// should be by area? + //seggrps[s.second[0]].first+=(totalsmap[s.second[j]]*(1.0/max(1,(int)seggrps[s.second[0]].second.size()-1))); + //double div=seggrps[s.second[0]].second.size()==1?1.0:((double)seggrps[s.second[0]].second.size()-1/(double)seggrps[s.second[0]].second.size()); + //neat! this gives 1,1/2,2/3,3/4.. + //seggrps[s.second[0]].first*=div; + + //seggrps.erase(seggrps.begin()+s.second[j]); + //after this has happened, seggrpgs indexing can be invalid + + } + //easier is to double avg=0.0f; - for (auto p:seggrps[s.second[0]].second) avg+=p.first; - avg/=seggrps[s.second[0]].second.size(); - seggrps[s.second[0]].first=avg; + for (auto p:oldgrps[s.second[0]].second) avg+=p.first; + avg/=oldgrps[s.second[0]].second.size(); + oldgrps[s.second[0]].first=avg; - seggrps.erase(seggrps.begin()+s.second[j]); - } } + seggrps.push_back(oldgrps[s.second[0]]); } + cerr<<"similarities assigned, "<<(totalsmap.size()-seggrps.size())<<" segments merged"<<endl; + + i=0; + for (auto s:seggrps) { + string list=""; + for (int j=0;j<s.second.size();j++){ + if (j>0) list+=","; + list +=toString(s.second[j].second); + } + cerr<<"segment "<<i<<" ["<<list<<"]"<<endl; + i++; + } //sort the contents by intensity std::sort(seggrps.begin(),seggrps.end(),sortseggrps); + cerr<<"groups sorted by intensity:"<<endl; //possible mergers will be with groups with adjacent intensity + i=0; + for (auto s:seggrps) { + string list=""; + for (int j=0;j<s.second.size();j++){ + if (j>0) list+=","; + list +=toString(s.second[j].second); + } + cerr<<"segment "<<i<<" ["<<list<<"]"<<endl; + i++; + } + if (((int)parameters["levels"]->value)>0) { if (seggrps.size()>(int)parameters["levels"]->value){ while (seggrps.size()>(int)parameters["levels"]->value){ @@ -353,7 +386,7 @@ nned to retrieve total intensity by segment double avg=0.0; double dev=0.0; for (int k=0;k<seggrps[j].second.size();k++){ - avg+=k<seggrps[j].second[k].first; + avg+=seggrps[j].second[k].first; } avg/=seggrps[j].second.size(); for (int k=0;k<seggrps[j].second.size();k++){ @@ -370,7 +403,8 @@ nned to retrieve total intensity by segment std::sort(seggrps[largest].second.begin(),seggrps[largest].second.end(),sortgroupmembers); //create a new group std::pair<double,vector<pair<double,int> > > newgroup; - for (int j=seggrps[largest].second.size();j>seggrps[largest].second.size()/2;j--) { + cerr<<"splitting group "<<largest<<" with "<<seggrps[largest].second.size()<<" segments: new group will have "<<seggrps[largest].second.size()-(seggrps[largest].second.size()/2)<<" segments"<<endl; + for (int j=seggrps[largest].second.size()-1;j>(seggrps[largest].second.size()/2)-1;j--) { newgroup.second.push_back(seggrps[largest].second[j]); seggrps[largest].second.erase(seggrps[largest].second.begin()+j); } @@ -388,6 +422,7 @@ nned to retrieve total intensity by segment //add the new group seggrps.push_back(newgroup); + cerr<<" added new group with "<<newgroup.second.size()<<" segments"<<endl; } cerr<<"similaritity groups split, "<<seggrps.size()<<" levels total"<<endl; //seggrps are now out of order |
