changeset 209:ccd2019190bf msvc

Some MSVC fixes, including (temporarily, probably) renaming the FFT source file to avoid getting it mixed up with the Vamp SDK one in our object dir
author Chris Cannam
date Thu, 01 Feb 2018 16:34:08 +0000
parents 7eade513d470
children cf62f73766e9
files base/Restrict.h dsp/signalconditioning/DFProcess.cpp dsp/signalconditioning/Filter.cpp dsp/signalconditioning/Filter.h dsp/transforms/FFT.cpp dsp/transforms/FFTqm.cpp dsp/wavelet/Wavelet.cpp dsp/wavelet/Wavelet.h
diffstat 8 files changed, 231 insertions(+), 210 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/base/Restrict.h	Thu Feb 01 16:34:08 2018 +0000
@@ -0,0 +1,17 @@
+
+#ifndef QM_DSP_RESTRICT_H
+#define QM_DSP_RESTRICT_H
+
+#ifdef _MSC_VER
+#define QM_R__ __restrict
+#endif
+
+#ifdef __GNUC__
+#define QM_R__ __restrict__
+#endif
+
+#ifndef QM_R__
+#define QM_R__
+#endif
+
+#endif
--- a/dsp/signalconditioning/DFProcess.cpp	Tue Jan 30 20:14:46 2018 +0000
+++ b/dsp/signalconditioning/DFProcess.cpp	Thu Feb 01 16:34:08 2018 +0000
@@ -25,6 +25,8 @@
 #include "maths/MathUtilities.h"
 
 #include <cstring>
+#include <algorithm>
+
 
 //////////////////////////////////////////////////////////////////////
 // Construction/Destruction
--- a/dsp/signalconditioning/Filter.cpp	Tue Jan 30 20:14:46 2018 +0000
+++ b/dsp/signalconditioning/Filter.cpp	Thu Feb 01 16:34:08 2018 +0000
@@ -74,8 +74,8 @@
 }
 
 void
