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) {