Mercurial > hg > qm-dsp
diff dsp/signalconditioning/FiltFilt.cpp @ 0:d7116e3183f8
* Queen Mary C++ DSP library
author | cannam |
---|---|
date | Wed, 05 Apr 2006 17:35:59 +0000 |
parents | |
children | d72fcd34d9a7 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dsp/signalconditioning/FiltFilt.cpp Wed Apr 05 17:35:59 2006 +0000 @@ -0,0 +1,124 @@ +/* -*- 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. + This file copyright 2005-2006 Christian Landone. + All rights reserved. +*/ + +#include "FiltFilt.h" + +////////////////////////////////////////////////////////////////////// +// Construction/Destruction +////////////////////////////////////////////////////////////////////// + +FiltFilt::FiltFilt( FiltFiltConfig Config ) +{ + m_filtScratchIn = NULL; + m_filtScratchOut = NULL; + m_ord = 0; + + initialise( Config ); +} + +FiltFilt::~FiltFilt() +{ + deInitialise(); +} + +void FiltFilt::initialise( FiltFiltConfig 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 ); +} + +void FiltFilt::deInitialise() +{ + delete m_filter; +} + + +void FiltFilt::process(double *src, double *dst, unsigned int length) +{ + unsigned int i; + + unsigned int nFilt = m_ord + 1; + unsigned int nFact = 3 * ( nFilt - 1); + unsigned int nExt = length + 2 * nFact; + + + m_filtScratchIn = new double[ nExt ]; + m_filtScratchOut = new double[ nExt ]; + + + for( i = 0; i< nExt; i++ ) + { + m_filtScratchIn[ i ] = 0.0; + m_filtScratchOut[ i ] = 0.0; + } + + // Edge transients reflection + double sample0 = 2 * src[ 0 ]; + double sampleN = 2 * src[ length - 1 ]; + + unsigned int index = 0; + for( i = nFact; i > 0; i-- ) + { + m_filtScratchIn[ index++ ] = sample0 - src[ i ]; + } + index = 0; + for( i = 0; i < nFact; i++ ) + { + m_filtScratchIn[ (nExt - nFact) + index++ ] = sampleN - src[ (length - 2) - i ]; + } + + index = 0; + for( i = 0; i < length; i++ ) + { + m_filtScratchIn[ i + nFact ] = src[ i ]; + } + + //////////////////////////////// + // Do 0Ph filtering + m_filter->process( m_filtScratchIn, m_filtScratchOut, nExt); + + // reverse the series for FILTFILT + for ( i = 0; i < nExt; i++) + { + m_filtScratchIn[ i ] = m_filtScratchOut[ nExt - i - 1]; + } + + // do FILTER again + m_filter->process( m_filtScratchIn, m_filtScratchOut, nExt); + + // reverse the series back + for ( i = 0; i < nExt; i++) + { + m_filtScratchIn[ i ] = m_filtScratchOut[ nExt - i - 1 ]; + } + for ( i = 0;i < nExt; i++) + { + m_filtScratchOut[ i ] = m_filtScratchIn[ i ]; + } + + index = 0; + for( i = 0; i < length; i++ ) + { + dst[ index++ ] = m_filtScratchOut[ i + nFact ]; + } + + delete [] m_filtScratchIn; + delete [] m_filtScratchOut; + +} + +void FiltFilt::reset() +{ + +}