Mercurial > hg > pyin
diff Yin.cpp @ 136:7cbf40306c10 vamp-fft-revision
Add state to YinUtil, prepare to use the Vamp FFT (but don't actually use it yet)
author | Chris Cannam |
---|---|
date | Fri, 19 Aug 2016 12:00:13 +0100 |
parents | 1b75e5fd4b99 |
children |
line wrap: on
line diff
--- a/Yin.cpp Fri Aug 19 11:31:57 2016 +0100 +++ b/Yin.cpp Fri Aug 19 12:00:13 2016 +0100 @@ -31,7 +31,8 @@ m_thresh(thresh), m_threshDistr(2), m_yinBufferSize(frameSize/2), - m_fast(fast) + m_fast(fast), + m_yinUtil(new YinUtil(m_yinBufferSize)) { if (frameSize & (frameSize-1)) { // throw "N must be a power of two"; @@ -40,6 +41,7 @@ Yin::~Yin() { + delete m_yinUtil; } Yin::YinOutput @@ -48,13 +50,13 @@ double* yinBuffer = new double[m_yinBufferSize]; // calculate aperiodicity function for all periods - if (m_fast) YinUtil::fastDifference(in, yinBuffer, m_yinBufferSize); - else YinUtil::slowDifference(in, yinBuffer, m_yinBufferSize); + if (m_fast) m_yinUtil->fastDifference(in, yinBuffer); + else m_yinUtil->slowDifference(in, yinBuffer); - YinUtil::cumulativeDifference(yinBuffer, m_yinBufferSize); + m_yinUtil->cumulativeDifference(yinBuffer); int tau = 0; - tau = YinUtil::absoluteThreshold(yinBuffer, m_yinBufferSize, m_thresh); + tau = m_yinUtil->absoluteThreshold(yinBuffer, m_thresh); double interpolatedTau; double aperiodicity; @@ -62,13 +64,13 @@ if (tau!=0) { - interpolatedTau = YinUtil::parabolicInterpolation(yinBuffer, abs(tau), m_yinBufferSize); + interpolatedTau = m_yinUtil->parabolicInterpolation(yinBuffer, abs(tau)); f0 = m_inputSampleRate * (1.0 / interpolatedTau); } else { interpolatedTau = 0; f0 = 0; } - double rms = std::sqrt(YinUtil::sumSquare(in, 0, m_yinBufferSize)/m_yinBufferSize); + double rms = std::sqrt(m_yinUtil->sumSquare(in, 0, m_yinBufferSize)/m_yinBufferSize); aperiodicity = yinBuffer[abs(tau)]; // std::cerr << aperiodicity << std::endl; if (tau < 0) f0 = -f0; @@ -89,12 +91,12 @@ double* yinBuffer = new double[m_yinBufferSize]; // calculate aperiodicity function for all periods - if (m_fast) YinUtil::fastDifference(in, yinBuffer, m_yinBufferSize); - else YinUtil::slowDifference(in, yinBuffer, m_yinBufferSize); + if (m_fast) m_yinUtil->fastDifference(in, yinBuffer); + else m_yinUtil->slowDifference(in, yinBuffer); - YinUtil::cumulativeDifference(yinBuffer, m_yinBufferSize); + m_yinUtil->cumulativeDifference(yinBuffer); - vector<double> peakProbability = YinUtil::yinProb(yinBuffer, m_threshDistr, m_yinBufferSize); + vector<double> peakProbability = m_yinUtil->yinProb(yinBuffer, m_threshDistr); // calculate overall "probability" from peak probability double probSum = 0; @@ -102,7 +104,7 @@ { probSum += peakProbability[iBin]; } - double rms = std::sqrt(YinUtil::sumSquare(in, 0, m_yinBufferSize)/m_yinBufferSize); + double rms = std::sqrt(m_yinUtil->sumSquare(in, 0, m_yinBufferSize)/m_yinBufferSize); Yin::YinOutput yo(0,0,rms); for (size_t iBuf = 0; iBuf < m_yinBufferSize; ++iBuf) { @@ -111,7 +113,7 @@ { double currentF0 = m_inputSampleRate * (1.0 / - YinUtil::parabolicInterpolation(yinBuffer, iBuf, m_yinBufferSize)); + m_yinUtil->parabolicInterpolation(yinBuffer, iBuf)); yo.freqProb.push_back(pair<double, double>(currentF0, peakProbability[iBuf])); } }