Mercurial > hg > qm-dsp
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;