Revision 9:83603936e4d2
| CepstrumPitchTracker.cpp | ||
|---|---|---|
| 113 | 113 |
m_fmax(1000), |
| 114 | 114 |
m_histlen(1), |
| 115 | 115 |
m_vflen(3), |
| 116 |
m_ppflen(4), |
|
| 116 | 117 |
m_binFrom(0), |
| 117 | 118 |
m_binTo(0), |
| 118 | 119 |
m_bins(0), |
| 119 | 120 |
m_accepted(0), |
| 120 | 121 |
m_history(0), |
| 122 |
m_ppfilter(0), |
|
| 121 | 123 |
m_prevpeak(0), |
| 122 | 124 |
m_prevprop(0) |
| 123 | 125 |
{
|
| ... | ... | |
| 131 | 133 |
} |
| 132 | 134 |
delete[] m_history; |
| 133 | 135 |
} |
| 136 |
delete[] m_ppfilter; |
|
| 134 | 137 |
} |
| 135 | 138 |
|
| 136 | 139 |
string |
| ... | ... | |
| 292 | 295 |
m_history[i] = new double[m_bins]; |
| 293 | 296 |
} |
| 294 | 297 |
|
| 298 |
m_ppfilter = new double[m_ppflen]; |
|
| 299 |
|
|
| 295 | 300 |
reset(); |
| 296 | 301 |
|
| 297 | 302 |
return true; |
| ... | ... | |
| 305 | 310 |
m_history[i][j] = 0.0; |
| 306 | 311 |
} |
| 307 | 312 |
} |
| 313 |
for (int i = 0; i < m_ppflen; ++i) {
|
|
| 314 |
m_ppfilter[i] = 0.0; |
|
| 315 |
} |
|
| 308 | 316 |
} |
| 309 | 317 |
|
| 310 | 318 |
void |
| ... | ... | |
| 373 | 381 |
bool accept = false; |
| 374 | 382 |
|
| 375 | 383 |
if (abs(n - m_prevpeak) < 10) { //!!! should depend on bin count
|
| 384 |
std::cerr << "accepting " << n << " [as prevpeak was " << m_prevpeak |
|
| 385 |
<< "]" << std::endl; |
|
| 376 | 386 |
accept = true; |
| 377 | 387 |
} else if (peakProportion > m_prevprop * 2) {
|
| 388 |
std::cerr << "accepting " << n << " [as peakProportion " << peakProportion << " much higher than prev " << m_prevprop << "]" << std::endl; |
|
| 378 | 389 |
accept = true; |
| 390 |
} else {
|
|
| 391 |
std::cerr << "rejecting " << n << " with " << peakProportion |
|
| 392 |
<< " [prevpeak " << m_prevpeak |
|
| 393 |
<< ", prevprop " << m_prevprop << "]" << std::endl; |
|
| 379 | 394 |
} |
| 380 | 395 |
|
| 381 | 396 |
return accept; |
| 382 | 397 |
} |
| 383 | 398 |
|
| 399 |
void |
|
| 400 |
CepstrumPitchTracker::updatePropFilter(double prop) |
|
| 401 |
{
|
|
| 402 |
double tot = 0.0; |
|
| 403 |
for (int i = 1; i < m_ppflen; ++i) {
|
|
| 404 |
double val = m_ppfilter[i]; |
|
| 405 |
m_ppfilter[i-1] = val; |
|
| 406 |
tot += val; |
|
| 407 |
} |
|
| 408 |
double mean = tot / (m_ppflen - 1); |
|
| 409 |
m_ppfilter[m_ppflen-1] = prop; |
|
| 410 |
m_prevprop = mean; |
|
| 411 |
} |
|
| 412 |
|
|
| 384 | 413 |
CepstrumPitchTracker::FeatureSet |
| 385 | 414 |
CepstrumPitchTracker::process(const float *const *inputBuffers, Vamp::RealTime timestamp) |
| 386 | 415 |
{
|
| ... | ... | |
| 462 | 491 |
} |
| 463 | 492 |
if (accepted) {
|
| 464 | 493 |
m_prevpeak = maxbin; |
| 465 |
m_prevprop = pp; |
|
| 466 | 494 |
} |
| 495 |
updatePropFilter(pp); |
|
| 467 | 496 |
} |
| 468 | 497 |
|
| 469 | 498 |
// std::cerr << "peakProportion = " << peakProportion << std::endl; |
| CepstrumPitchTracker.h | ||
|---|---|---|
| 70 | 70 |
float m_fmax; |
| 71 | 71 |
int m_histlen; |
| 72 | 72 |
int m_vflen; |
| 73 |
int m_ppflen; |
|
| 73 | 74 |
|
| 74 | 75 |
int m_binFrom; |
| 75 | 76 |
int m_binTo; |
| ... | ... | |
| 113 | 114 |
Hypothesis *m_accepted; |
| 114 | 115 |
|
| 115 | 116 |
double **m_history; |
| 117 |
double *m_ppfilter; |
|
| 116 | 118 |
|
| 117 | 119 |
int m_prevpeak; |
| 118 | 120 |
double m_prevprop; |
| 119 | 121 |
|
| 120 | 122 |
double calculatePeakProportion(const double *data, double abstot, int n); |
| 123 |
void updatePropFilter(double peakProportion); |
|
| 121 | 124 |
bool acceptPeak(int n, double peakProportion); |
| 122 | 125 |
|
| 123 | 126 |
void filter(const double *in, double *out); |
Also available in: Unified diff