cannam@0: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ cannam@0: cannam@0: /* cannam@0: QM DSP Library cannam@0: cannam@0: Centre for Digital Music, Queen Mary, University of London. cannam@0: This file copyright 2005-2006 Christian Landone. cannam@0: All rights reserved. cannam@0: */ cannam@0: cannam@0: #include "DFProcess.h" cannam@16: #include "maths/MathUtilities.h" cannam@0: cannam@0: ////////////////////////////////////////////////////////////////////// cannam@0: // Construction/Destruction cannam@0: ////////////////////////////////////////////////////////////////////// cannam@0: cannam@0: DFProcess::DFProcess( DFProcConfig Config ) cannam@0: { cannam@0: filtSrc = NULL; cannam@0: filtDst = NULL; cannam@0: m_filtScratchIn = NULL; cannam@0: m_filtScratchOut = NULL; cannam@0: cannam@0: m_FFOrd = 0; cannam@0: cannam@0: initialise( Config ); cannam@0: } cannam@0: cannam@0: DFProcess::~DFProcess() cannam@0: { cannam@0: deInitialise(); cannam@0: } cannam@0: cannam@0: void DFProcess::initialise( DFProcConfig Config ) cannam@0: { cannam@0: m_length = Config.length; cannam@0: m_winPre = Config.winPre; cannam@0: m_winPost = Config.winPost; cannam@0: m_alphaNormParam = Config.AlphaNormParam; cannam@0: cannam@0: m_isMedianPositive = Config.isMedianPositive; cannam@0: cannam@0: filtSrc = new double[ m_length ]; cannam@0: filtDst = new double[ m_length ]; cannam@0: cannam@0: cannam@0: //Low Pass Smoothing Filter Config cannam@0: m_FilterConfigParams.ord = Config.LPOrd; cannam@0: m_FilterConfigParams.ACoeffs = Config.LPACoeffs; cannam@0: m_FilterConfigParams.BCoeffs = Config.LPBCoeffs; cannam@0: cannam@0: m_FiltFilt = new FiltFilt( m_FilterConfigParams ); cannam@0: } cannam@0: cannam@0: void DFProcess::deInitialise() cannam@0: { cannam@0: delete [] filtSrc; cannam@0: cannam@0: delete [] filtDst; cannam@0: cannam@0: delete [] m_filtScratchIn; cannam@0: cannam@0: delete [] m_filtScratchOut; cannam@0: cannam@0: delete m_FiltFilt; cannam@0: } cannam@0: cannam@0: void DFProcess::process(double *src, double* dst) cannam@0: { cannam@0: removeDCNormalize( src, filtSrc ); cannam@0: cannam@0: m_FiltFilt->process( filtSrc, filtDst, m_length ); cannam@0: cannam@0: medianFilter( filtDst, dst ); cannam@0: } cannam@0: cannam@0: cannam@0: void DFProcess::medianFilter(double *src, double *dst) cannam@0: { cannam@0: unsigned int i,k,j,l; cannam@0: unsigned int index = 0; cannam@0: cannam@0: double val = 0; cannam@0: cannam@0: double* y = new double[ m_winPost + m_winPre + 1]; cannam@0: memset( y, 0, sizeof( double ) * ( m_winPost + m_winPre + 1) ); cannam@0: cannam@0: double* scratch = new double[ m_length ]; cannam@0: cannam@0: for( i = 0; i < m_winPre; i++) cannam@0: { cannam@0: k = i + m_winPost + 1; cannam@0: cannam@0: for( j = 0; j < k; j++) cannam@0: { cannam@0: y[ j ] = src[ j ]; cannam@0: } cannam@0: scratch[ index ] = MathUtilities::median( y, k ); cannam@0: index++; cannam@0: } cannam@0: cannam@0: for( i = 0; i < ( m_length - ( m_winPost + m_winPre ) ); i ++) cannam@0: { cannam@0: cannam@0: l = 0; cannam@0: for( j = i; j < ( i + m_winPost + m_winPre + 1); j++) cannam@0: { cannam@0: y[ l ] = src[ j ]; cannam@0: l++; cannam@0: } cannam@0: cannam@0: scratch[ index++ ] = MathUtilities::median( y, (m_winPost + m_winPre + 1 )); cannam@0: } cannam@0: cannam@0: for( i = std::max( m_length - m_winPost, (unsigned)1); i < m_length; i++) cannam@0: { cannam@0: k = std::max( i - m_winPre, (unsigned)1); cannam@0: cannam@0: l = 0; cannam@0: for( j = k; j < m_length; j++) cannam@0: { cannam@0: y[ l ] = src[ j ]; cannam@0: cannam@0: l++; cannam@0: } cannam@0: cannam@0: scratch[ index++ ] = MathUtilities::median( y, l); cannam@0: } cannam@0: cannam@0: cannam@0: for( i = 0; i < m_length; i++ ) cannam@0: { cannam@0: val = src[ i ] - scratch[ i ];// - 0.033; cannam@0: cannam@0: if( m_isMedianPositive ) cannam@0: { cannam@0: if( val > 0 ) cannam@0: { cannam@0: dst[ i ] = val; cannam@0: } cannam@0: else cannam@0: { cannam@0: dst[ i ] = 0; cannam@0: } cannam@0: } cannam@0: else cannam@0: { cannam@0: dst[ i ] = val; cannam@0: } cannam@0: } cannam@0: cannam@0: delete [] y; cannam@0: delete [] scratch; cannam@0: } cannam@0: cannam@0: cannam@0: void DFProcess::removeDCNormalize( double *src, double*dst ) cannam@0: { cannam@0: double DFmax = 0; cannam@0: double DFMin = 0; cannam@0: double DFAlphaNorm = 0; cannam@0: cannam@0: MathUtilities::getFrameMinMax( src, m_length, &DFMin, &DFmax ); cannam@0: cannam@0: MathUtilities::getAlphaNorm( src, m_length, m_alphaNormParam, &DFAlphaNorm ); cannam@0: cannam@0: for( unsigned int i = 0; i< m_length; i++) cannam@0: { cannam@0: dst[ i ] = ( src[ i ] - DFMin ) / DFAlphaNorm; cannam@0: } cannam@0: }