-Filter::process(const double *const __restrict__ in,
-		double *const __restrict__ out,
+Filter::process(const double *const QM_R__ in,
+		double *const QM_R__ out,
 		const int n)
 {
     for (int s = 0; s < n; ++s) {
--- a/dsp/signalconditioning/Filter.h	Tue Jan 30 20:14:46 2018 +0000
+++ b/dsp/signalconditioning/Filter.h	Thu Feb 01 16:34:08 2018 +0000
@@ -15,6 +15,8 @@
 #ifndef FILTER_H
 #define FILTER_H
 
+#include "base/Restrict.h"
+
 #include <vector>
 
 class Filter
@@ -42,8 +44,8 @@
      * write the resulting \arg n samples into \arg out. There must be
      * enough room in \arg out for \arg n samples to be written.
      */
-    void process(const double *const __restrict__ in,
-                 double *const __restrict__ out,
+    void process(const double *const QM_R__ in,
+                 double *const QM_R__ out,
                  const int n);
 
     int getOrder() const { return m_order; }
--- a/dsp/transforms/FFT.cpp	Tue Jan 30 20:14:46 2018 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,202 +0,0 @@
-/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*-  vi:set ts=8 sts=4 sw=4: */
-
-/*
-    QM DSP Library
-
-    Centre for Digital Music, Queen Mary, University of London.
-*/
-
-#include "FFT.h"
-
-#include "maths/MathUtilities.h"
-
-#include "kiss_fft.h"
-#include "kiss_fftr.h"
-
-#include <cmath>
-
-#include <iostream>
-
-#include <stdexcept>
-
-class FFT::D
-{
-public:
-    D(int n) : m_n(n) {
-        m_planf = kiss_fft_alloc(m_n, 0, NULL, NULL);
-        m_plani = kiss_fft_alloc(m_n, 1, NULL, NULL);
-        m_kin = new kiss_fft_cpx[m_n];
-        m_kout = new kiss_fft_cpx[m_n];
-    }
-
-    ~D() {
-        kiss_fft_free(m_planf);
-        kiss_fft_free(m_plani);
-        delete[] m_kin;
-        delete[] m_kout;
-    }
-
-    void process(bool inverse,
-                 const double *ri,
-                 const double *ii,
-                 double *ro,
-                 double *io) {
-
-        for (int i = 0; i < m_n; ++i) {
-            m_kin[i].r = ri[i];
-            m_kin[i].i = (ii ? ii[i] : 0.0);
-        }
-
-        if (!inverse) {
-
-            kiss_fft(m_planf, m_kin, m_kout);
-
-            for (int i = 0; i < m_n; ++i) {
-                ro[i] = m_kout[i].r;
-                io[i] = m_kout[i].i;
-            }
-
-        } else {
-
-            kiss_fft(m_plani, m_kin, m_kout);
-
-            double scale = 1.0 / m_n;
-
-            for (int i = 0; i < m_n; ++i) {
-                ro[i] = m_kout[i].r * scale;
-                io[i] = m_kout[i].i * scale;
-            }
-        }
-    }
-    
-private:
-    int m_n;
-    kiss_fft_cfg m_planf;
-    kiss_fft_cfg m_plani;
-    kiss_fft_cpx *m_kin;
-    kiss_fft_cpx *m_kout;
-};        
-
-FFT::FFT(int n) :
-    m_d(new D(n))
-{
-}
-
-FFT::~FFT()
-{
-    delete m_d;
-}
-
-void
-FFT::process(bool inverse,
-             const double *p_lpRealIn, const double *p_lpImagIn,
-             double *p_lpRealOut, double *p_lpImagOut)
-{
-    m_d->process(inverse,
-                 p_lpRealIn, p_lpImagIn,
-                 p_lpRealOut, p_lpImagOut);
-}
-    
-class FFTReal::D
-{
-public:
-    D(int n) : m_n(n) {
-        if (n % 2) {
-            throw std::invalid_argument
-                ("nsamples must be even in FFTReal constructor");
-        }
-        m_planf = kiss_fftr_alloc(m_n, 0, NULL, NULL);
-        m_plani = kiss_fftr_alloc(m_n, 1, NULL, NULL);
-        m_c = new kiss_fft_cpx[m_n];
-    }
-
-    ~D() {
-        kiss_fftr_free(m_planf);
-        kiss_fftr_free(m_plani);
-        delete[] m_c;
-    }
-
-    void forward(const double *ri, double *ro, double *io) {
-
-        kiss_fftr(m_planf, ri, m_c);
-
-        for (int i = 0; i <= m_n/2; ++i) {
-            ro[i] = m_c[i].r;
-            io[i] = m_c[i].i;
-        }
-
-        for (int i = 0; i + 1 < m_n/2; ++i) {
-            ro[m_n - i - 1] =  ro[i + 1];
-            io[m_n - i - 1] = -io[i + 1];
-        }
-    }
-
-    void forwardMagnitude(const double *ri, double *mo) {
-
-        double *io = new double[m_n];
-
-        forward(ri, mo, io);
-
-        for (int i = 0; i < m_n; ++i) {
-            mo[i] = sqrt(mo[i] * mo[i] + io[i] * io[i]);
-        }
-
-        delete[] io;
-    }
-
-    void inverse(const double *ri, const double *ii, double *ro) {
-
-        // kiss_fftr.h says
-        // "input freqdata has nfft/2+1 complex points"
-
-        for (int i = 0; i < m_n/2 + 1; ++i) {
-            m_c[i].r = ri[i];
-            m_c[i].i = ii[i];
-        }
-        
-        kiss_fftri(m_plani, m_c, ro);
-
-        double scale = 1.0 / m_n;
-
-        for (int i = 0; i < m_n; ++i) {
-            ro[i] *= scale;
-        }
-    }
-
-private:
-    int m_n;
-    kiss_fftr_cfg m_planf;
-    kiss_fftr_cfg m_plani;
-    kiss_fft_cpx *m_c;
-};
-
-FFTReal::FFTReal(int n) :
-    m_d(new D(n)) 
-{
-}
-
-FFTReal::~FFTReal()
-{
-    delete m_d;
-}
-
-void
-FFTReal::forward(const double *ri, double *ro, double *io)
-{
-    m_d->forward(ri, ro, io);
-}
-
-void
-FFTReal::forwardMagnitude(const double *ri, double *mo)
-{
-    m_d->forwardMagnitude(ri, mo);
-}
-
-void
-FFTReal::inverse(const double *ri, const double *ii, double *ro)
-{
-    m_d->inverse(ri, ii, ro);
-}
-
-
-    
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dsp/transforms/FFTqm.cpp	Thu Feb 01 16:34:08 2018 +0000
@@ -0,0 +1,202 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*-  vi:set ts=8 sts=4 sw=4: */
+
+/*
+    QM DSP Library
+
+    Centre for Digital Music, Queen Mary, University of London.
+*/
+
+#include "FFT.h"
+
+#include "maths/MathUtilities.h"
+
+#include "kiss_fft.h"
+#include "kiss_fftr.h"
+
+#include <cmath>
+
+#include <iostream>
+
+#include <stdexcept>
+
+class FFT::D
+{
+public:
+    D(int n) : m_n(n) {
+        m_planf = kiss_fft_alloc(m_n, 0, NULL, NULL);
+        m_plani = kiss_fft_alloc(m_n, 1, NULL, NULL);
+        m_kin = new kiss_fft_cpx[m_n];
+        m_kout = new kiss_fft_cpx[m_n];
+    }
+
+    ~D() {
+        kiss_fft_free(m_planf);
+        kiss_fft_free(m_plani);
+        delete[] m_kin;
+        delete[] m_kout;
+    }
+
+    void process(bool inverse,
+                 const double *ri,
+                 const double *ii,
+                 double *ro,
+                 double *io) {
+
+        for (int i = 0; i < m_n; ++i) {
+            m_kin[i].r = ri[i];
+            m_kin[i].i = (ii ? ii[i] : 0.0);
+        }
+
+        if (!inverse) {
+
+            kiss_fft(m_planf, m_kin, m_kout);
+
+            for (int i = 0; i < m_n; ++i) {
+                ro[i] = m_kout[i].r;
+                io[i] = m_kout[i].i;
+            }
+
+        } else {
+
+            kiss_fft(m_plani, m_kin, m_kout);
+
+            double scale = 1.0 / m_n;
+
+            for (int i = 0; i < m_n; ++i) {
+                ro[i] = m_kout[i].r * scale;
+                io[i] = m_kout[i].i * scale;
+            }
+        }
+    }
+    
+private:
+    int m_n;
+    kiss_fft_cfg m_planf;
+    kiss_fft_cfg m_plani;
+    kiss_fft_cpx *m_kin;
+    kiss_fft_cpx *m_kout;
+};        
+
+FFT::FFT(int n) :
+    m_d(new D(n))
+{
+}
+
+FFT::~FFT()
+{
+    delete m_d;
+}
+
+void
+FFT::process(bool inverse,
+             const double *p_lpRealIn, const double *p_lpImagIn,
+             double *p_lpRealOut, double *p_lpImagOut)
+{
+    m_d->process(inverse,
+                 p_lpRealIn, p_lpImagIn,
+                 p_lpRealOut, p_lpImagOut);
+}
+    
+class FFTReal::D
+{
+public:
+    D(int n) : m_n(n) {
+        if (n % 2) {
+            throw std::invalid_argument
+                ("nsamples must be even in FFTReal constructor");
+        }
+        m_planf = kiss_fftr_alloc(m_n, 0, NULL, NULL);
+        m_plani = kiss_fftr_alloc(m_n, 1, NULL, NULL);
+        m_c = new kiss_fft_cpx[m_n];
+    }
+
+    ~D() {
+        kiss_fftr_free(m_planf);
+        kiss_fftr_free(m_plani);
+        delete[] m_c;
+    }
+
+    void forward(const double *ri, double *ro, double *io) {
+
+        kiss_fftr(m_planf, ri, m_c);
+
+        for (int i = 0; i <= m_n/2; ++i) {
+            ro[i] = m_c[i].r;
+            io[i] = m_c[i].i;
+        }
+
+        for (int i = 0; i + 1 < m_n/2; ++i) {
+            ro[m_n - i - 1] =  ro[i + 1];
+            io[m_n - i - 1] = -io[i + 1];
+        }
+    }
+
+    void forwardMagnitude(const double *ri, double *mo) {
+
+        double *io = new double[m_n];
+
+        forward(ri, mo, io);
+
+        for (int i = 0; i < m_n; ++i) {
+            mo[i] = sqrt(mo[i] * mo[i] + io[i] * io[i]);
+        }
+
+        delete[] io;
+    }
+
+    void inverse(const double *ri, const double *ii, double *ro) {
+
+        // kiss_fftr.h says
+        // "input freqdata has nfft/2+1 complex points"
+
+        for (int i = 0; i < m_n/2 + 1; ++i) {
+            m_c[i].r = ri[i];
+            m_c[i].i = ii[i];
+        }
+        
+        kiss_fftri(m_plani, m_c, ro);
+
+        double scale = 1.0 / m_n;
+
+        for (int i = 0; i < m_n; ++i) {
+            ro[i] *= scale;
+        }
+    }
+
+private:
+    int m_n;
+    kiss_fftr_cfg m_planf;
+    kiss_fftr_cfg m_plani;
+    kiss_fft_cpx *m_c;
+};
+
+FFTReal::FFTReal(int n) :
+    m_d(new D(n)) 
+{
+}
+
+FFTReal::~FFTReal()
+{
+    delete m_d;
+}
+
+void
+FFTReal::forward(const double *ri, double *ro, double *io)
+{
+    m_d->forward(ri, ro, io);
+}
+
+void
+FFTReal::forwardMagnitude(const double *ri, double *mo)
+{
+    m_d->forwardMagnitude(ri, mo);
+}
+
+void
+FFTReal::inverse(const double *ri, const double *ii, double *ro)
+{
+    m_d->inverse(ri, ii, ro);
+}
+
+
+    
--- a/dsp/wavelet/Wavelet.cpp	Tue Jan 30 20:14:46 2018 +0000
+++ b/dsp/wavelet/Wavelet.cpp	Thu Feb 01 16:34:08 2018 +0000
@@ -71,8 +71,8 @@
 
 void
 Wavelet::createDecompositionFilters(Type wavelet,
-                                    std::vector<float> &lpd,
-                                    std::vector<float> &hpd)
+                                    std::vector<double> &lpd,
+                                    std::vector<double> &hpd)
 {
     lpd.clear();
     hpd.clear();
--- a/dsp/wavelet/Wavelet.h	Tue Jan 30 20:14:46 2018 +0000
+++ b/dsp/wavelet/Wavelet.h	Thu Feb 01 16:34:08 2018 +0000
@@ -73,8 +73,8 @@
     static std::string getWaveletName(Type);
 
     static void createDecompositionFilters(Type,
-                                           std::vector<float> &lpd,
-                                           std::vector<float> &hpd);
+                                           std::vector<double> &lpd,
+                                           std::vector<double> &hpd);
 };
 
 #endif