diff segmentino/Segmentino.cpp @ 56:e2e09a2196a9

Add individual arma:: using declarations
author Chris Cannam
date Thu, 13 Jun 2013 12:43:08 +0100
parents 6eef91b899b7
children 6be9479ad11f
line wrap: on
line diff
--- a/segmentino/Segmentino.cpp	Thu Jun 13 12:31:32 2013 +0100
+++ b/segmentino/Segmentino.cpp	Thu Jun 13 12:43:08 2013 +0100
@@ -36,6 +36,27 @@
 
 #include <vamp-sdk/Plugin.h>
 
+using arma::colvec;
+using arma::conv;
+using arma::cor;
+using arma::cube;
+using arma::eye;
+using arma::imat;
+using arma::irowvec;
+using arma::linspace;
+using arma::mat;
+using arma::max;
+using arma::ones;
+using arma::rowvec;
+using arma::sort;
+using arma::span;
+using arma::sum;
+using arma::trans;
+using arma::uvec;
+using arma::uword;
+using arma::vec;
+using arma::zeros;
+
 using std::string;
 using std::vector;
 using std::cerr;
@@ -1186,16 +1207,16 @@
 /* -------------------------------- */
 
 // one-dimesion median filter
-arma::vec medfilt1(arma::vec v, int medfilt_length)
+vec medfilt1(vec v, int medfilt_length)
 {    
     // TODO: check if this works with odd and even medfilt_length !!!
     int halfWin = medfilt_length/2;
     
     // result vector
-    arma::vec res = arma::zeros<arma::vec>(v.size());
+    vec res = zeros<vec>(v.size());
     
     // padding 
-    arma::vec padV = arma::zeros<arma::vec>(v.size()+medfilt_length-1);
+    vec padV = zeros<vec>(v.size()+medfilt_length-1);
     
     for (int i=medfilt_length/2; i < medfilt_length/2+(int)v.size(); ++ i)
     {
@@ -1210,7 +1231,7 @@
     
     
     // Median filter
-    arma::vec win = arma::zeros<arma::vec>(medfilt_length);
+    vec win = zeros<vec>(medfilt_length);
     
     for (int i=0; i < (int)v.size(); ++i)
     {
@@ -1224,12 +1245,12 @@
 
 
 // Quantile
-double quantile(arma::vec v, double p)
+double quantile(vec v, double p)
 {
-    arma::vec sortV = arma::sort(v);
+    vec sortV = sort(v);
     int n = sortV.size();
-    arma::vec x = arma::zeros<arma::vec>(n+2);
-    arma::vec y = arma::zeros<arma::vec>(n+2);
+    vec x = zeros<vec>(n+2);
+    vec y = zeros<vec>(n+2);
     
     x(0) = 0;
     x(n+1) = 100; 
@@ -1241,7 +1262,7 @@
     y.subvec(1,n) = sortV;
     y(n+1) = sortV(n-1);
     
-    arma::uvec x2index = find(x>=p*100);
+    uvec x2index = find(x>=p*100);
     
     // Interpolation
     double x1 = x(x2index(0)-1);
@@ -1255,13 +1276,13 @@
 }
 
 // Max Filtering
-arma::mat maxfilt1(arma::mat inmat, int len)
+mat maxfilt1(mat inmat, int len)
 {
-    arma::mat outmat = inmat;
+    mat outmat = inmat;
     
     for (int i=0; i < (int)inmat.n_rows; ++i)
     {
-        if (arma::sum(inmat.row(i)) > 0)
+        if (sum(inmat.row(i)) > 0)
         {
             // Take a window of rows
             int startWin;
@@ -1277,18 +1298,19 @@
             else
                 endWin = i+len-1;
     
-            outmat(i,arma::span::all) = 
-                arma::max(inmat(arma::span(startWin,endWin),arma::span::all));
+            outmat(i,span::all) = 
+                max(inmat(span(startWin,endWin),span::all));
         }
     }
     
     return outmat;
+    
 }
 
 // Null Parts
-Part nullpart(vector<Part> parts, arma::vec barline)
+Part nullpart(vector<Part> parts, vec barline)
 {
-    arma::uvec nullindices = arma::ones<arma::uvec>(barline.size());
+    uvec nullindices = ones<uvec>(barline.size());
     for (int iPart=0; iPart<(int)parts.size(); ++iPart)
     {
         //for (int iIndex=0; iIndex < parts[0].indices.size(); ++iIndex) 
@@ -1302,7 +1324,7 @@
 
     Part newPart;
     newPart.n = 1;
-    arma::uvec q = find(nullindices > 0);
+    uvec q = find(nullindices > 0);
     
     for (int i=0; i<(int)q.size();++i) 
         newPart.indices.push_back(q(i));
@@ -1399,7 +1421,7 @@
         return parts;
     }
 
-    arma::irowvec timeStamp = arma::zeros<arma::imat>(1,nBeat);       // Vector of Time Stamps
+    irowvec timeStamp = zeros<imat>(1,nBeat);       // Vector of Time Stamps
     
     // Save time stamp as a Vector
     if (quantisedChromagram[0].hasTimestamp)
@@ -1410,7 +1432,7 @@
     
     
     // Build a ObservationTOFeatures Matrix
-    arma::mat featVal = arma::zeros<arma::mat>(nBeat,nFeatValues/2);
+    mat featVal = zeros<mat>(nBeat,nFeatValues/2);
     
     for (int i = 0; i < nBeat; ++ i)
         for (int j = 0; j < nFeatValues/2; ++ j)
@@ -1419,10 +1441,10 @@
         }
     
     // Set to arbitrary value to feature vectors with low std
-    arma::mat a = stddev(featVal,1,1);
+    mat a = stddev(featVal,1,1);
     
     // Feature Correlation Matrix
-    arma::mat simmat0 = 1-arma::cor(arma::trans(featVal));
+    mat simmat0 = 1-cor(trans(featVal));
     
 
     for (int i = 0; i < nBeat; ++ i)
@@ -1439,7 +1461,7 @@
         }
     }
     
-    arma::mat simmat = 1-simmat0/2;
+    mat simmat = 1-simmat0/2;
     
     // -------- To delate when the proble with the add of beat will be solved -------
     for (int i = 0; i < nBeat; ++ i)
@@ -1450,11 +1472,11 @@
     
     // Median Filtering applied to the Correlation Matrix
     // The median filter is for each diagonal of the Matrix
-    arma::mat median_simmat = arma::zeros<arma::mat>(nBeat,nBeat);
+    mat median_simmat = zeros<mat>(nBeat,nBeat);
     
     for (int i = 0; i < nBeat; ++ i)
     {
-        arma::vec temp = medfilt1(simmat.diag(i),medfilt_length);
+        vec temp = medfilt1(simmat.diag(i),medfilt_length);
         median_simmat.diag(i) = temp;
         median_simmat.diag(-i) = temp;
     }
@@ -1473,20 +1495,20 @@
     // --------------------------------------------------------
     
     // Retrieve Bar Bounderies
-    arma::uvec dup = find(median_simmat > thresh_beat);
-    arma::mat potential_duplicates = arma::zeros<arma::mat>(nBeat,nBeat);
-    potential_duplicates.elem(dup) = arma::ones<arma::vec>(dup.size());
+    uvec dup = find(median_simmat > thresh_beat);
+    mat potential_duplicates = zeros<mat>(nBeat,nBeat);
+    potential_duplicates.elem(dup) = ones<vec>(dup.size());
     potential_duplicates = trimatu(potential_duplicates);
     
     int nPartlengths = round((maxlength-minlength)/4)+1;
-    arma::vec partlengths = arma::zeros<arma::vec>(nPartlengths);
+    vec partlengths = zeros<vec>(nPartlengths);
     
     for (int i = 0; i < nPartlengths; ++ i)
         partlengths(i) = (i*4) + minlength;
     
     // initialise arrays
-    arma::cube simArray = arma::zeros<arma::cube>(nBeat,nBeat,nPartlengths);
-    arma::cube decisionArray2 = arma::zeros<arma::cube>(nBeat,nBeat,nPartlengths);
+    cube simArray = zeros<cube>(nBeat,nBeat,nPartlengths);
+    cube decisionArray2 = zeros<cube>(nBeat,nBeat,nPartlengths);
 
     for (int iLength = 0; iLength < nPartlengths; ++ iLength)
     // for (int iLength = 0; iLength < 20; ++ iLength)
@@ -1498,36 +1520,36 @@
         
         for (int iBeat = 0; iBeat < nUsedBeat; ++ iBeat)   // looping over all columns (arbitrarily chosen columns)
         {
-            arma::uvec help2 = find(potential_duplicates(arma::span(0,nUsedBeat-1),iBeat)==1);
+            uvec help2 = find(potential_duplicates(span(0,nUsedBeat-1),iBeat)==1);
             
             for (int i=0; i < (int)help2.size(); ++i)
             {
 
                 // measure how well two length len segments go together
                 int kBeat = help2(i);
-                arma::vec distrib = median_simmat(arma::span(iBeat,iBeat+len-1), arma::span(kBeat,kBeat+len-1)).diag(0);
+                vec distrib = median_simmat(span(iBeat,iBeat+len-1), span(kBeat,kBeat+len-1)).diag(0);
                 simArray(iBeat,kBeat,iLength) = quantile(distrib,quantilePerc);
             }
         }
         
-        arma::mat tempM = simArray(arma::span(0,nUsedBeat-1), arma::span(0,nUsedBeat-1), arma::span(iLength,iLength));
-        simArray.slice(iLength)(arma::span(0,nUsedBeat-1), arma::span(0,nUsedBeat-1)) = tempM + arma::trans(tempM) - (arma::eye<arma::mat>(nUsedBeat,nUsedBeat)%tempM); 
+        mat tempM = simArray(span(0,nUsedBeat-1), span(0,nUsedBeat-1), span(iLength,iLength));
+        simArray.slice(iLength)(span(0,nUsedBeat-1), span(0,nUsedBeat-1)) = tempM + trans(tempM) - (eye<mat>(nUsedBeat,nUsedBeat)%tempM); 
         
         // convolution
-        arma::vec K = arma::zeros<arma::vec>(3);
+        vec K = zeros<vec>(3);
         K << 0.01 << 0.98 << 0.01;
         
         
         for (int i=0; i < (int)simArray.n_rows; ++i)
         {
-            arma::rowvec t = arma::conv((arma::rowvec)simArray.slice(iLength).row(i),K);
-            simArray.slice(iLength)(i, arma::span::all) = t.subvec(1,t.size()-2);
+            rowvec t = conv((rowvec)simArray.slice(iLength).row(i),K);
+            simArray.slice(iLength)(i, span::all) = t.subvec(1,t.size()-2);
         }
  
         // take only over-average bars that do not overlap
         
-        arma::mat temp = arma::zeros<arma::mat>(simArray.n_rows, simArray.n_cols);
-        temp(arma::span::all, arma::span(0,nUsedBeat-1)) = simArray.slice(iLength)(arma::span::all, arma::span(0,nUsedBeat-1));
+        mat temp = zeros<mat>(simArray.n_rows, simArray.n_cols);
+        temp(span::all, span(0,nUsedBeat-1)) = simArray.slice(iLength)(span::all, span(0,nUsedBeat-1));
         
         for (int i=0; i < (int)temp.n_rows; ++i)
             for (int j=0; j < nUsedBeat; ++j)
@@ -1536,14 +1558,14 @@
         
         decisionArray2.slice(iLength) = temp;
 
-        arma::mat maxMat = maxfilt1(decisionArray2.slice(iLength),len-1);
+        mat maxMat = maxfilt1(decisionArray2.slice(iLength),len-1);
         
         for (int i=0; i < (int)decisionArray2.n_rows; ++i)
             for (int j=0; j < (int)decisionArray2.n_cols; ++j)
                 if (decisionArray2.slice(iLength)(i,j) < maxMat(i,j))
                     decisionArray2.slice(iLength)(i,j) = 0;
         
-        decisionArray2.slice(iLength) = decisionArray2.slice(iLength) % arma::trans(decisionArray2.slice(iLength));
+        decisionArray2.slice(iLength) = decisionArray2.slice(iLength) % trans(decisionArray2.slice(iLength));
         
         for (int i=0; i < (int)simArray.n_rows; ++i)
             for (int j=0; j < (int)simArray.n_cols; ++j)
@@ -1553,23 +1575,23 @@
     
     // Milk the data
     
-    arma::mat bestval;
+    mat bestval;
     
     for (int iLength=0; iLength<nPartlengths; ++iLength)
     {
-        arma::mat temp = arma::zeros<arma::mat>(decisionArray2.n_rows,decisionArray2.n_cols);
+        mat temp = zeros<mat>(decisionArray2.n_rows,decisionArray2.n_cols);
 
        for (int rows=0; rows < (int)decisionArray2.n_rows; ++rows)
             for (int cols=0; cols < (int)decisionArray2.n_cols; ++cols)
                 if (decisionArray2.slice(iLength)(rows,cols) > 0)
                     temp(rows,cols) = 1;
         
-        arma::vec currLogicSum = arma::sum(temp,1);
+        vec currLogicSum = sum(temp,1);
         
         for (int iBeat=0; iBeat < nBeat; ++iBeat)
             if (currLogicSum(iBeat) > 1)
             {
-                arma::vec t = decisionArray2.slice(iLength)(arma::span::all,iBeat);
+                vec t = decisionArray2.slice(iLength)(span::all,iBeat);
                 double currSum = sum(t);
                 
                 int count = 0;
@@ -1579,7 +1601,7 @@
                 
                 currSum = (currSum/count)/2;
                 
-                arma::rowvec t1;
+                rowvec t1;
                 t1 << (currLogicSum(iBeat)-1) * partlengths(iLength) << currSum << iLength << iBeat << currLogicSum(iBeat);
                 
                 bestval = join_cols(bestval,t1);
@@ -1593,14 +1615,14 @@
     
     char partletters[] = {'A','B','C','D','E','F','G', 'H','I','J','K','L','M','N','O','P','Q','R','S'};
     int partvalues[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19};
-    arma::vec valid_sets = arma::ones<arma::vec>(bestval.n_rows);
+    vec valid_sets = ones<vec>(bestval.n_rows);
     
     if (!bestval.is_empty())
     {
         
         // In questo punto viene introdotto un errore alla 3 cifra decimale
         
-        arma::colvec t = arma::zeros<arma::colvec>(bestval.n_rows);
+        colvec t = zeros<colvec>(bestval.n_rows);
         for (int i=0; i < (int)bestval.n_rows; ++i)
         {
             t(i) = bestval(i,1)*2;
@@ -1608,49 +1630,49 @@
         
         double m = t.max();
         
-        bestval(arma::span::all,1) = bestval(arma::span::all,1) / m; 
-        bestval(arma::span::all,0) = bestval(arma::span::all,0) + bestval(arma::span::all,1);
+        bestval(span::all,1) = bestval(span::all,1) / m; 
+        bestval(span::all,0) = bestval(span::all,0) + bestval(span::all,1);
         
-        arma::mat bestval2;
+        mat bestval2;
         for (int i=0; i < (int)bestval.n_cols; ++i)
             if (i!=1)
                 bestval2 = join_rows(bestval2,bestval.col(i));
         
         for (int kSeg=0; kSeg<6; ++kSeg)
         {
-            arma::mat currbestvals = arma::zeros<arma::mat>(bestval2.n_rows, bestval2.n_cols);
+            mat currbestvals = zeros<mat>(bestval2.n_rows, bestval2.n_cols);
             for (int i=0; i < (int)bestval2.n_rows; ++i)
                 for (int j=0; j < (int)bestval2.n_cols; ++j)
                     if (valid_sets(i))
                         currbestvals(i,j) = bestval2(i,j);
             
-            arma::vec t1 = currbestvals.col(0);
+            vec t1 = currbestvals.col(0);
             double ma;
-            arma::uword maIdx;
+            uword maIdx;
             ma = t1.max(maIdx);
             
             if ((maIdx == 0)&&(ma == 0))
                 break;
 
             int bestLength = lrint(partlengths(currbestvals(maIdx,1)));
-            arma::rowvec bestIndices = decisionArray2.slice(currbestvals(maIdx,1))(currbestvals(maIdx,2), arma::span::all);
+            rowvec bestIndices = decisionArray2.slice(currbestvals(maIdx,1))(currbestvals(maIdx,2), span::all);
                 
-            arma::rowvec bestIndicesMap = arma::zeros<arma::rowvec>(bestIndices.size());
+            rowvec bestIndicesMap = zeros<rowvec>(bestIndices.size());
             for (int i=0; i < (int)bestIndices.size(); ++i)
                 if (bestIndices(i)>0)
                     bestIndicesMap(i) = 1;
                    
-            arma::rowvec mask = arma::zeros<arma::rowvec>(bestLength*2-1);
+            rowvec mask = zeros<rowvec>(bestLength*2-1);
             for (int i=0; i<bestLength; ++i)
                 mask(i+bestLength-1) = 1;
             
-            arma::rowvec t2 = arma::conv(bestIndicesMap,mask); 
-            arma::rowvec island = t2.subvec(mask.size()/2,t2.size()-1-mask.size()/2);
+            rowvec t2 = conv(bestIndicesMap,mask); 
+            rowvec island = t2.subvec(mask.size()/2,t2.size()-1-mask.size()/2);
             
             // Save results in the structure
             Part newPart;
             newPart.n = bestLength;
-            arma::uvec q1 = find(bestIndices > 0);
+            uvec q1 = find(bestIndices > 0);
             
             for (int i=0; i < (int)q1.size();++i)
                 newPart.indices.push_back(q1(i));
@@ -1660,28 +1682,28 @@
             newPart.level = kSeg+1;
             parts.push_back(newPart);
             
-            arma::uvec q2 = find(valid_sets==1);
+            uvec q2 = find(valid_sets==1);
             
             for (int i=0; i < (int)q2.size(); ++i)
             {
                 int iSet = q2(i);
                 int s = partlengths(bestval2(iSet,1));
                 
-                arma::rowvec mask1 = arma::zeros<arma::rowvec>(s*2-1);
+                rowvec mask1 = zeros<rowvec>(s*2-1);
                 for (int i=0; i<s; ++i)
                     mask1(i+s-1) = 1;
                 
-                arma::rowvec Ind = decisionArray2.slice(bestval2(iSet,1))(bestval2(iSet,2), arma::span::all);
-                arma::rowvec IndMap = arma::zeros<arma::rowvec>(Ind.size());
+                rowvec Ind = decisionArray2.slice(bestval2(iSet,1))(bestval2(iSet,2), span::all);
+                rowvec IndMap = zeros<rowvec>(Ind.size());
                 for (int i=0; i < (int)Ind.size(); ++i)
                     if (Ind(i)>0)
                         IndMap(i) = 2;
                 
-                arma::rowvec t3 = arma::conv(IndMap,mask1); 
-                arma::rowvec currislands = t3.subvec(mask1.size()/2,t3.size()-1-mask1.size()/2);       
-                arma::rowvec islandsdMult = currislands%island;
+                rowvec t3 = conv(IndMap,mask1); 
+                rowvec currislands = t3.subvec(mask1.size()/2,t3.size()-1-mask1.size()/2);       
+                rowvec islandsdMult = currislands%island;
                 
-                arma::uvec islandsIndex = find(islandsdMult > 0);
+                uvec islandsIndex = find(islandsdMult > 0);
                 
                 if (islandsIndex.size() > 0)
                     valid_sets(iSet) = 0;
@@ -1699,7 +1721,7 @@
         parts.push_back(newPart);
     }
    
-    arma::vec bar = arma::linspace(1,nBeat,nBeat);    
+    vec bar = linspace(1,nBeat,nBeat);    
     Part np = nullpart(parts,bar);
     
     parts.push_back(np);
@@ -1735,7 +1757,7 @@
     int nBeat = quantisedChromagram.size();                      // Number of feature vector
     int nFeatValues = quantisedChromagram[0].values.size();      // Number of values for each feature vector
 
-    arma::mat synchTreble = arma::zeros<arma::mat>(nBeat,nFeatValues/2);
+    mat synchTreble = zeros<mat>(nBeat,nFeatValues/2);
     
     for (int i = 0; i < nBeat; ++ i)
         for (int j = 0; j < nFeatValues/2; ++ j)
@@ -1743,7 +1765,7 @@
             synchTreble(i,j) = quantisedChromagram[i].values[j];
         }
     
-    arma::mat synchBass = arma::zeros<arma::mat>(nBeat,nFeatValues/2);
+    mat synchBass = zeros<mat>(nBeat,nFeatValues/2);
     
     for (int i = 0; i < nBeat; ++ i)
         for (int j = 0; j < nFeatValues/2; ++ j)
@@ -1753,8 +1775,8 @@
 
     // Process
     
-    arma::mat segTreble = arma::zeros<arma::mat>(quantisedChromagram.size(),quantisedChromagram[0].values.size()/2);
-    arma::mat segBass = arma::zeros<arma::mat>(quantisedChromagram.size(),quantisedChromagram[0].values.size()/2);
+    mat segTreble = zeros<mat>(quantisedChromagram.size(),quantisedChromagram[0].values.size()/2);
+    mat segBass = zeros<mat>(quantisedChromagram.size(),quantisedChromagram[0].values.size()/2);
     
     for (int iPart=0; iPart < (int)parts.size(); ++iPart)
     {
@@ -1872,7 +1894,7 @@
     
     Feature seg;
     
-    arma::vec indices;
+    vec indices;
 //    int idx=0;
     vector<int> values;
     vector<string> letters;