Mercurial > hg > pyin
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];