changeset 434:7461bf03194e

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 <c.cannam@qmul.ac.uk>
date Thu, 01 Feb 2018 16:34:08 +0000
parents ecc92deb4c0b
children ad02841a1172
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