# HG changeset patch # User matthiasm # Date 1402656777 -3600 # Node ID 01057d57dd9ac7234ae0ee350e5780b1eac9f1ad # Parent d1f89559321a4a194bf98c43bb1df88c82ce1078 pyin has now a parameter to go for precise timing (slow) or not (fast) diff -r d1f89559321a -r 01057d57dd9a LocalCandidatePYIN.cpp --- a/LocalCandidatePYIN.cpp Wed Apr 02 17:42:56 2014 +0100 +++ b/LocalCandidatePYIN.cpp Fri Jun 13 11:52:57 2014 +0100 @@ -42,10 +42,10 @@ m_blockSize(2048), m_fmin(40), m_fmax(700), - m_yin(2048, inputSampleRate, 0.0), m_oPitchTrackCandidates(0), m_threshDistr(2.0f), m_outputUnvoiced(0.0f), + m_preciseTime(0.0f), m_pitchProb(0), m_timestamp(0), m_nCandidate(13) @@ -165,6 +165,18 @@ d.valueNames.push_back("Yes, as negative frequencies"); list.push_back(d); + d.identifier = "precisetime"; + d.valueNames.clear(); + d.name = "Use non-standard precise YIN timing (slow)."; + d.description = "."; + d.unit = ""; + d.minValue = 0.0f; + d.maxValue = 1.0f; + d.defaultValue = 0.0f; + d.isQuantized = true; + d.quantizeStep = 1.0f; + list.push_back(d); + return list; } @@ -177,6 +189,9 @@ if (identifier == "outputunvoiced") { return m_outputUnvoiced; } + if (identifier == "precisetime") { + return m_preciseTime; + } return 0.f; } @@ -191,7 +206,10 @@ { m_outputUnvoiced = value; } - + if (identifier == "precisetime") + { + m_preciseTime = value; + } } LocalCandidatePYIN::ProgramList @@ -261,9 +279,6 @@ void LocalCandidatePYIN::reset() { - m_yin.setThresholdDistr(m_threshDistr); - m_yin.setFrameSize(m_blockSize); - m_pitchProb.clear(); m_timestamp.clear(); /* @@ -283,7 +298,8 @@ size_t yinBufferSize = m_blockSize/2; double* yinBuffer = new double[yinBufferSize]; - YinUtil::slowDifference(dInputBuffers, yinBuffer, yinBufferSize); + if (!m_preciseTime) YinUtil::fastDifference(dInputBuffers, yinBuffer, yinBufferSize); + else YinUtil::slowDifference(dInputBuffers, yinBuffer, yinBufferSize); delete [] dInputBuffers; diff -r d1f89559321a -r 01057d57dd9a LocalCandidatePYIN.h --- a/LocalCandidatePYIN.h Wed Apr 02 17:42:56 2014 +0100 +++ b/LocalCandidatePYIN.h Fri Jun 13 11:52:57 2014 +0100 @@ -61,12 +61,12 @@ size_t m_blockSize; float m_fmin; float m_fmax; - Yin m_yin; mutable int m_oPitchTrackCandidates; float m_threshDistr; float m_outputUnvoiced; + float m_preciseTime; vector > > m_pitchProb; vector m_timestamp; size_t m_nCandidate; diff -r d1f89559321a -r 01057d57dd9a PYinVamp.cpp --- a/PYinVamp.cpp Wed Apr 02 17:42:56 2014 +0100 +++ b/PYinVamp.cpp Fri Jun 13 11:52:57 2014 +0100 @@ -45,6 +45,7 @@ m_oNotes(0), m_threshDistr(2.0f), m_outputUnvoiced(0.0f), + m_preciseTime(0.0f), m_pitchProb(0), m_timestamp(0) { @@ -163,6 +164,19 @@ d.valueNames.push_back("Yes, as negative frequencies"); list.push_back(d); + d.identifier = "precisetime"; + d.valueNames.clear(); + d.name = "Use non-standard precise YIN timing (slow)."; + d.description = "."; + d.unit = ""; + d.minValue = 0.0f; + d.maxValue = 1.0f; + d.defaultValue = 0.0f; + d.isQuantized = true; + d.quantizeStep = 1.0f; + list.push_back(d); + + return list; } @@ -175,6 +189,9 @@ if (identifier == "outputunvoiced") { return m_outputUnvoiced; } + if (identifier == "precisetime") { + return m_preciseTime; + } return 0.f; } @@ -189,7 +206,10 @@ { m_outputUnvoiced = value; } - + if (identifier == "precisetime") + { + m_preciseTime = value; + } } PYinVamp::ProgramList @@ -341,6 +361,7 @@ { m_yin.setThresholdDistr(m_threshDistr); m_yin.setFrameSize(m_blockSize); + m_yin.setFast(!m_preciseTime); m_pitchProb.clear(); m_timestamp.clear(); diff -r d1f89559321a -r 01057d57dd9a PYinVamp.h --- a/PYinVamp.h Wed Apr 02 17:42:56 2014 +0100 +++ b/PYinVamp.h Fri Jun 13 11:52:57 2014 +0100 @@ -72,6 +72,7 @@ float m_threshDistr; float m_outputUnvoiced; + float m_preciseTime; vector > > m_pitchProb; vector m_timestamp; }; diff -r d1f89559321a -r 01057d57dd9a Yin.cpp --- a/Yin.cpp Wed Apr 02 17:42:56 2014 +0100 +++ b/Yin.cpp Fri Jun 13 11:52:57 2014 +0100 @@ -25,12 +25,13 @@ using std::vector; -Yin::Yin(size_t frameSize, size_t inputSampleRate, double thresh) : +Yin::Yin(size_t frameSize, size_t inputSampleRate, double thresh, bool fast) : m_frameSize(frameSize), m_inputSampleRate(inputSampleRate), m_thresh(thresh), m_threshDistr(2), - m_yinBufferSize(frameSize/2) + m_yinBufferSize(frameSize/2), + m_fast(fast) { if (frameSize & (frameSize-1)) { // throw "N must be a power of two"; @@ -45,9 +46,9 @@ Yin::process(const double *in) const { double* yinBuffer = new double[m_yinBufferSize]; - // calculate aperiodicity function for all periods - YinUtil::slowDifference(in, yinBuffer, m_yinBufferSize); + if (m_fast) YinUtil::fastDifference(in, yinBuffer, m_yinBufferSize); + else YinUtil::slowDifference(in, yinBuffer, m_yinBufferSize); YinUtil::cumulativeDifference(yinBuffer, m_yinBufferSize); int tau = 0; @@ -86,7 +87,9 @@ double* yinBuffer = new double[m_yinBufferSize]; // calculate aperiodicity function for all periods - YinUtil::slowDifference(in, yinBuffer, m_yinBufferSize); + if (m_fast) YinUtil::fastDifference(in, yinBuffer, m_yinBufferSize); + else YinUtil::slowDifference(in, yinBuffer, m_yinBufferSize); + YinUtil::cumulativeDifference(yinBuffer, m_yinBufferSize); vector peakProbability = YinUtil::yinProb(yinBuffer, m_threshDistr, m_yinBufferSize); @@ -138,6 +141,13 @@ return 0; } +int +Yin::setFast(bool fast) +{ + m_fast = fast; + return 0; +} + // int // Yin::setRemoveUnvoiced(bool parameter) // { diff -r d1f89559321a -r 01057d57dd9a Yin.h --- a/Yin.h Wed Apr 02 17:42:56 2014 +0100 +++ b/Yin.h Fri Jun 13 11:52:57 2014 +0100 @@ -31,7 +31,7 @@ class Yin { public: - Yin(size_t frameSize, size_t inputSampleRate, double thresh = 0.2); + Yin(size_t frameSize, size_t inputSampleRate, double thresh = 0.2, bool fast = true); virtual ~Yin(); struct YinOutput { @@ -53,6 +53,7 @@ int setThreshold(double parameter); int setThresholdDistr(float parameter); int setFrameSize(size_t frameSize); + int setFast(bool fast); // int setRemoveUnvoiced(bool frameSize); YinOutput process(const double *in) const; YinOutput processProbabilisticYin(const double *in) const; @@ -64,6 +65,7 @@ mutable double m_thresh; mutable size_t m_threshDistr; mutable size_t m_yinBufferSize; + mutable bool m_fast; // mutable bool m_removeUnvoiced; };