changeset 60:60eb8771d340 tony

slower, but timestamp-unbiased pyin
author matthiasm
date Fri, 07 Mar 2014 10:43:55 +0000
parents b13d82111c8f
children d501b52f95b6 16129c3b1cf5
files LocalCandidatePYIN.cpp PYinVamp.cpp Yin.cpp YinUtil.cpp YinUtil.h YinVamp.cpp YinVampFreqConstrained.cpp
diffstat 7 files changed, 31 insertions(+), 21 deletions(-) [+]
line wrap: on
line diff
--- a/LocalCandidatePYIN.cpp	Thu Mar 06 16:48:27 2014 +0000
+++ b/LocalCandidatePYIN.cpp	Fri Mar 07 10:43:55 2014 +0000
@@ -265,10 +265,6 @@
     m_yin.setFrameSize(m_blockSize);
     
     m_pitchProb.clear();
-    for (size_t iCandidate = 0; iCandidate < m_nCandidate; ++iCandidate)
-    {
-        m_pitchProb.push_back(vector<pair<double, double> >());
-    }
     m_timestamp.clear();
 /*    
     std::cerr << "LocalCandidatePYIN::reset"
@@ -280,16 +276,14 @@
 LocalCandidatePYIN::FeatureSet
 LocalCandidatePYIN::process(const float *const *inputBuffers, RealTime timestamp)
 {
-    // I don't understand why I should have to make this very weird 11 
-    // step-size left-shift, but it does get it in sync with the normal pYIN
-    timestamp = timestamp - Vamp::RealTime::frame2RealTime(11 * m_stepSize, lrintf(m_inputSampleRate));
+    timestamp = timestamp + Vamp::RealTime::frame2RealTime(m_blockSize/2, lrintf(m_inputSampleRate));
     
     double *dInputBuffers = new double[m_blockSize];
     for (size_t i = 0; i < m_blockSize; ++i) dInputBuffers[i] = inputBuffers[0][i];
     
     size_t yinBufferSize = m_blockSize/2;
     double* yinBuffer = new double[yinBufferSize];
-    YinUtil::fastDifference(dInputBuffers, yinBuffer, yinBufferSize);    
+    YinUtil::slowDifference(dInputBuffers, yinBuffer, yinBufferSize);    
     
     delete [] dInputBuffers;
 
@@ -351,7 +345,7 @@
         vector<vector<pair<double,double> > > tempPitchProb;
         float centrePitch = 45 + 3 * iCandidate;
         for (size_t iFrame = 0; iFrame < nFrame; ++iFrame) {
-            tempPitchProb.push_back(vector<pair<double,double> >(0));
+            tempPitchProb.push_back(vector<pair<double,double> >());
             float sumProb = 0;
             float pitch = 0;
             float prob = 0;
@@ -410,17 +404,12 @@
         }
     }
 
-    // std::cerr << "n duplicate: " << duplicates.size() << std::endl;    
-    for (size_t iDup = 0; iDup < duplicates.size(); ++ iDup) {
-        // std::cerr << "duplicate: " << iDup << std::endl;
-    }
-
     // now find non-duplicate pitch tracks
     map<int, int> candidateActuals;
     map<int, std::string> candidateLabels;
 
     vector<vector<float> > outputFrequencies;
-    for (size_t iFrame = 0; iFrame < nFrame; ++iFrame) outputFrequencies.push_back(vector<float>(0));
+    for (size_t iFrame = 0; iFrame < nFrame; ++iFrame) outputFrequencies.push_back(vector<float>());
 
     int actualCandidateNumber = 0;
     for (size_t iCandidate = 0; iCandidate < m_nCandidate; ++iCandidate) {
@@ -446,6 +435,8 @@
                     // featureValues[m_timestamp[iFrame]][iCandidate] = 
                     //     pitchTracks[iCandidate][iFrame];
                     outputFrequencies[iFrame].push_back(pitchTracks[iCandidate][iFrame]);
+                } else {
+                    outputFrequencies[iFrame].push_back(0);
                 }
             }
         }
--- a/PYinVamp.cpp	Thu Mar 06 16:48:27 2014 +0000
+++ b/PYinVamp.cpp	Fri Mar 07 10:43:55 2014 +0000
@@ -354,7 +354,7 @@
 PYinVamp::FeatureSet
 PYinVamp::process(const float *const *inputBuffers, RealTime timestamp)
 {
-    timestamp = timestamp + Vamp::RealTime::frame2RealTime(m_blockSize/4, lrintf(m_inputSampleRate));
+    timestamp = timestamp + Vamp::RealTime::frame2RealTime(m_blockSize/2, lrintf(m_inputSampleRate));
     FeatureSet fs;
     
     float rms = 0;
--- a/Yin.cpp	Thu Mar 06 16:48:27 2014 +0000
+++ b/Yin.cpp	Fri Mar 07 10:43:55 2014 +0000
@@ -47,7 +47,7 @@
     double* yinBuffer = new double[m_yinBufferSize];
 
     // calculate aperiodicity function for all periods
-    YinUtil::fastDifference(in, yinBuffer, m_yinBufferSize);    
+    YinUtil::slowDifference(in, yinBuffer, m_yinBufferSize);    
     YinUtil::cumulativeDifference(yinBuffer, m_yinBufferSize);
 
     int tau = 0;
@@ -86,7 +86,7 @@
     double* yinBuffer = new double[m_yinBufferSize];
 
     // calculate aperiodicity function for all periods
-    YinUtil::fastDifference(in, yinBuffer, m_yinBufferSize);    
+    YinUtil::slowDifference(in, yinBuffer, m_yinBufferSize);    
     YinUtil::cumulativeDifference(yinBuffer, m_yinBufferSize);
 
     vector<double> peakProbability = YinUtil::yinProb(yinBuffer, m_threshDistr, m_yinBufferSize);
@@ -151,7 +151,7 @@
     double* yinBuffer = new double[m_yinBufferSize];
 
     // calculate aperiodicity function for all periods
-    YinUtil::fastDifference(in, yinBuffer, m_yinBufferSize);    
+    YinUtil::slowDifference(in, yinBuffer, m_yinBufferSize);    
     YinUtil::cumulativeDifference(yinBuffer, m_yinBufferSize);
     
     int minPeriod = m_inputSampleRate / maxFreq;
--- a/YinUtil.cpp	Thu Mar 06 16:48:27 2014 +0000
+++ b/YinUtil.cpp	Fri Mar 07 10:43:55 2014 +0000
@@ -22,6 +22,24 @@
 #include <boost/math/distributions.hpp>
 
 void 
+YinUtil::slowDifference(const double *in, double *yinBuffer, const size_t yinBufferSize) 
+{
+    yinBuffer[0] = 0;
+    double delta ;
+    int startPoint = 0;
+    int endPoint = 0;
+    for (int i = 1; i < yinBufferSize; ++i) {
+        yinBuffer[i] = 0;
+        startPoint = yinBufferSize/2 - i/2;
+        endPoint = startPoint + yinBufferSize;
+        for (int j = startPoint; j < endPoint; ++j) {
+            delta = in[i+j] - in[j];
+            yinBuffer[i] += delta * delta;
+        }
+    }    
+}
+
+void 
 YinUtil::fastDifference(const double *in, double *yinBuffer, const size_t yinBufferSize) 
 {
     
--- a/YinUtil.h	Thu Mar 06 16:48:27 2014 +0000
+++ b/YinUtil.h	Fri Mar 07 10:43:55 2014 +0000
@@ -31,6 +31,7 @@
     static double sumSquare(const double *in, const size_t startInd, const size_t endInd);
     static void difference(const double *in, double *yinBuffer, const size_t yinBufferSize);
     static void fastDifference(const double *in, double *yinBuffer, const size_t yinBufferSize);
+    static void slowDifference(const double *in, double *yinBuffer, const size_t yinBufferSize);
     static void cumulativeDifference(double *yinBuffer, const size_t yinBufferSize);
     static int absoluteThreshold(const double *yinBuffer, const size_t yinBufferSize, const double thresh);
     static vector<double> yinProb(const double *yinBuffer, const size_t prior, const size_t yinBufferSize, size_t minTau = 0, size_t maxTau = 0);
--- a/YinVamp.cpp	Thu Mar 06 16:48:27 2014 +0000
+++ b/YinVamp.cpp	Fri Mar 07 10:43:55 2014 +0000
@@ -306,7 +306,7 @@
 YinVamp::FeatureSet
 YinVamp::process(const float *const *inputBuffers, RealTime timestamp)
 {
-    timestamp = timestamp + Vamp::RealTime::frame2RealTime(m_blockSize/4, lrintf(m_inputSampleRate));
+    timestamp = timestamp + Vamp::RealTime::frame2RealTime(m_blockSize/2, lrintf(m_inputSampleRate));
     FeatureSet fs;
     
     double *dInputBuffers = new double[m_blockSize];
--- a/YinVampFreqConstrained.cpp	Thu Mar 06 16:48:27 2014 +0000
+++ b/YinVampFreqConstrained.cpp	Fri Mar 07 10:43:55 2014 +0000
@@ -244,7 +244,7 @@
 YinVampFreqConstrained::FeatureSet
 YinVampFreqConstrained::process(const float *const *inputBuffers, RealTime timestamp)
 {
-    timestamp = timestamp + Vamp::RealTime::frame2RealTime(m_blockSize/4, lrintf(m_inputSampleRate));
+    timestamp = timestamp + Vamp::RealTime::frame2RealTime(m_blockSize/2, lrintf(m_inputSampleRate));
     FeatureSet fs;
     
     double *dInputBuffers = new double[m_blockSize];