Mercurial > hg > pyin
comparison LocalCandidatePYIN.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 | c3a4aa614e33 |
children | d71170f5ba76 |
comparison
equal
deleted
inserted
replaced
135:2c73618b4067 | 136:7cbf40306c10 |
---|---|
46 m_threshDistr(2.0f), | 46 m_threshDistr(2.0f), |
47 m_outputUnvoiced(0.0f), | 47 m_outputUnvoiced(0.0f), |
48 m_preciseTime(0.0f), | 48 m_preciseTime(0.0f), |
49 m_pitchProb(0), | 49 m_pitchProb(0), |
50 m_timestamp(0), | 50 m_timestamp(0), |
51 m_nCandidate(13) | 51 m_nCandidate(13), |
52 m_yinUtil(0) | |
52 { | 53 { |
53 } | 54 } |
54 | 55 |
55 LocalCandidatePYIN::~LocalCandidatePYIN() | 56 LocalCandidatePYIN::~LocalCandidatePYIN() |
56 { | 57 { |
58 delete m_yinUtil; | |
57 } | 59 } |
58 | 60 |
59 string | 61 string |
60 LocalCandidatePYIN::getIdentifier() const | 62 LocalCandidatePYIN::getIdentifier() const |
61 { | 63 { |
266 << std::endl; | 268 << std::endl; |
267 */ | 269 */ |
268 m_channels = channels; | 270 m_channels = channels; |
269 m_stepSize = stepSize; | 271 m_stepSize = stepSize; |
270 m_blockSize = blockSize; | 272 m_blockSize = blockSize; |
273 | |
274 m_yinUtil = new YinUtil(m_blockSize/2); | |
271 | 275 |
272 reset(); | 276 reset(); |
273 | 277 |
274 return true; | 278 return true; |
275 } | 279 } |
295 double *dInputBuffers = new double[m_blockSize]; | 299 double *dInputBuffers = new double[m_blockSize]; |
296 for (size_t i = 0; i < m_blockSize; ++i) dInputBuffers[i] = inputBuffers[0][i]; | 300 for (size_t i = 0; i < m_blockSize; ++i) dInputBuffers[i] = inputBuffers[0][i]; |
297 | 301 |
298 size_t yinBufferSize = m_blockSize/2; | 302 size_t yinBufferSize = m_blockSize/2; |
299 double* yinBuffer = new double[yinBufferSize]; | 303 double* yinBuffer = new double[yinBufferSize]; |
300 if (!m_preciseTime) YinUtil::fastDifference(dInputBuffers, yinBuffer, yinBufferSize); | 304 if (!m_preciseTime) m_yinUtil->fastDifference(dInputBuffers, yinBuffer); |
301 else YinUtil::slowDifference(dInputBuffers, yinBuffer, yinBufferSize); | 305 else m_yinUtil->slowDifference(dInputBuffers, yinBuffer); |
302 | 306 |
303 delete [] dInputBuffers; | 307 delete [] dInputBuffers; |
304 | 308 |
305 YinUtil::cumulativeDifference(yinBuffer, yinBufferSize); | 309 m_yinUtil->cumulativeDifference(yinBuffer); |
306 | 310 |
307 float minFrequency = 60; | 311 float minFrequency = 60; |
308 float maxFrequency = 900; | 312 float maxFrequency = 900; |
309 vector<double> peakProbability = YinUtil::yinProb(yinBuffer, | 313 vector<double> peakProbability = m_yinUtil->yinProb(yinBuffer, |
310 m_threshDistr, | 314 m_threshDistr, |
311 yinBufferSize, | 315 m_inputSampleRate/maxFrequency, |
312 m_inputSampleRate/maxFrequency, | 316 m_inputSampleRate/minFrequency); |
313 m_inputSampleRate/minFrequency); | |
314 | 317 |
315 vector<pair<double, double> > tempPitchProb; | 318 vector<pair<double, double> > tempPitchProb; |
316 for (size_t iBuf = 0; iBuf < yinBufferSize; ++iBuf) | 319 for (size_t iBuf = 0; iBuf < yinBufferSize; ++iBuf) |
317 { | 320 { |
318 if (peakProbability[iBuf] > 0) | 321 if (peakProbability[iBuf] > 0) |
319 { | 322 { |
320 double currentF0 = | 323 double currentF0 = |
321 m_inputSampleRate * (1.0 / | 324 m_inputSampleRate * (1.0 / |
322 YinUtil::parabolicInterpolation(yinBuffer, iBuf, yinBufferSize)); | 325 m_yinUtil->parabolicInterpolation(yinBuffer, iBuf)); |
323 double tempPitch = 12 * std::log(currentF0/440)/std::log(2.) + 69; | 326 double tempPitch = 12 * std::log(currentF0/440)/std::log(2.) + 69; |
324 tempPitchProb.push_back(pair<double, double>(tempPitch, peakProbability[iBuf])); | 327 tempPitchProb.push_back(pair<double, double>(tempPitch, peakProbability[iBuf])); |
325 } | 328 } |
326 } | 329 } |
327 m_pitchProb.push_back(tempPitchProb); | 330 m_pitchProb.push_back(tempPitchProb); |