diff options
| author | Tim Redfern <tim@eclectronics.org> | 2013-12-10 13:05:22 +0000 |
|---|---|---|
| committer | Tim Redfern <tim@eclectronics.org> | 2013-12-10 13:05:22 +0000 |
| commit | 2261a9a1f146cf528e2b5142b531d14428c12f2e (patch) | |
| tree | f0c203ad3b9229d602c7870e3559367d5a191633 /rotord/src/nodes_audio_analysis.cpp | |
| parent | 979ace4891f439f6fef35db6c1b0a40e4d86b8de (diff) | |
similarity segmentation workingintensitysimilarity
Diffstat (limited to 'rotord/src/nodes_audio_analysis.cpp')
| -rw-r--r-- | rotord/src/nodes_audio_analysis.cpp | 69 |
1 files changed, 52 insertions, 17 deletions
diff --git a/rotord/src/nodes_audio_analysis.cpp b/rotord/src/nodes_audio_analysis.cpp index f077d41..faefb02 100644 --- a/rotord/src/nodes_audio_analysis.cpp +++ b/rotord/src/nodes_audio_analysis.cpp @@ -279,10 +279,17 @@ nned to retrieve total intensity by segment 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()); + //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[s.second[0]].first*=div; + + //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; + seggrps.erase(seggrps.begin()+s.second[j]); } } @@ -291,21 +298,49 @@ nned to retrieve total intensity by segment //sort the contents by intensity std::sort(seggrps.begin(),seggrps.end(),sortseggrps); //possible mergers will be with groups with adjacent intensity - while (seggrps.size()>(int)parameters["levels"]->value){ - //reduce similarity groups - //decide the best 2 to merge - vector<double> diffs; - for (int j=0;j<seggrps.size()-1;j++) diffs.push_back(seggrps[j+1].first-seggrps[j].first); - int smallest=0; - for (int j=1;j<diffs.size();j++) if (diffs[i]<diffs[smallest]) smallest=i; - for (int j=0;j<seggrps[smallest].second.size();j++) { - seggrps[smallest+1].second.push_back(seggrps[smallest].second[j]); + if (((int)parameters["levels"]->value)>0) { + while (seggrps.size()>(int)parameters["levels"]->value){ + //reduce similarity groups + //decide the best 2 to merge + vector<double> diffs; + for (int j=0;j<seggrps.size()-1;j++) diffs.push_back(seggrps[j+1].first-seggrps[j].first); + int smallest=0; + for (int j=1;j<diffs.size();j++) if (diffs[j]<diffs[smallest]) smallest=j; + for (int j=0;j<seggrps[smallest].second.size();j++) { + seggrps[smallest+1].second.push_back(seggrps[smallest].second[j]); + } + //recalculate intensity average + double avg=0.0f; + for (auto p:seggrps[smallest+1].second) avg+=p.first; + avg/=seggrps[smallest+1].second.size(); + seggrps[smallest+1].first=avg; + + seggrps.erase(seggrps.begin()+smallest); + } + cerr<<"intensities merged, "<<seggrps.size()<<" levels remain"<<endl; + while (seggrps.size()<min((int)parameters["levels"]->value,(int)totalsmap.size())) { + //split groups + //calculate standard deviation of intensity variation + vector<double> devs; + for (int j=0;j<seggrps.size()-1;j++) { + 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.size(); + for (int k=0;k<seggrps[j].second.size();k++){ + dev+=pow(avg-k<seggrps[j].second[k].first,2.0); + } + dev/=seggrps[j].second.size(); + devs.push_back(pow(dev,0.5)); + } + //find group with largest standard deviation + int largest=0; + for (int j=1;j<devs.size();j++) if (devs[j]>devs[largest]) largest=j; + //sanity check: if there are any groups that can be split they will have larger SD than singleton groups + //TODO actually split group } - seggrps.erase(seggrps.begin()+smallest); - } - cerr<<"intensities merged, "<<seggrps.size()<<" levels remain"<<endl; - while (seggrps.size()<(int)parameters["levels"]->value) { - //split groups } map<int,int> outputvalues; |
