Revision 9:83603936e4d2

View differences:

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