diff options
author | Robin Gareus <robin@gareus.org> | 2016-10-06 00:16:44 +0200 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2016-10-06 00:57:53 +0200 |
commit | f68d2e06bcfb81efda107d3b4c3aa7dbc2d73bc2 (patch) | |
tree | 286d5b2b1c3573c2fbfc77b4d29b0b2a6bfa9686 /libs/qm-dsp/dsp/signalconditioning | |
parent | 2a27cc475867612afd261e5bf3b2a1a42b9c75cc (diff) |
update qm-dsp library
Diffstat (limited to 'libs/qm-dsp/dsp/signalconditioning')
-rw-r--r-- | libs/qm-dsp/dsp/signalconditioning/DFProcess.cpp | 35 | ||||
-rw-r--r-- | libs/qm-dsp/dsp/signalconditioning/DFProcess.h | 39 | ||||
-rw-r--r-- | libs/qm-dsp/dsp/signalconditioning/FiltFilt.cpp | 30 | ||||
-rw-r--r-- | libs/qm-dsp/dsp/signalconditioning/FiltFilt.h | 17 | ||||
-rw-r--r-- | libs/qm-dsp/dsp/signalconditioning/Filter.h | 12 | ||||
-rw-r--r-- | libs/qm-dsp/dsp/signalconditioning/Framer.cpp | 10 | ||||
-rw-r--r-- | libs/qm-dsp/dsp/signalconditioning/Framer.h | 2 |
7 files changed, 94 insertions, 51 deletions
diff --git a/libs/qm-dsp/dsp/signalconditioning/DFProcess.cpp b/libs/qm-dsp/dsp/signalconditioning/DFProcess.cpp index 4b93cb0e12..52443fb384 100644 --- a/libs/qm-dsp/dsp/signalconditioning/DFProcess.cpp +++ b/libs/qm-dsp/dsp/signalconditioning/DFProcess.cpp @@ -6,6 +6,14 @@ Centre for Digital Music, Queen Mary, University of London. This file 2005-2006 Christian Landone. + Modifications: + + - delta threshold + Description: add delta threshold used as offset in the smoothed + detection function + Author: Mathieu Barthet + Date: June 2010 + This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the @@ -25,7 +33,7 @@ DFProcess::DFProcess( DFProcConfig Config ) { filtSrc = NULL; - filtDst = NULL; + filtDst = NULL; m_filtScratchIn = NULL; m_filtScratchOut = NULL; @@ -51,13 +59,16 @@ void DFProcess::initialise( DFProcConfig Config ) filtSrc = new double[ m_length ]; filtDst = new double[ m_length ]; - + //Low Pass Smoothing Filter Config m_FilterConfigParams.ord = Config.LPOrd; m_FilterConfigParams.ACoeffs = Config.LPACoeffs; m_FilterConfigParams.BCoeffs = Config.LPBCoeffs; - + m_FiltFilt = new FiltFilt( m_FilterConfigParams ); + + //add delta threshold + m_delta = Config.delta; } void DFProcess::deInitialise() @@ -115,7 +126,7 @@ void DFProcess::medianFilter(double *src, double *dst) { if (index >= m_length) break; - + l = 0; for( j = i; j < ( i + m_winPost + m_winPre + 1); j++) { @@ -139,15 +150,17 @@ void DFProcess::medianFilter(double *src, double *dst) l++; } - - scratch[ index++ ] = MathUtilities::median( y, l); + + scratch[ index++ ] = MathUtilities::median( y, l); } for( i = 0; i < m_length; i++ ) { - val = src[ i ] - scratch[ i ];// - 0.033; - + //add a delta threshold used as an offset when computing the smoothed detection function + //(helps to discard noise when detecting peaks) + val = src[ i ] - scratch[ i ] - m_delta; + if( m_isMedianPositive ) { if( val > 0 ) @@ -164,7 +177,7 @@ void DFProcess::medianFilter(double *src, double *dst) dst[ i ] = val; } } - + delete [] y; delete [] scratch; } @@ -180,8 +193,8 @@ void DFProcess::removeDCNormalize( double *src, double*dst ) MathUtilities::getAlphaNorm( src, m_length, m_alphaNormParam, &DFAlphaNorm ); - for(int i = 0; i< m_length; i++) + for( unsigned int i = 0; i< m_length; i++) { - dst[ i ] = ( src[ i ] - DFMin ) / DFAlphaNorm; + dst[ i ] = ( src[ i ] - DFMin ) / DFAlphaNorm; } } diff --git a/libs/qm-dsp/dsp/signalconditioning/DFProcess.h b/libs/qm-dsp/dsp/signalconditioning/DFProcess.h index ad40f846b9..b93b535518 100644 --- a/libs/qm-dsp/dsp/signalconditioning/DFProcess.h +++ b/libs/qm-dsp/dsp/signalconditioning/DFProcess.h @@ -6,6 +6,14 @@ Centre for Digital Music, Queen Mary, University of London. This file 2005-2006 Christian Landone. + Modifications: + + - delta threshold + Description: add delta threshold used as offset in the smoothed + detection function + Author: Mathieu Barthet + Date: June 2010 + This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the @@ -20,17 +28,31 @@ #include "FiltFilt.h" struct DFProcConfig{ - unsigned int length; - unsigned int LPOrd; - double *LPACoeffs; - double *LPBCoeffs; + unsigned int length; + unsigned int LPOrd; + double *LPACoeffs; + double *LPBCoeffs; unsigned int winPre; - unsigned int winPost; + unsigned int winPost; double AlphaNormParam; bool isMedianPositive; + float delta; //delta threshold used as an offset when computing the smoothed detection function + + DFProcConfig() : + length(0), + LPOrd(0), + LPACoeffs(NULL), + LPBCoeffs(NULL), + winPre(0), + winPost(0), + AlphaNormParam(0), + isMedianPositive(false), + delta(0) + { + } }; -class DFProcess +class DFProcess { public: DFProcess( DFProcConfig Config ); @@ -38,7 +60,7 @@ public: void process( double* src, double* dst ); - + private: void initialise( DFProcConfig Config ); void deInitialise(); @@ -59,11 +81,12 @@ private: double* m_filtScratchIn; double* m_filtScratchOut; - FiltFiltConfig m_FilterConfigParams; + FilterConfig m_FilterConfigParams; FiltFilt* m_FiltFilt; bool m_isMedianPositive; + float m_delta; //add delta threshold }; #endif diff --git a/libs/qm-dsp/dsp/signalconditioning/FiltFilt.cpp b/libs/qm-dsp/dsp/signalconditioning/FiltFilt.cpp index 13dbda0e82..89076c150f 100644 --- a/libs/qm-dsp/dsp/signalconditioning/FiltFilt.cpp +++ b/libs/qm-dsp/dsp/signalconditioning/FiltFilt.cpp @@ -19,12 +19,12 @@ // Construction/Destruction ////////////////////////////////////////////////////////////////////// -FiltFilt::FiltFilt( FiltFiltConfig Config ) +FiltFilt::FiltFilt( FilterConfig Config ) { m_filtScratchIn = NULL; m_filtScratchOut = NULL; m_ord = 0; - + initialise( Config ); } @@ -33,13 +33,13 @@ FiltFilt::~FiltFilt() deInitialise(); } -void FiltFilt::initialise( FiltFiltConfig Config ) +void FiltFilt::initialise( FilterConfig Config ) { m_ord = Config.ord; m_filterConfig.ord = Config.ord; m_filterConfig.ACoeffs = Config.ACoeffs; m_filterConfig.BCoeffs = Config.BCoeffs; - + m_filter = new Filter( m_filterConfig ); } @@ -50,7 +50,7 @@ void FiltFilt::deInitialise() void FiltFilt::process(double *src, double *dst, unsigned int length) -{ +{ unsigned int i; if (length == 0) return; @@ -62,8 +62,8 @@ void FiltFilt::process(double *src, double *dst, unsigned int length) m_filtScratchIn = new double[ nExt ]; m_filtScratchOut = new double[ nExt ]; - - for( i = 0; i< nExt; i++ ) + + for( i = 0; i< nExt; i++ ) { m_filtScratchIn[ i ] = 0.0; m_filtScratchOut[ i ] = 0.0; @@ -89,21 +89,21 @@ void FiltFilt::process(double *src, double *dst, unsigned int length) { m_filtScratchIn[ i + nFact ] = src[ i ]; } - + //////////////////////////////// // Do 0Ph filtering m_filter->process( m_filtScratchIn, m_filtScratchOut, nExt); - - // reverse the series for FILTFILT + + // reverse the series for FILTFILT for ( i = 0; i < nExt; i++) - { + { m_filtScratchIn[ i ] = m_filtScratchOut[ nExt - i - 1]; } - // do FILTER again + // do FILTER again m_filter->process( m_filtScratchIn, m_filtScratchOut, nExt); - - // reverse the series back + + // reverse the series back for ( i = 0; i < nExt; i++) { m_filtScratchIn[ i ] = m_filtScratchOut[ nExt - i - 1 ]; @@ -117,7 +117,7 @@ void FiltFilt::process(double *src, double *dst, unsigned int length) for( i = 0; i < length; i++ ) { dst[ index++ ] = m_filtScratchOut[ i + nFact ]; - } + } delete [] m_filtScratchIn; delete [] m_filtScratchOut; diff --git a/libs/qm-dsp/dsp/signalconditioning/FiltFilt.h b/libs/qm-dsp/dsp/signalconditioning/FiltFilt.h index a722971ee2..e5a38124cf 100644 --- a/libs/qm-dsp/dsp/signalconditioning/FiltFilt.h +++ b/libs/qm-dsp/dsp/signalconditioning/FiltFilt.h @@ -18,23 +18,22 @@ #include "Filter.h" -struct FiltFiltConfig{ - unsigned int ord; - double* ACoeffs; - double* BCoeffs; -}; - -class FiltFilt +/** + * Zero-phase digital filter, implemented by processing the data + * through a filter specified by the given FilterConfig structure (see + * Filter) and then processing it again in reverse. + */ +class FiltFilt { public: - FiltFilt( FiltFiltConfig Config ); + FiltFilt( FilterConfig Config ); virtual ~FiltFilt(); void reset(); void process( double* src, double* dst, unsigned int length ); private: - void initialise( FiltFiltConfig Config ); + void initialise( FilterConfig Config ); void deInitialise(); unsigned int m_ord; diff --git a/libs/qm-dsp/dsp/signalconditioning/Filter.h b/libs/qm-dsp/dsp/signalconditioning/Filter.h index b1c20d506a..9f25945fc1 100644 --- a/libs/qm-dsp/dsp/signalconditioning/Filter.h +++ b/libs/qm-dsp/dsp/signalconditioning/Filter.h @@ -20,13 +20,22 @@ #define NULL 0 #endif +/** + * Filter specification. For a filter of order ord, the ACoeffs and + * BCoeffs arrays must point to ord+1 values each. ACoeffs provides + * the denominator and BCoeffs the numerator coefficients of the + * filter. + */ struct FilterConfig{ unsigned int ord; double* ACoeffs; double* BCoeffs; }; -class Filter +/** + * Digital filter specified through FilterConfig structure. + */ +class Filter { public: Filter( FilterConfig Config ); @@ -36,7 +45,6 @@ public: void process( double *src, double *dst, unsigned int length ); - private: void initialise( FilterConfig Config ); void deInitialise(); diff --git a/libs/qm-dsp/dsp/signalconditioning/Framer.cpp b/libs/qm-dsp/dsp/signalconditioning/Framer.cpp index 7357d2417a..e352278ada 100644 --- a/libs/qm-dsp/dsp/signalconditioning/Framer.cpp +++ b/libs/qm-dsp/dsp/signalconditioning/Framer.cpp @@ -44,14 +44,14 @@ void Framer::configure( unsigned int frameLength, unsigned int hop ) if( m_dataFrame != NULL ) { - delete [] m_dataFrame; + delete [] m_dataFrame; m_dataFrame = NULL; } m_dataFrame = new double[ m_frameLength ]; if( m_strideFrame != NULL ) { - delete [] m_strideFrame; + delete [] m_strideFrame; m_strideFrame = NULL; } m_strideFrame = new double[ m_stepSize ]; @@ -64,8 +64,8 @@ void Framer::getFrame(double *dst) { for( unsigned int u = 0; u < m_frameLength; u++) { - dst[ u ] = m_srcBuffer[ m_ulSrcIndex++ ]; - } + dst[ u ] = m_srcBuffer[ m_ulSrcIndex++ ]; + } m_ulSrcIndex -= ( m_frameLength - m_stepSize ); } else @@ -77,7 +77,7 @@ void Framer::getFrame(double *dst) { dst[ u ] = m_srcBuffer[ m_ulSrcIndex++ ]; } - + for( unsigned int u = 0; u < zero; u++ ) { dst[ rem + u ] = 0; diff --git a/libs/qm-dsp/dsp/signalconditioning/Framer.h b/libs/qm-dsp/dsp/signalconditioning/Framer.h index 4c05949768..7da0718b2b 100644 --- a/libs/qm-dsp/dsp/signalconditioning/Framer.h +++ b/libs/qm-dsp/dsp/signalconditioning/Framer.h @@ -21,7 +21,7 @@ #include <stdio.h> -class Framer +class Framer { public: void setSource( double* src, unsigned int length ); |