Mercurial > hg > pyin
changeset 34:5d43ce0eeeb8 tony
local candidates work -- still a bit of a hack.
author | matthiasm |
---|---|
date | Fri, 24 Jan 2014 13:16:49 +0000 |
parents | b8cc6a9720a0 |
children | 8e50e88417e6 4fb53b23d611 |
files | LocalCandidatePYIN.cpp |
diffstat | 1 files changed, 33 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/LocalCandidatePYIN.cpp Fri Jan 24 12:20:23 2014 +0000 +++ b/LocalCandidatePYIN.cpp Fri Jan 24 13:16:49 2014 +0000 @@ -296,7 +296,11 @@ { float minFrequency = m_fmin * std::pow(2,(3.0*iCandidate)/12); float maxFrequency = m_fmin * std::pow(2,(3.0*iCandidate+9)/12); - vector<double> peakProbability = YinUtil::yinProb(yinBuffer, m_threshDistr, yinBufferSize, m_inputSampleRate/maxFrequency, m_inputSampleRate/minFrequency); + vector<double> peakProbability = YinUtil::yinProb(yinBuffer, + m_threshDistr, + yinBufferSize, + m_inputSampleRate/maxFrequency, + m_inputSampleRate/minFrequency); vector<pair<double, double> > tempPitchProb; for (size_t iBuf = 0; iBuf < yinBufferSize; ++iBuf) @@ -355,9 +359,36 @@ freqMean[iCandidate] = freqSum[iCandidate]*1.0/freqNumber[iCandidate]; } + vector<size_t> duplicates; + for (size_t iCandidate = 0; iCandidate < m_nCandidate; ++iCandidate) { + for (size_t jCandidate = iCandidate+1; jCandidate < m_nCandidate; ++jCandidate) { + size_t countEqual = 0; + for (size_t iFrame = 0; iFrame < nFrame; ++iFrame) + { + if (fabs(pitchTracks[iCandidate][iFrame]/pitchTracks[jCandidate][iFrame]-1)<0.01) + countEqual++; + } + if (countEqual * 1.0 / nFrame > 0.8) { + if (freqNumber[iCandidate] > freqNumber[jCandidate]) { + duplicates.push_back(jCandidate); + } else { + duplicates.push_back(iCandidate); + } + } + } + } + int actualCandidateNumber = 0; for (size_t iCandidate = 0; iCandidate < m_nCandidate; ++iCandidate) { - if ((freqNumber[iCandidate] > 0.8 * nFrame) && (iCandidate == 0 || fabs(freqMean[iCandidate]/freqMean[iCandidate-1]-1)<0.01)) + bool isDuplicate = false; + for (size_t i = 0; i < duplicates.size(); ++i) { + std::cerr << duplicates[i] << std::endl; + if (duplicates[i] == iCandidate) { + isDuplicate = true; + break; + } + } + if (!isDuplicate && freqNumber[iCandidate] > 0.8*nFrame) { std::ostringstream convert; convert << actualCandidateNumber++;