Mercurial > hg > qm-dsp
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 { |