comparison dsp/signalconditioning/FiltFilt.cpp @ 193:ca658c7215a9

Faster filter implementation with explicit FIR support
author Chris Cannam
date Wed, 07 Oct 2015 10:36:09 +0100
parents 715f779d0b4f
children fdaa63607c15
comparison
equal deleted inserted replaced
192:3780b91297ea 193:ca658c7215a9
17 17
18 ////////////////////////////////////////////////////////////////////// 18 //////////////////////////////////////////////////////////////////////
19 // Construction/Destruction 19 // Construction/Destruction
20 ////////////////////////////////////////////////////////////////////// 20 //////////////////////////////////////////////////////////////////////
21 21
22 FiltFilt::FiltFilt( FilterConfig Config ) 22 FiltFilt::FiltFilt(Filter::Parameters parameters) :
23 m_filter(parameters)
23 { 24 {
24 m_filtScratchIn = NULL; 25 m_ord = m_filter.getOrder();
25 m_filtScratchOut = NULL;
26 m_ord = 0;
27
28 initialise( Config );
29 } 26 }
30 27
31 FiltFilt::~FiltFilt() 28 FiltFilt::~FiltFilt()
32 { 29 {
33 deInitialise();
34 } 30 }
35
36 void FiltFilt::initialise( FilterConfig Config )
37 {
38 m_ord = Config.ord;
39 m_filterConfig.ord = Config.ord;
40 m_filterConfig.ACoeffs = Config.ACoeffs;
41 m_filterConfig.BCoeffs = Config.BCoeffs;
42
43 m_filter = new Filter( m_filterConfig );
44 }
45
46 void FiltFilt::deInitialise()
47 {
48 delete m_filter;
49 }
50
51 31
52 void FiltFilt::process(double *src, double *dst, unsigned int length) 32 void FiltFilt::process(double *src, double *dst, unsigned int length)
53 { 33 {
54 unsigned int i; 34 unsigned int i;
55 35
57 37
58 unsigned int nFilt = m_ord + 1; 38 unsigned int nFilt = m_ord + 1;
59 unsigned int nFact = 3 * ( nFilt - 1); 39 unsigned int nFact = 3 * ( nFilt - 1);
60 unsigned int nExt = length + 2 * nFact; 40 unsigned int nExt = length + 2 * nFact;
61 41
62 m_filtScratchIn = new double[ nExt ]; 42 double *filtScratchIn = new double[ nExt ];
63 m_filtScratchOut = new double[ nExt ]; 43 double *filtScratchOut = new double[ nExt ];
64
65 44
66 for( i = 0; i< nExt; i++ ) 45 for( i = 0; i< nExt; i++ )
67 { 46 {
68 m_filtScratchIn[ i ] = 0.0; 47 filtScratchIn[ i ] = 0.0;
69 m_filtScratchOut[ i ] = 0.0; 48 filtScratchOut[ i ] = 0.0;
70 } 49 }
71 50
72 // Edge transients reflection 51 // Edge transients reflection
73 double sample0 = 2 * src[ 0 ]; 52 double sample0 = 2 * src[ 0 ];
74 double sampleN = 2 * src[ length - 1 ]; 53 double sampleN = 2 * src[ length - 1 ];
75 54
76 unsigned int index = 0; 55 unsigned int index = 0;
77 for( i = nFact; i > 0; i-- ) 56 for( i = nFact; i > 0; i-- )
78 { 57 {
79 m_filtScratchIn[ index++ ] = sample0 - src[ i ]; 58 filtScratchIn[ index++ ] = sample0 - src[ i ];
80 } 59 }
81 index = 0; 60 index = 0;
82 for( i = 0; i < nFact; i++ ) 61 for( i = 0; i < nFact; i++ )
83 { 62 {
84 m_filtScratchIn[ (nExt - nFact) + index++ ] = sampleN - src[ (length - 2) - i ]; 63 filtScratchIn[ (nExt - nFact) + index++ ] = sampleN - src[ (length - 2) - i ];
85 } 64 }
86 65
87 index = 0; 66 index = 0;
88 for( i = 0; i < length; i++ ) 67 for( i = 0; i < length; i++ )
89 { 68 {
90 m_filtScratchIn[ i + nFact ] = src[ i ]; 69 filtScratchIn[ i + nFact ] = src[ i ];
91 } 70 }
92 71
93 //////////////////////////////// 72 ////////////////////////////////
94 // Do 0Ph filtering 73 // Do 0Ph filtering
95 m_filter->process( m_filtScratchIn, m_filtScratchOut, nExt); 74 m_filter.process( filtScratchIn, filtScratchOut, nExt);
96 75
97 // reverse the series for FILTFILT 76 // reverse the series for FILTFILT
98 for ( i = 0; i < nExt; i++) 77 for ( i = 0; i < nExt; i++)
99 { 78 {
100 m_filtScratchIn[ i ] = m_filtScratchOut[ nExt - i - 1]; 79 filtScratchIn[ i ] = filtScratchOut[ nExt - i - 1];
101 } 80 }
102 81
103 // do FILTER again 82 // do FILTER again
104 m_filter->process( m_filtScratchIn, m_filtScratchOut, nExt); 83 m_filter.process( filtScratchIn, filtScratchOut, nExt);
105 84
106 // reverse the series back 85 // reverse the series back
107 for ( i = 0; i < nExt; i++) 86 for ( i = 0; i < nExt; i++)
108 { 87 {
109 m_filtScratchIn[ i ] = m_filtScratchOut[ nExt - i - 1 ]; 88 filtScratchIn[ i ] = filtScratchOut[ nExt - i - 1 ];
110 } 89 }
111 for ( i = 0;i < nExt; i++) 90 for ( i = 0;i < nExt; i++)
112 { 91 {
113 m_filtScratchOut[ i ] = m_filtScratchIn[ i ]; 92 filtScratchOut[ i ] = filtScratchIn[ i ];
114 } 93 }
115 94
116 index = 0; 95 index = 0;
117 for( i = 0; i < length; i++ ) 96 for( i = 0; i < length; i++ )
118 { 97 {
119 dst[ index++ ] = m_filtScratchOut[ i + nFact ]; 98 dst[ index++ ] = filtScratchOut[ i + nFact ];
120 } 99 }
121 100
122 delete [] m_filtScratchIn; 101 delete [] filtScratchIn;
123 delete [] m_filtScratchOut; 102 delete [] filtScratchOut;
124 103
125 } 104 }
126 105
127 void FiltFilt::reset() 106 void FiltFilt::reset()
128 { 107 {