Mercurial > hg > constant-q-cpp
changeset 164:1081c73fbbe3
Various changes to make the code compatible with MSVC++ (though we don't provide projects for it yet)
author | Chris Cannam <c.cannam@qmul.ac.uk> |
---|---|
date | Fri, 08 Aug 2014 10:07:25 +0100 |
parents | 7c444fea4338 |
children | f35d0bf6d85d |
files | src/CQInverse.cpp src/CQKernel.cpp src/ConstantQ.cpp src/dsp/Resampler.cpp vamp/CQChromaVamp.cpp vamp/CQVamp.cpp |
diffstat | 6 files changed, 42 insertions(+), 49 deletions(-) [+] |
line wrap: on
line diff
--- a/src/CQInverse.cpp Thu Aug 07 19:19:21 2014 +0100 +++ b/src/CQInverse.cpp Fri Aug 08 10:07:25 2014 +0100 @@ -39,6 +39,8 @@ #include <iostream> #include <stdexcept> +#include <cmath> + using std::vector; using std::cerr; using std::endl; @@ -86,7 +88,7 @@ void CQInverse::initialise() { - m_octaves = int(ceil(log2(m_maxFrequency / m_minFrequency))); + m_octaves = int(ceil(log(m_maxFrequency / m_minFrequency) / log(2))); if (m_octaves < 1) { m_kernel = 0; // incidentally causing isValid() to return false
--- a/src/CQKernel.cpp Thu Aug 07 19:19:21 2014 +0100 +++ b/src/CQKernel.cpp Fri Aug 08 10:07:25 2014 +0100 @@ -41,6 +41,8 @@ #include <iostream> #include <algorithm> +#include <cmath> + using std::vector; using std::complex; using std::cerr; @@ -126,10 +128,10 @@ m_p.minFrequency = (m_p.maxFrequency / 2) * pow(2, 1.0/bpo); m_p.Q = q / (pow(2, 1.0/bpo) - 1.0); - double maxNK = round(m_p.Q * m_p.sampleRate / m_p.minFrequency); - double minNK = round + double maxNK = int(m_p.Q * m_p.sampleRate / m_p.minFrequency + 0.5); + double minNK = int (m_p.Q * m_p.sampleRate / - (m_p.minFrequency * pow(2, (bpo - 1.0) / bpo))); + (m_p.minFrequency * pow(2, (bpo - 1.0) / bpo)) + 0.5); if (minNK == 0 || maxNK == 0) { // most likely pathological parameters of some sort @@ -143,7 +145,7 @@ return false; } - m_p.atomSpacing = round(minNK * atomHopFactor); + m_p.atomSpacing = int(minNK * atomHopFactor + 0.5); m_p.firstCentre = m_p.atomSpacing * ceil(ceil(maxNK / 2.0) / m_p.atomSpacing); m_p.fftSize = MathUtilities::nextPowerOfTwo (m_p.firstCentre + ceil(maxNK / 2.0)); @@ -167,8 +169,8 @@ for (int k = 1; k <= m_p.binsPerOctave; ++k) { - int nk = round(m_p.Q * m_p.sampleRate / - (m_p.minFrequency * pow(2, ((k-1.0) / bpo)))); + int nk = int(m_p.Q * m_p.sampleRate / + (m_p.minFrequency * pow(2, ((k-1.0) / bpo))) + 0.5); vector<double> win = makeWindow(nk); @@ -295,7 +297,7 @@ vector<double> wK; double q = m_inparams.q; - for (int i = round(1.0/q); i < ncols - round(1.0/q) - 2; ++i) { + for (int i = int(1.0/q + 0.5); i < ncols - int(1.0/q + 0.5) - 2; ++i) { wK.push_back(abs(square[i][i])); }
--- a/src/ConstantQ.cpp Thu Aug 07 19:19:21 2014 +0100 +++ b/src/ConstantQ.cpp Fri Aug 08 10:07:25 2014 +0100 @@ -41,6 +41,8 @@ #include <iostream> #include <stdexcept> +#include <cmath> + using std::vector; using std::cerr; using std::endl; @@ -89,7 +91,7 @@ void ConstantQ::initialise() { - m_octaves = int(ceil(log2(m_maxFrequency / m_minFrequency))); + m_octaves = int(ceil(log(m_maxFrequency / m_minFrequency) / log(2))); if (m_octaves < 1) { m_kernel = 0; // incidentally causing isValid() to return false @@ -198,9 +200,9 @@ double finalOctLat = latencies[m_octaves-1]; double finalOctFact = pow(2, m_octaves-1); totalLatency = - int(round(finalOctLat + - finalOctFact * - ceil((totalLatency - finalOctLat) / finalOctFact))); + int(finalOctLat + + finalOctFact * + ceil((totalLatency - finalOctLat) / finalOctFact) + .5); #ifdef DEBUG_CQ cerr << "total latency = " << totalLatency << endl; @@ -248,7 +250,7 @@ #endif m_buffers.push_back - (RealSequence(int(round(octaveLatency)), 0.0)); + (RealSequence(int(octaveLatency + 0.5), 0.0)); } m_fft = new FFTReal(m_p.fftSize);
--- a/src/dsp/Resampler.cpp Thu Aug 07 19:19:21 2014 +0100 +++ b/src/dsp/Resampler.cpp Fri Aug 08 10:07:25 2014 +0100 @@ -40,8 +40,6 @@ #include <map> #include <cassert> -#include <pthread.h> - using std::vector; using std::map; using std::cerr; @@ -70,13 +68,6 @@ delete[] m_phaseData; } -// peakToPole -> length -> beta -> window -static map<double, map<int, map<double, vector<double> > > > -knownFilters; - -static pthread_mutex_t -knownFilterMutex = PTHREAD_MUTEX_INITIALIZER; - void Resampler::initialise(double snr, double bandwidth) { @@ -104,26 +95,14 @@ vector<double> filter; - pthread_mutex_lock(&knownFilterMutex); + KaiserWindow kw(params); + SincWindow sw(m_filterLength, m_peakToPole * 2); - if (knownFilters[m_peakToPole][m_filterLength].find(params.beta) == - knownFilters[m_peakToPole][m_filterLength].end()) { - - KaiserWindow kw(params); - SincWindow sw(m_filterLength, m_peakToPole * 2); - - filter = vector<double>(m_filterLength, 0.0); - for (int i = 0; i < m_filterLength; ++i) filter[i] = 1.0; - sw.cut(filter.data()); - kw.cut(filter.data()); - - knownFilters[m_peakToPole][m_filterLength][params.beta] = filter; - } - - filter = knownFilters[m_peakToPole][m_filterLength][params.beta]; + filter = vector<double>(m_filterLength, 0.0); + for (int i = 0; i < m_filterLength; ++i) filter[i] = 1.0; + sw.cut(filter.data()); + kw.cut(filter.data()); - pthread_mutex_unlock(&knownFilterMutex); - int inputSpacing = m_targetRate / m_gcd; int outputSpacing = m_sourceRate / m_gcd; @@ -315,8 +294,16 @@ assert(n + m_bufferOrigin <= (int)m_buffer.size()); - const double *const __restrict__ buf = m_buffer.data() + m_bufferOrigin; - const double *const __restrict__ filt = pd.filter.data(); +#if defined(__MSVC__) +#define R__ __restrict +#elif defined(__GNUC__) +#define R__ __restrict__ +#else +#define R__ +#endif + + const double *const R__ buf(m_buffer.data() + m_bufferOrigin); + const double *const R__ filt(pd.filter.data()); for (int i = 0; i < n; ++i) { // NB gcc can only vectorize this with -ffast-math
--- a/vamp/CQChromaVamp.cpp Thu Aug 07 19:19:21 2014 +0100 +++ b/vamp/CQChromaVamp.cpp Fri Aug 08 10:07:25 2014 +0100 @@ -180,13 +180,13 @@ CQChromaVamp::setParameter(std::string param, float value) { if (param == "lowestoct") { - m_lowestOctave = lrintf(value); + m_lowestOctave = int(value + 0.5f); } else if (param == "octaves") { - m_octaveCount = lrintf(value); + m_octaveCount = int(value + 0.5f); } else if (param == "tuning") { m_tuningFrequency = value; } else if (param == "bpo") { - m_bpo = lrintf(value); + m_bpo = int(value + 0.5f); } else { std::cerr << "WARNING: CQChromaVamp::setParameter: unknown parameter \"" << param << "\"" << std::endl;
--- a/vamp/CQVamp.cpp Thu Aug 07 19:19:21 2014 +0100 +++ b/vamp/CQVamp.cpp Fri Aug 08 10:07:25 2014 +0100 @@ -248,15 +248,15 @@ CQVamp::setParameter(std::string param, float value) { if (param == "minpitch" && m_midiPitchParameters) { - m_minMIDIPitch = lrintf(value); + m_minMIDIPitch = int(value + 0.5f); } else if (param == "maxpitch" && m_midiPitchParameters) { - m_maxMIDIPitch = lrintf(value); + m_maxMIDIPitch = int(value + 0.5f); } else if (param == "tuning" && m_midiPitchParameters) { m_tuningFrequency = value; } else if (param == "bpo") { - m_bpo = lrintf(value); + m_bpo = int(value + 0.5f); } else if (param == "interpolation") { - m_interpolation = (CQSpectrogram::Interpolation)lrintf(value); + m_interpolation = (CQSpectrogram::Interpolation)int(value + 0.5f); } else if (param == "minfreq" && !m_midiPitchParameters) { m_minFrequency = value; } else if (param == "maxfreq" && !m_midiPitchParameters) {