diff options
author | Robin Gareus <robin@gareus.org> | 2016-10-06 00:16:44 +0200 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2016-10-06 00:57:53 +0200 |
commit | f68d2e06bcfb81efda107d3b4c3aa7dbc2d73bc2 (patch) | |
tree | 286d5b2b1c3573c2fbfc77b4d29b0b2a6bfa9686 /libs/qm-dsp/dsp/tempotracking/DownBeat.cpp | |
parent | 2a27cc475867612afd261e5bf3b2a1a42b9c75cc (diff) |
update qm-dsp library
Diffstat (limited to 'libs/qm-dsp/dsp/tempotracking/DownBeat.cpp')
-rw-r--r-- | libs/qm-dsp/dsp/tempotracking/DownBeat.cpp | 33 |
1 files changed, 18 insertions, 15 deletions
diff --git a/libs/qm-dsp/dsp/tempotracking/DownBeat.cpp b/libs/qm-dsp/dsp/tempotracking/DownBeat.cpp index 1167bc6ea9..8570da6a17 100644 --- a/libs/qm-dsp/dsp/tempotracking/DownBeat.cpp +++ b/libs/qm-dsp/dsp/tempotracking/DownBeat.cpp @@ -44,7 +44,10 @@ DownBeat::DownBeat(float originalSampleRate, // 16x decimation, which is our expected normal situation) m_beatframesize = MathUtilities::nextPowerOfTwo (int((m_rate / decimationFactor) * 1.3)); -// std::cerr << "rate = " << m_rate << ", bfs = " << m_beatframesize << std::endl; + if (m_beatframesize < 2) { + m_beatframesize = 2; + } +// std::cerr << "rate = " << m_rate << ", dec = " << decimationFactor << ", bfs = " << m_beatframesize << std::endl; m_beatframe = new double[m_beatframesize]; m_fftRealOut = new double[m_beatframesize]; m_fftImagOut = new double[m_beatframesize]; @@ -122,7 +125,7 @@ DownBeat::pushAudioBlock(const float *audio) // std::cerr << "pushAudioBlock: rms in " << sqrt(rmsin) << ", out " << sqrt(rmsout) << std::endl; m_buffill += m_increment / m_factor; } - + const float * DownBeat::getBufferedAudio(size_t &length) const { @@ -192,9 +195,9 @@ DownBeat::findDownBeats(const float *audio, } // Now FFT beat frame - - m_fft->process(false, m_beatframe, m_fftRealOut, m_fftImagOut); - + + m_fft->forward(m_beatframe, m_fftRealOut, m_fftImagOut); + // Calculate magnitudes for (size_t j = 0; j < m_beatframesize/2; ++j) { @@ -257,7 +260,7 @@ DownBeat::measureSpecDiff(d_vec_t oldspec, d_vec_t newspec) { // JENSEN-SHANNON DIVERGENCE BETWEEN SPECTRAL FRAMES - unsigned int SPECSIZE = 512; // ONLY LOOK AT FIRST 512 SAMPLES OF SPECTRUM. + unsigned int SPECSIZE = 512; // ONLY LOOK AT FIRST 512 SAMPLES OF SPECTRUM. if (SPECSIZE > oldspec.size()/4) { SPECSIZE = oldspec.size()/4; } @@ -266,37 +269,37 @@ DownBeat::measureSpecDiff(d_vec_t oldspec, d_vec_t newspec) double sumnew = 0.; double sumold = 0.; - + for (unsigned int i = 0;i < SPECSIZE;i++) { newspec[i] +=EPS; oldspec[i] +=EPS; - + sumnew+=newspec[i]; sumold+=oldspec[i]; - } - + } + for (unsigned int i = 0;i < SPECSIZE;i++) { newspec[i] /= (sumnew); oldspec[i] /= (sumold); - + // IF ANY SPECTRAL VALUES ARE 0 (SHOULDN'T BE ANY!) SET THEM TO 1 if (newspec[i] == 0) { newspec[i] = 1.; } - + if (oldspec[i] == 0) { oldspec[i] = 1.; } - + // JENSEN-SHANNON CALCULATION - sd1 = 0.5*oldspec[i] + 0.5*newspec[i]; + sd1 = 0.5*oldspec[i] + 0.5*newspec[i]; SD = SD + (-sd1*log(sd1)) + (0.5*(oldspec[i]*log(oldspec[i]))) + (0.5*(newspec[i]*log(newspec[i]))); } - + return SD; } |