Revision 51:0997774f5fdc CepstralPitchTracker.cpp

View differences:

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