changeset 74:769da847732b

* A few fixes prompted by vamp-plugin-tester
author cannam
date Mon, 08 Jun 2009 12:30:20 +0000
parents dcb555b90924
children 20cf21c76689
files dsp/signalconditioning/DFProcess.cpp dsp/signalconditioning/DFProcess.h dsp/tonal/TonalEstimator.h dsp/transforms/FFT.cpp maths/CosineDistance.cpp maths/KLDivergence.cpp
diffstat 6 files changed, 48 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- a/dsp/signalconditioning/DFProcess.cpp	Fri Jun 05 15:12:39 2009 +0000
+++ b/dsp/signalconditioning/DFProcess.cpp	Mon Jun 08 12:30:20 2009 +0000
@@ -82,8 +82,8 @@
 
 void DFProcess::medianFilter(double *src, double *dst)
 {
-    unsigned int i,k,j,l;
-    unsigned int index = 0;
+    int i,k,j,l;
+    int index = 0;
 
     double val = 0;
 
@@ -92,8 +92,10 @@
 
     double* scratch = new double[ m_length ];
 
-    for( i = 0; i < m_winPre; i++)
+    for( i = 0; i < m_winPre && index; i++)
     {
+        if (index >= m_length) break;
+
 	k = i + m_winPost + 1;
 
 	for( j = 0; j < k; j++)
@@ -104,8 +106,10 @@
 	index++;
     }
 
-    for(  i = 0; i < ( m_length - ( m_winPost + m_winPre ) ); i ++)
+    for(  i = 0; i + m_winPost + m_winPre < m_length; i ++)
     {
+        if (index >= m_length) break;
+
 			 
 	l = 0;
 	for(  j  = i; j < ( i + m_winPost + m_winPre + 1); j++)
@@ -117,9 +121,11 @@
 	scratch[ index++ ] = MathUtilities::median( y, (m_winPost + m_winPre + 1 ));
     }
 
-    for( i = std::max( m_length - m_winPost, (unsigned)1); i < m_length; i++)
+    for( i = std::max( m_length - m_winPost, 1); i < m_length; i++)
     {
-	k = std::max( i - m_winPre, (unsigned)1);
+        if (index >= m_length) break;
+
+	k = std::max( i - m_winPre, 1);
 
 	l = 0;
 	for( j = k; j < m_length; j++)
--- a/dsp/signalconditioning/DFProcess.h	Fri Jun 05 15:12:39 2009 +0000
+++ b/dsp/signalconditioning/DFProcess.h	Mon Jun 08 12:30:20 2009 +0000
@@ -40,11 +40,11 @@
     void removeDCNormalize( double *src, double*dst );
     void medianFilter( double* src, double* dst );
 
-    unsigned int m_length;
-    unsigned int m_FFOrd;
+    int m_length;
+    int m_FFOrd;
 
-    unsigned int m_winPre;
-    unsigned int m_winPost;
+    int m_winPre;
+    int m_winPost;
 
     double m_alphaNormParam;
 
--- a/dsp/tonal/TonalEstimator.h	Fri Jun 05 15:12:39 2009 +0000
+++ b/dsp/tonal/TonalEstimator.h	Mon Jun 08 12:30:20 2009 +0000
@@ -44,6 +44,12 @@
 		for (size_t i = 0; i < 12; dSum > 0.0000001?((*this)[i] /= dSum):(*this)[i]=0.0, i++) ;
 
 	}
+
+    void clear()
+    {
+        for (size_t i = 0; i < 12; ++i) (*this)[i] = 0.0;
+    }
+        
 	
 };
 
