Revision 51:0997774f5fdc CepstralPitchTracker.cpp
| CepstralPitchTracker.cpp | ||
|---|---|---|
| 23 | 23 |
*/ |
| 24 | 24 |
|
| 25 | 25 |
#include "CepstralPitchTracker.h" |
| 26 |
#include "Cepstrum.h" |
|
| 26 | 27 |
#include "MeanFilter.h" |
| 27 | 28 |
#include "PeakInterpolator.h" |
| 28 | 29 |
|
| ... | ... | |
| 263 | 264 |
{
|
| 264 | 265 |
FeatureSet fs; |
| 265 | 266 |
|
| 266 |
int bs = m_blockSize; |
|
| 267 |
int hs = m_blockSize/2 + 1; |
|
| 268 |
|
|
| 269 |
double *rawcep = new double[bs]; |
|
| 270 |
double *io = new double[bs]; |
|
| 271 |
double *logmag = new double[bs]; |
|
| 272 |
|
|
| 273 |
// The "inverse symmetric" method. Seems to be the most reliable |
|
| 274 |
|
|
| 275 |
double magmean = 0.0; |
|
| 276 |
|
|
| 277 |
for (int i = 0; i < hs; ++i) {
|
|
| 278 |
|
|
| 279 |
double power = |
|
| 280 |
inputBuffers[0][i*2 ] * inputBuffers[0][i*2 ] + |
|
| 281 |
inputBuffers[0][i*2+1] * inputBuffers[0][i*2+1]; |
|
| 282 |
double mag = sqrt(power); |
|
| 283 |
|
|
| 284 |
magmean += mag; |
|
| 285 |
|
|
| 286 |
double lm = log(mag + 0.00000001); |
|
| 287 |
|
|
| 288 |
logmag[i] = lm; |
|
| 289 |
if (i > 0) logmag[bs - i] = lm; |
|
| 290 |
} |
|
| 291 |
|
|
| 292 |
magmean /= hs; |
|
| 293 |
double threshold = 0.1; // for magmean |
|
| 294 |
|
|
| 295 |
Vamp::FFT::inverse(bs, logmag, 0, rawcep, io); |
|
| 296 |
|
|
| 297 |
delete[] logmag; |
|
| 298 |
delete[] io; |
|
| 267 |
double *rawcep = new double[m_blockSize]; |
|
| 268 |
double magmean = Cepstrum(m_blockSize).process(inputBuffers[0], rawcep); |
|
| 299 | 269 |
|
| 300 | 270 |
int n = m_bins; |
| 301 | 271 |
double *data = new double[n]; |
| 302 |
MeanFilter(m_vflen).filterSubsequence(rawcep, data, m_blockSize, n, m_binFrom); |
|
| 272 |
MeanFilter(m_vflen).filterSubsequence |
|
| 273 |
(rawcep, data, m_blockSize, n, m_binFrom); |
|
| 274 |
|
|
| 303 | 275 |
delete[] rawcep; |
| 304 | 276 |
|
| 305 | 277 |
double maxval = 0.0; |
| ... | ... | |
| 332 | 304 |
double peakfreq = m_inputSampleRate / (cimax + m_binFrom); |
| 333 | 305 |
|
| 334 | 306 |
double confidence = 0.0; |
| 307 |
double threshold = 0.1; // for magmean |
|
| 308 |
|
|
| 335 | 309 |
if (nextPeakVal != 0.0) {
|
| 336 | 310 |
confidence = (maxval - nextPeakVal) * 10.0; |
| 337 | 311 |
if (magmean < threshold) confidence = 0.0; |
Also available in: Unified diff