Chris@4: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ Chris@4: Chris@4: /* Chris@4: Vamp feature extraction plugin for the BeatRoot beat tracker. Chris@4: Chris@4: Centre for Digital Music, Queen Mary, University of London. Chris@4: This file copyright 2011 Simon Dixon, Chris Cannam and QMUL. Chris@4: Chris@4: This program is free software; you can redistribute it and/or Chris@4: modify it under the terms of the GNU General Public License as Chris@4: published by the Free Software Foundation; either version 2 of the Chris@4: License, or (at your option) any later version. See the file Chris@4: COPYING included with this distribution for more information. Chris@4: */ Chris@4: Chris@4: #ifndef _BEATROOT_PEAKS_H_ Chris@4: #define _BEATROOT_PEAKS_H_ Chris@4: Chris@4: #include Chris@4: #include Chris@4: Chris@4: using std::vector; Chris@4: Chris@4: class Peaks Chris@4: { Chris@4: protected: Chris@4: static int pre; Chris@4: static int post; Chris@4: Chris@4: public: Chris@4: /** General peak picking method for finding n local maxima in an array Chris@4: * @param data input data Chris@4: * @param peaks list of peak indexes Chris@4: * @param width minimum distance between peaks Chris@4: */ Chris@15: static int findPeaks(const vector &data, vector peaks, int width); Chris@4: Chris@4: /** General peak picking method for finding local maxima in an array Chris@4: * @param data input data Chris@4: * @param width minimum distance between peaks Chris@4: * @param threshold minimum value of peaks Chris@4: * @return list of peak indexes Chris@4: */ Chris@4: static vector findPeaks(const vector &data, int width, Chris@4: double threshold) { Chris@4: return findPeaks(data, width, threshold, 0, false); Chris@4: } // findPeaks() Chris@4: Chris@4: /** General peak picking method for finding local maxima in an array Chris@4: * @param data input data Chris@4: * @param width minimum distance between peaks Chris@4: * @param threshold minimum value of peaks Chris@4: * @param decayRate how quickly previous peaks are forgotten Chris@4: * @param isRelative minimum value of peaks is relative to local average Chris@4: * @return list of peak indexes Chris@4: */ Chris@4: static vector findPeaks(const vector &data, int width, Chris@15: double threshold, double decayRate, bool isRelative); Chris@4: Chris@4: static double expDecayWithHold(double av, double decayRate, Chris@15: const vector &data, int start, int stop); Chris@4: Chris@4: static bool overThreshold(const vector &data, int index, int width, Chris@15: double threshold, bool isRelative, Chris@15: double av); Chris@4: Chris@15: static void normalise(vector &data); Chris@4: Chris@4: /** Uses an n-point linear regression to estimate the slope of data. Chris@4: * @param data input data Chris@4: * @param hop spacing of data points Chris@4: * @param n length of linear regression Chris@4: * @param slope output data Chris@4: */ Chris@4: static void getSlope(const vector &data, double hop, int n, Chris@15: vector &slope); Chris@4: Chris@18: static double min(const vector &arr) { Chris@18: if (arr.empty()) return 0; Chris@18: return arr[imin(arr)]; Chris@18: } Chris@18: static double max(const vector &arr) { Chris@18: if (arr.empty()) return 0; Chris@18: return arr[imax(arr)]; Chris@18: } Chris@4: Chris@15: static int imin(const vector &arr); Chris@15: static int imax(const vector &arr); Chris@4: Chris@4: }; // class Peaks Chris@4: Chris@4: #endif