Revision 25:9aee1a0e6223 CepstrumPitchTracker.cpp
| CepstrumPitchTracker.cpp | ||
|---|---|---|
| 77 | 77 |
} |
| 78 | 78 |
meanConfidence /= m_pending.size(); |
| 79 | 79 |
|
| 80 |
int lengthRequired = int(2.0 / meanConfidence + 0.5); |
|
| 80 |
int lengthRequired = 10000; |
|
| 81 |
if (meanConfidence > 0.0) {
|
|
| 82 |
lengthRequired = int(2.0 / meanConfidence + 0.5); |
|
| 83 |
} |
|
| 81 | 84 |
std::cerr << "meanConfidence = " << meanConfidence << ", lengthRequired = " << lengthRequired << ", length = " << m_pending.size() << std::endl; |
| 82 | 85 |
|
| 83 | 86 |
return (m_pending.size() > lengthRequired); |
| ... | ... | |
| 219 | 222 |
m_stepSize(256), |
| 220 | 223 |
m_blockSize(1024), |
| 221 | 224 |
m_fmin(50), |
| 222 |
m_fmax(1000),
|
|
| 225 |
m_fmax(900),
|
|
| 223 | 226 |
m_vflen(1), |
| 224 | 227 |
m_binFrom(0), |
| 225 | 228 |
m_binTo(0), |
| ... | ... | |
| 507 | 510 |
|
| 508 | 511 |
// The "inverse symmetric" method. Seems to be the most reliable |
| 509 | 512 |
|
| 513 |
double magmean = 0.0; |
|
| 514 |
|
|
| 510 | 515 |
for (int i = 0; i < hs; ++i) {
|
| 511 | 516 |
|
| 512 | 517 |
double power = |
| 513 | 518 |
inputBuffers[0][i*2 ] * inputBuffers[0][i*2 ] + |
| 514 | 519 |
inputBuffers[0][i*2+1] * inputBuffers[0][i*2+1]; |
| 515 | 520 |
double mag = sqrt(power); |
| 516 |
|
|
| 521 |
|
|
| 522 |
magmean += mag; |
|
| 523 |
|
|
| 517 | 524 |
double lm = log(mag + 0.00000001); |
| 518 | 525 |
|
| 519 | 526 |
logmag[i] = lm; |
| 520 | 527 |
if (i > 0) logmag[bs - i] = lm; |
| 521 | 528 |
} |
| 522 | 529 |
|
| 530 |
magmean /= hs; |
|
| 531 |
double threshold = 0.1; // for magmean |
|
| 532 |
|
|
| 523 | 533 |
fft(bs, true, logmag, 0, rawcep, io); |
| 524 | 534 |
|
| 525 | 535 |
delete[] logmag; |
| 526 | 536 |
delete[] io; |
| 527 | 537 |
|
| 528 |
double cep1 = rawcep[1]; |
|
| 529 |
|
|
| 530 | 538 |
int n = m_bins; |
| 531 | 539 |
double *data = new double[n]; |
| 532 | 540 |
filter(rawcep, data); |
| ... | ... | |
| 562 | 570 |
|
| 563 | 571 |
double confidence = 0.0; |
| 564 | 572 |
if (nextPeakVal != 0.0) {
|
| 565 |
std::cerr << "maxval = " << maxval << ", cep1 = " << cep1 << std::endl; |
|
| 566 |
double conf0 = (maxval - nextPeakVal) / 80.0; |
|
| 567 |
double conf1 = (cep1 / bs) / 2; |
|
| 568 |
if (conf0 > 1.0) conf0 = 1.0; |
|
| 569 |
if (conf1 > 1.0) conf1 = 1.0; |
|
| 570 |
confidence = conf0 * conf1; |
|
| 571 |
std::cerr << "conf0 = " << conf0 << ", conf1 = " << conf1 << ", confidence = " << confidence << std::endl; |
|
| 573 |
confidence = (maxval - nextPeakVal) / 100.0; |
|
| 574 |
if (magmean < threshold) confidence = 0.0; |
|
| 575 |
std::cerr << "magmean = " << magmean << ", confidence = " << confidence << std::endl; |
|
| 572 | 576 |
} |
| 573 | 577 |
|
| 574 | 578 |
Hypothesis::Estimate e; |
Also available in: Unified diff