--- a/dsp/transforms/FFT.cpp	Fri Jun 05 15:12:39 2009 +0000
+++ b/dsp/transforms/FFT.cpp	Mon Jun 08 12:30:20 2009 +0000
@@ -199,6 +199,12 @@
     m_n(n),
     m_private(0)
 {
+    if (m_n & 1) {
+        std::cerr << "Error: Odd FFT size " << m_n
+                  << " not supported in this implementation"
+                  << std::endl;
+        return;
+    }
     KissFFTRec *rec = new KissFFTRec;
     rec->forward = kiss_fft_alloc(m_n, 0, 0, 0);
     rec->inverse = kiss_fft_alloc(m_n, 1, 0, 0);
@@ -209,6 +215,7 @@
 
 FFT::~FFT()
 {
+    if (!m_private) return;
     KissFFTRec *rec = (KissFFTRec *)m_private;
     kiss_fft_free(rec->forward);
     kiss_fft_free(rec->inverse);
@@ -221,6 +228,7 @@
              const double *rin, const double *iin,
              double *rout, double *iout)
 {
+    if (!m_private) return;
     KissFFTRec *rec = (KissFFTRec *)m_private;
     for (int i = 0; i < m_n; ++i) {
         rec->in[i].r = rin[i];
@@ -255,6 +263,12 @@
     m_n(n),
     m_private(0)
 {
+    if (m_n & 1) {
+        std::cerr << "Error: Odd FFT size " << m_n
+                  << " not supported in this implementation"
+                  << std::endl;
+        return;
+    }
     KissFFTRealRec *rec = new KissFFTRealRec;
     rec->forward = kiss_fftr_alloc(m_n, 0, 0, 0);
     rec->inverse = kiss_fftr_alloc(m_n, 1, 0, 0);
@@ -264,6 +278,7 @@
 
 FFTReal::~FFTReal()
 {
+    if (!m_private) return;
     KissFFTRealRec *rec = (KissFFTRealRec *)m_private;
     kiss_fftr_free(rec->forward);
     kiss_fftr_free(rec->inverse);
@@ -275,6 +290,7 @@
                  const double *rin,
                  double *rout, double *iout)
 {
+    if (!m_private) return;
     KissFFTRealRec *rec = (KissFFTRealRec *)m_private;
     if (inverse) {
         kiss_fftr(rec->inverse, rin, rec->out);
--- a/maths/CosineDistance.cpp	Fri Jun 05 15:12:39 2009 +0000
+++ b/maths/CosineDistance.cpp	Mon Jun 08 12:30:20 2009 +0000
@@ -19,6 +19,7 @@
                                 const vector<double> &v2)
 {
     dist = 1.0; dDenTot = 0; dDen1 = 0; dDen2 = 0; dSum1 =0;
+    double small = 1e-20;
 
     //check if v1, v2 same size
     if (v1.size() != v2.size())
@@ -34,13 +35,7 @@
             dDen1 += v1[i]*v1[i];
             dDen2 += v2[i]*v2[i];
         }
-        dDenTot = sqrt(fabs(dDen1*dDen2));
-        if(dDenTot == 0)
-        {
-            cerr << "CosineDistance::distance: WARNING: dividing by zero in cosine dist\n";
-            return 1.0;
-        }
-	
+        dDenTot = sqrt(fabs(dDen1*dDen2)) + small;
         dist = 1-((dSum1)/dDenTot);
         return dist;
     }
--- a/maths/KLDivergence.cpp	Fri Jun 05 15:12:39 2009 +0000
+++ b/maths/KLDivergence.cpp	Mon Jun 08 12:30:20 2009 +0000
@@ -20,10 +20,16 @@
     int sz = m1.size();
 
     double d = -2.0 * sz;
+    double small = 1e-20;
 
     for (int k = 0; k < sz; ++k) {
-        d += v1[k] / v2[k] + v2[k] / v1[k];
-        d += (m1[k] - m2[k]) * (1.0 / v1[k] + 1.0 / v2[k]) * (m1[k] - m2[k]);
+
+        double kv1 = v1[k] + small;
+        double kv2 = v2[k] + small;
+        double km = (m1[k] - m2[k]) + small;
+
+        d += kv1 / kv2 + kv2 / kv1;
+        d += km * (1.0 / kv1 + 1.0 / kv2) * km;
     }
 
     d /= 2.0;