annotate dsp/tempotracking/TempoTrackV2.h @ 96:88f3cfcff55f

A threshold (delta) is added in the peak picking parameters structure (PPickParams). It is used as an offset when computing the smoothed detection function. A constructor for the structure PPickParams is also added to set the parameters to 0 when a structure instance is created. Hence programmes using the peak picking parameter structure and which do not set the delta parameter (e.g. QM Vamp note onset detector) won't be affected by the modifications. Functions modified: - dsp/onsets/PeakPicking.cpp - dsp/onsets/PeakPicking.h - dsp/signalconditioning/DFProcess.cpp - dsp/signalconditioning/DFProcess.h
author mathieub <mathieu.barthet@eecs.qmul.ac.uk>
date Mon, 20 Jun 2011 19:01:48 +0100
parents e5907ae6de17
children 915365c58758
rev   line source
cannam@52 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
cannam@52 2
cannam@52 3 /*
cannam@52 4 QM DSP Library
cannam@52 5
cannam@52 6 Centre for Digital Music, Queen Mary, University of London.
cannam@52 7 This file copyright 2008-2009 Matthew Davies and QMUL.
Chris@84 8
Chris@84 9 This program is free software; you can redistribute it and/or
Chris@84 10 modify it under the terms of the GNU General Public License as
Chris@84 11 published by the Free Software Foundation; either version 2 of the
Chris@84 12 License, or (at your option) any later version. See the file
Chris@84 13 COPYING included with this distribution for more information.
cannam@52 14 */
cannam@52 15
cannam@52 16
cannam@52 17 #ifndef TEMPOTRACKV2_H
cannam@52 18 #define TEMPOTRACKV2_H
cannam@52 19
cannam@52 20 #include <vector>
cannam@52 21
cannam@52 22 using std::vector;
cannam@52 23
cannam@54 24 //!!! Question: how far is this actually sample rate dependent? I
cannam@54 25 // think it does produce plausible results for e.g. 48000 as well as
cannam@54 26 // 44100, but surely the fixed window sizes and comb filtering will
cannam@54 27 // make it prefer double or half time when run at e.g. 96000?
cannam@54 28
cannam@52 29 class TempoTrackV2
cannam@52 30 {
cannam@52 31 public:
cannam@54 32 /**
cannam@54 33 * Construct a tempo tracker that will operate on beat detection
cannam@54 34 * function data calculated from audio at the given sample rate
cannam@54 35 * with the given frame increment.
cannam@54 36 *
cannam@54 37 * Currently the sample rate and increment are used only for the
cannam@54 38 * conversion from beat frame location to bpm in the tempo array.
cannam@54 39 */
cannam@54 40 TempoTrackV2(float sampleRate, size_t dfIncrement);
cannam@52 41 ~TempoTrackV2();
cannam@52 42
cannam@54 43 // Returned beat periods are given in df increment units; tempi in bpm
cannam@52 44 void calculateBeatPeriod(const vector<double> &df,
cannam@53 45 vector<double> &beatPeriod,
cannam@53 46 vector<double> &tempi);
cannam@52 47
cannam@54 48 // Returned beat positions are given in df increment units
cannam@52 49 void calculateBeats(const vector<double> &df,
cannam@52 50 const vector<double> &beatPeriod,
cannam@52 51 vector<double> &beats);
cannam@52 52
cannam@52 53 private:
cannam@52 54 typedef vector<int> i_vec_t;
cannam@52 55 typedef vector<vector<int> > i_mat_t;
cannam@52 56 typedef vector<double> d_vec_t;
cannam@52 57 typedef vector<vector<double> > d_mat_t;
cannam@52 58
cannam@54 59 float m_rate;
cannam@54 60 size_t m_increment;
cannam@54 61
cannam@52 62 void adapt_thresh(d_vec_t &df);
cannam@52 63 double mean_array(const d_vec_t &dfin, int start, int end);
cannam@52 64 void filter_df(d_vec_t &df);
cannam@52 65 void get_rcf(const d_vec_t &dfframe, const d_vec_t &wv, d_vec_t &rcf);
cannam@53 66 void viterbi_decode(const d_mat_t &rcfmat, const d_vec_t &wv,
cannam@53 67 d_vec_t &bp, d_vec_t &tempi);
cannam@52 68 double get_max_val(const d_vec_t &df);
cannam@52 69 int get_max_ind(const d_vec_t &df);
cannam@52 70 void normalise_vec(d_vec_t &df);
cannam@52 71 };
cannam@52 72
cannam@52 73 #endif