Mercurial > hg > qm-dsp
annotate dsp/signalconditioning/Filter.cpp @ 0:d7116e3183f8
* Queen Mary C++ DSP library
author | cannam |
---|---|
date | Wed, 05 Apr 2006 17:35:59 +0000 |
parents | |
children | e5907ae6de17 |
rev | line source |
---|---|
cannam@0 | 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ |
cannam@0 | 2 |
cannam@0 | 3 /* |
cannam@0 | 4 QM DSP Library |
cannam@0 | 5 |
cannam@0 | 6 Centre for Digital Music, Queen Mary, University of London. |
cannam@0 | 7 This file copyright 2005-2006 Christian Landone. |
cannam@0 | 8 All rights reserved. |
cannam@0 | 9 */ |
cannam@0 | 10 |
cannam@0 | 11 #include "Filter.h" |
cannam@0 | 12 |
cannam@0 | 13 ////////////////////////////////////////////////////////////////////// |
cannam@0 | 14 // Construction/Destruction |
cannam@0 | 15 ////////////////////////////////////////////////////////////////////// |
cannam@0 | 16 |
cannam@0 | 17 Filter::Filter( FilterConfig Config ) |
cannam@0 | 18 { |
cannam@0 | 19 m_ord = 0; |
cannam@0 | 20 m_outBuffer = NULL; |
cannam@0 | 21 m_inBuffer = NULL; |
cannam@0 | 22 |
cannam@0 | 23 initialise( Config ); |
cannam@0 | 24 } |
cannam@0 | 25 |
cannam@0 | 26 Filter::~Filter() |
cannam@0 | 27 { |
cannam@0 | 28 deInitialise(); |
cannam@0 | 29 } |
cannam@0 | 30 |
cannam@0 | 31 void Filter::initialise( FilterConfig Config ) |
cannam@0 | 32 { |
cannam@0 | 33 m_ord = Config.ord; |
cannam@0 | 34 m_ACoeffs = Config.ACoeffs; |
cannam@0 | 35 m_BCoeffs = Config.BCoeffs; |
cannam@0 | 36 |
cannam@0 | 37 m_inBuffer = new double[ m_ord + 1 ]; |
cannam@0 | 38 m_outBuffer = new double[ m_ord + 1 ]; |
cannam@0 | 39 |
cannam@0 | 40 reset(); |
cannam@0 | 41 } |
cannam@0 | 42 |
cannam@0 | 43 void Filter::deInitialise() |
cannam@0 | 44 { |
cannam@0 | 45 delete[] m_inBuffer; |
cannam@0 | 46 delete[] m_outBuffer; |
cannam@0 | 47 } |
cannam@0 | 48 |
cannam@0 | 49 void Filter::reset() |
cannam@0 | 50 { |
cannam@0 | 51 for( unsigned int i = 0; i < m_ord+1; i++ ){ m_inBuffer[ i ] = 0.0; } |
cannam@0 | 52 for(unsigned int i = 0; i < m_ord+1; i++ ){ m_outBuffer[ i ] = 0.0; } |
cannam@0 | 53 } |
cannam@0 | 54 |
cannam@0 | 55 void Filter::process( double *src, double *dst, unsigned int length ) |
cannam@0 | 56 { |
cannam@0 | 57 unsigned int SP,i,j; |
cannam@0 | 58 |
cannam@0 | 59 double xin,xout; |
cannam@0 | 60 |
cannam@0 | 61 for (SP=0;SP<length;SP++) |
cannam@0 | 62 { |
cannam@0 | 63 xin=src[SP]; |
cannam@0 | 64 /* move buffer */ |
cannam@0 | 65 for ( i = 0; i < m_ord; i++) {m_inBuffer[ m_ord - i ]=m_inBuffer[ m_ord - i - 1 ];} |
cannam@0 | 66 m_inBuffer[0]=xin; |
cannam@0 | 67 |
cannam@0 | 68 xout=0.0; |
cannam@0 | 69 for (j=0;j< m_ord + 1; j++) |
cannam@0 | 70 xout = xout + m_BCoeffs[ j ] * m_inBuffer[ j ]; |
cannam@0 | 71 for (j = 0; j < m_ord; j++) |
cannam@0 | 72 xout= xout - m_ACoeffs[ j + 1 ] * m_outBuffer[ j ]; |
cannam@0 | 73 |
cannam@0 | 74 dst[ SP ] = xout; |
cannam@0 | 75 for ( i = 0; i < m_ord - 1; i++ ) { m_outBuffer[ m_ord - i - 1 ] = m_outBuffer[ m_ord - i - 2 ];} |
cannam@0 | 76 m_outBuffer[0]=xout; |
cannam@0 | 77 |
cannam@0 | 78 } /* end of SP loop */ |
cannam@0 | 79 } |
cannam@0 | 80 |
cannam@0 | 81 |
cannam@0 | 82 |