adamstark@114: adamstark@114: adamstark@60: adamstark@60: adamstark@114: adamstark@114: adamstark@114: adamstark@60: BTrack - A Real-Time Beat Tracker: src/BTrack.h Source File adamstark@60: adamstark@60: adamstark@60: adamstark@60: adamstark@114: adamstark@60: adamstark@60: adamstark@60: adamstark@60: adamstark@60:
adamstark@60:
adamstark@60: adamstark@60: adamstark@114: adamstark@114: adamstark@60: adamstark@60: adamstark@60:
adamstark@60:
BTrack - A Real-Time Beat Tracker adamstark@60:
adamstark@60:
adamstark@60:
adamstark@60: adamstark@114: adamstark@60: adamstark@114: adamstark@114: adamstark@114: adamstark@114: adamstark@60: adamstark@60:
adamstark@114:
adamstark@60: adamstark@60: adamstark@60:
adamstark@114:
adamstark@114:
adamstark@114:
adamstark@114:
adamstark@114:
Loading...
adamstark@114:
Searching...
adamstark@114:
No Matches
adamstark@114:
adamstark@114:
adamstark@114:
adamstark@60:
adamstark@60: adamstark@60: adamstark@60:
adamstark@60:
adamstark@114:
BTrack.h
adamstark@60:
adamstark@60:
adamstark@114: Go to the documentation of this file.
1//=======================================================================
adamstark@114:
20//=======================================================================
adamstark@114:
21
adamstark@114:
22#ifndef __BTRACK_H
adamstark@114:
23#define __BTRACK_H
adamstark@114:
24
adamstark@114: adamstark@114:
26#include "CircularBuffer.h"
adamstark@114:
27#include <vector>
adamstark@114:
28
adamstark@114:
29//=======================================================================
adamstark@114:
35class BTrack {
adamstark@114:
36
adamstark@114:
37public:
adamstark@114:
38
adamstark@114:
39 //=======================================================================
adamstark@114:
41 BTrack();
adamstark@114:
42
adamstark@114:
46 BTrack (int hopSize);
adamstark@114:
47
adamstark@114:
52 BTrack (int hopSize, int frameSize);
adamstark@114:
53
adamstark@114:
55 ~BTrack();
adamstark@114:
56
adamstark@114:
57 //=======================================================================
adamstark@114:
62 void updateHopAndFrameSize (int hopSize, int frameSize);
adamstark@114:
63
adamstark@114:
64 //=======================================================================
adamstark@114:
69 void processAudioFrame (double* frame);
adamstark@114:
70
adamstark@114:
74 void processOnsetDetectionFunctionSample (double sample);
adamstark@114:
75
adamstark@114:
76 //=======================================================================
adamstark@114:
78 int getHopSize();
adamstark@114:
79
adamstark@114: adamstark@114:
82
adamstark@114: adamstark@114:
85
adamstark@114: adamstark@114:
88
adamstark@114:
89 //=======================================================================
adamstark@114:
93 void setTempo (double tempo);
adamstark@114:
94
adamstark@114:
99 void fixTempo (double tempo);
adamstark@114:
100
adamstark@114:
102 void doNotFixTempo();
adamstark@114:
103
adamstark@114:
104 //=======================================================================
adamstark@114:
112 static double getBeatTimeInSeconds (long frameNumber, int hopSize, int fs);
adamstark@114:
113
adamstark@114:
114private:
adamstark@114:
115
adamstark@114:
119 void initialise (int hopSize);
adamstark@114:
120
adamstark@114:
124 void setHopSize (int hopSize);
adamstark@114:
125
adamstark@114:
127 void resampleOnsetDetectionFunction();
adamstark@114:
128
adamstark@114:
132 void updateCumulativeScore (double onsetDetectionFunctionSample);
adamstark@114:
133
adamstark@114:
135 void predictBeat();
adamstark@114:
136
adamstark@114:
138 void calculateTempo();
adamstark@114:
139
adamstark@114:
144 void adaptiveThreshold (std::vector<double>& x);
adamstark@114:
145
adamstark@114:
152 double calculateMeanOfVector (std::vector<double>& vector, int startIndex, int endIndex);
adamstark@114:
153
adamstark@114:
157 void normaliseVector (std::vector<double>& vector);
adamstark@114:
158
adamstark@114:
162 void calculateBalancedACF (std::vector<double>& onsetDetectionFunction);
adamstark@114:
163
adamstark@114:
165 void calculateOutputOfCombFilterBank();
adamstark@114:
166
adamstark@114:
168 void createLogGaussianTransitionWeighting (double* weightingArray, int numSamples, double beatPeriod);
adamstark@114:
169
adamstark@114:
171 template <typename T>
adamstark@114:
172 double calculateNewCumulativeScoreValue (T cumulativeScoreArray, double* logGaussianTransitionWeighting, int startIndex, int endIndex, double onsetDetectionFunctionSample, double alphaWeightingFactor);
adamstark@114:
173
adamstark@114:
174 //=======================================================================
adamstark@114:
175
adamstark@114: adamstark@114:
178
adamstark@114:
179 //=======================================================================
adamstark@114:
180 // buffers
adamstark@114:
181
adamstark@114:
182 CircularBuffer onsetDF;
adamstark@114:
183 CircularBuffer cumulativeScore;
adamstark@114:
185 std::vector<double> resampledOnsetDF;
adamstark@114:
186 std::vector<double> acf;
adamstark@114:
187 std::vector<double> weightingVector;
adamstark@114:
188 std::vector<double> combFilterBankOutput;
adamstark@114:
189 std::vector<double> tempoObservationVector;
adamstark@114:
190 std::vector<double> delta;
adamstark@114:
191 std::vector<double> prevDelta;
adamstark@114:
192 std::vector<double> prevDeltaFixed;
adamstark@114:
193 double tempoTransitionMatrix[41][41];
adamstark@114:
195 //=======================================================================
adamstark@114:
196 // parameters
adamstark@114:
197
adamstark@114:
198 double tightness;
adamstark@114:
199 double alpha;
adamstark@114:
200 double beatPeriod;
adamstark@114:
201 double estimatedTempo;
adamstark@114:
202 int timeToNextPrediction;
adamstark@114:
203 int timeToNextBeat;
adamstark@114:
204 int hopSize;
adamstark@114:
205 int onsetDFBufferSize;
adamstark@114:
206 bool tempoFixed;
adamstark@114:
207 bool beatDueInFrame;
adamstark@114:
208 int FFTLengthForACFCalculation;
adamstark@114:
210#ifdef USE_FFTW
adamstark@114:
211 fftw_plan acfForwardFFT;
adamstark@114:
212 fftw_plan acfBackwardFFT;
adamstark@114:
213 fftw_complex* complexIn;
adamstark@114:
214 fftw_complex* complexOut;
adamstark@114:
215#endif
adamstark@114:
216
adamstark@114:
217#ifdef USE_KISS_FFT
adamstark@114:
218 kiss_fft_cfg cfgForwards;
adamstark@114:
219 kiss_fft_cfg cfgBackwards;
adamstark@114:
220 kiss_fft_cpx* fftIn;
adamstark@114:
221 kiss_fft_cpx* fftOut;
adamstark@114:
222#endif
adamstark@114:
223
adamstark@114:
224};
adamstark@114:
225
adamstark@114:
226#endif
adamstark@114:
A circular buffer.
adamstark@114:
A class for calculating onset detection functions.
adamstark@114:
Definition BTrack.h:35
adamstark@114:
double getCurrentTempoEstimate()
Definition BTrack.cpp:192
adamstark@114:
void doNotFixTempo()
Definition BTrack.cpp:340
adamstark@114:
BTrack()
Definition BTrack.cpp:30
adamstark@114:
~BTrack()
Definition BTrack.cpp:51
adamstark@114:
void fixTempo(double tempo)
Definition BTrack.cpp:314
adamstark@114:
void processOnsetDetectionFunctionSample(double sample)
Definition BTrack.cpp:220
adamstark@114:
double getLatestCumulativeScoreValue()
Definition BTrack.cpp:204
adamstark@114:
void setTempo(double tempo)
Definition BTrack.cpp:256
adamstark@114:
static double getBeatTimeInSeconds(long frameNumber, int hopSize, int fs)
Definition BTrack.cpp:70
adamstark@114:
void processAudioFrame(double *frame)
Definition BTrack.cpp:210
adamstark@114:
int getHopSize()
Definition BTrack.cpp:198
adamstark@114:
bool beatDueInCurrentFrame()
Definition BTrack.cpp:186
adamstark@114:
void updateHopAndFrameSize(int hopSize, int frameSize)
Definition BTrack.cpp:176
adamstark@114:
Definition CircularBuffer.h:34
adamstark@114:
Definition OnsetDetectionFunction.h:65
adamstark@60:
adamstark@60: adamstark@60: adamstark@60: adamstark@60: