Commit 1aae861e1cb768926cc8df69e566d36f096c737c

Authored by Hacene SI HADJ MOHAND
1 parent 5adfc136

compile ok mais segmentations

Showing 1 changed file with 185 additions and 52 deletions   Show diff stats
src/ExternLib/DataFiltering/DataFiltering.hh
@@ -16,6 +16,7 @@ @@ -16,6 +16,7 @@
16 16
17 #include <list> 17 #include <list>
18 #include <c++/4.8.2/bits/stl_vector.h> 18 #include <c++/4.8.2/bits/stl_vector.h>
  19 +#include <algorithm>
19 20
20 #include "Parameter.hh" 21 #include "Parameter.hh"
21 #include "ParamData.hh" 22 #include "ParamData.hh"
@@ -26,10 +27,15 @@ @@ -26,10 +27,15 @@
26 namespace AMDA { 27 namespace AMDA {
27 namespace Parameters { 28 namespace Parameters {
28 29
  30 + /**
  31 + * Spike filtering using
  32 + * An algorithm for finding spurious points in turbulent signals, Computers in Physics, V. 7 No. 5, pp. 599 - 607
  33 + */
29 namespace DataFiltering { 34 namespace DataFiltering {
30 35
31 template <typename ElemType> 36 template <typename ElemType>
32 struct FilteringContainer { 37 struct FilteringContainer {
  38 + ~FilteringContainer(){}
33 // size of real points(not nan and not spike) 39 // size of real points(not nan and not spike)
34 int _size = 0; 40 int _size = 0;
35 int _nFilteredPoints = 0; 41 int _nFilteredPoints = 0;
@@ -43,6 +49,10 @@ namespace AMDA { @@ -43,6 +49,10 @@ namespace AMDA {
43 49
44 template <typename ElemType> 50 template <typename ElemType>
45 struct FilteringContainer1D { 51 struct FilteringContainer1D {
  52 + FilteringContainer1D(){}
  53 + ~FilteringContainer1D(){
  54 + delete &_size;
  55 + }
46 // size of real points(not nan and not spike) 56 // size of real points(not nan and not spike)
47 std::vector<int> _size; 57 std::vector<int> _size;
48 std::vector<int> _nFilteredPoints; 58 std::vector<int> _nFilteredPoints;
@@ -50,7 +60,7 @@ namespace AMDA { @@ -50,7 +60,7 @@ namespace AMDA {
50 std::vector<ElemType> _sumsq; 60 std::vector<ElemType> _sumsq;
51 std::vector<ElemType> _ave; 61 std::vector<ElemType> _ave;
52 std::vector<ElemType> _sig; 62 std::vector<ElemType> _sig;
53 - std::vector<std::list<ElemType> > _values; 63 + std::list<std::vector<ElemType> > _values;
54 std::list<double> _times; 64 std::list<double> _times;
55 }; 65 };
56 66
@@ -80,7 +90,7 @@ namespace AMDA { @@ -80,7 +90,7 @@ namespace AMDA {
80 double crtTime = _paramInput.getTime(_index); 90 double crtTime = _paramInput.getTime(_index);
81 ElemType inputElt = _paramInput.get(_index); 91 ElemType inputElt = _paramInput.get(_index);
82 92
83 - // initialiser et remplir container 93 + // initialiser et remplir le container container
84 if (_container._size < _nPoints) { 94 if (_container._size < _nPoints) {
85 95
86 _container._values.push_back(inputElt); 96 _container._values.push_back(inputElt);
@@ -92,72 +102,90 @@ namespace AMDA { @@ -92,72 +102,90 @@ namespace AMDA {
92 _container._size += 1; 102 _container._size += 1;
93 } 103 }
94 } else { 104 } else {
  105 + // traitement une fois le container rempli
95 _container._ave = (ElemType) _container._sum / _container._size; 106 _container._ave = (ElemType) _container._sum / _container._size;
96 _container._sig = std::sqrt((_container._sumsq - _container._sum * _container._sum / _container._size) / _container._size); 107 _container._sig = std::sqrt((_container._sumsq - _container._sum * _container._sum / _container._size) / _container._size);
97 108
98 // filter Elements 109 // filter Elements
99 for (auto it = _container._values.begin(); it != _container._values.end(); ++it) { 110 for (auto it = _container._values.begin(); it != _container._values.end(); ++it) {
100 ElemType crt_val = *it; 111 ElemType crt_val = *it;
101 - if(isNAN(crt_val)) 112 + if (isNAN(crt_val))
102 continue; 113 continue;
103 if (std::abs(crt_val - _container._ave) > _factor * _container._sig) { 114 if (std::abs(crt_val - _container._ave) > _factor * _container._sig) {
104 _container._sum -= crt_val; 115 _container._sum -= crt_val;
105 _container._sumsq -= crt_val*crt_val; 116 _container._sumsq -= crt_val*crt_val;
106 _container._size -= 1; 117 _container._size -= 1;
107 _container._nFilteredPoints += 1; 118 _container._nFilteredPoints += 1;
108 - *it << NotANumber(); 119 + *it << NotANumber();
109 } 120 }
110 } 121 }
111 _paramOutput->pushTime(_container._times.front()); 122 _paramOutput->pushTime(_container._times.front());
112 _paramOutput->getDataList().push_back(_container._values.front()); 123 _paramOutput->getDataList().push_back(_container._values.front());
113 _container._values.pop_front(); 124 _container._values.pop_front();
114 _container._times.pop_front(); 125 _container._times.pop_front();
115 - if(!isNAN(_container._values.front())){  
116 - _container._size -= 1;  
117 - _container._sum -= _container._values.front();  
118 - _container._sumsq -= _container._values.front() * _container._values.front(); 126 + if (!isNAN(_container._values.front())) {
  127 + _container._size -= 1;
  128 + _container._sum -= _container._values.front();
  129 + _container._sumsq -= _container._values.front() * _container._values.front();
119 } 130 }
120 - 131 +
121 _container._values.push_back(inputElt); 132 _container._values.push_back(inputElt);
122 _container._times.push_back(crtTime); 133 _container._times.push_back(crtTime);
123 - if (!isNAN(inputElt)) { 134 + if (!isNAN(inputElt)) {
124 _container._sum += inputElt; 135 _container._sum += inputElt;
125 _container._sumsq += inputElt*inputElt; 136 _container._sumsq += inputElt*inputElt;
126 _container._size += 1; 137 _container._size += 1;
127 } 138 }
128 - }  
129 - // last value filter and write  
130 - if (_index == pParamDataIndexInfo._startIndex + pParamDataIndexInfo._nbDataToProcess - 1) { 139 + }
  140 + // last value filter and write
  141 + if (_index == pParamDataIndexInfo._startIndex + pParamDataIndexInfo._nbDataToProcess - 1) {
131 _container._ave = (ElemType) _container._sum / _container._size; 142 _container._ave = (ElemType) _container._sum / _container._size;
132 _container._sig = std::sqrt((_container._sumsq - _container._sum * _container._sum / _container._size) / _container._size); 143 _container._sig = std::sqrt((_container._sumsq - _container._sum * _container._sum / _container._size) / _container._size);
133 - for (auto it = _container._values.begin(); it != _container._values.end(); ++it) { 144 + for (auto it = _container._values.begin(); it != _container._values.end(); ++it) {
134 ElemType crt_val = *it; 145 ElemType crt_val = *it;
135 - if (std::abs(crt_val - _container._ave) > _factor * _container._sig){ 146 + if (std::abs(crt_val - _container._ave) > _factor * _container._sig) {
136 *it << NotANumber(); 147 *it << NotANumber();
137 _container._nFilteredPoints += 1; 148 _container._nFilteredPoints += 1;
138 } 149 }
139 - }  
140 -  
141 - std::list<double>::iterator itTimes = _container._times.begin();  
142 - for (ElemType elt : _container._values) {  
143 - _paramOutput->pushTime(*itTimes);  
144 - _paramOutput->getDataList().push_back(elt);  
145 - ++itTimes;  
146 - }  
147 } 150 }
148 - 151 +
  152 + std::list<double>::iterator itTimes = _container._times.begin();
  153 + for (ElemType elt : _container._values) {
  154 + _paramOutput->pushTime(*itTimes);
  155 + _paramOutput->getDataList().push_back(elt);
  156 + ++itTimes;
  157 + }
  158 + }
  159 +
149 } 160 }
150 } 161 }
151 162
152 163
153 164
154 private: 165 private:
155 - ParamDataSpec<ElemType>& _paramInput;  
156 -  
157 - ParamDataSpec<ElemType>* _paramOutput;  
158 - 166 + /**
  167 + * input data
  168 + */
  169 + ParamDataSpec<ElemType >& _paramInput;
  170 +
  171 + /**
  172 + * oupout filtered data
  173 + */
  174 + ParamDataSpec<ElemType >* _paramOutput;
  175 +
  176 + /**
  177 + * factor in term of sigma used in the filtering
  178 + */
159 double _factor; 179 double _factor;
  180 +
  181 + /**
  182 + Number of point used in the fitering algorithm
  183 + */
160 int _nPoints; 184 int _nPoints;
  185 +
  186 + /**
  187 + * Data container used during filtering
  188 + */
161 FilteringContainer<ElemType> _container; 189 FilteringContainer<ElemType> _container;
162 190
163 }; 191 };
@@ -172,50 +200,155 @@ namespace AMDA { @@ -172,50 +200,155 @@ namespace AMDA {
172 _paramInput(paramInput), 200 _paramInput(paramInput),
173 _paramOutput(new ParamDataSpec<std::vector<ElemType> >()), 201 _paramOutput(new ParamDataSpec<std::vector<ElemType> >()),
174 _factor(factor), 202 _factor(factor),
175 - _nPoints(nPoints) { 203 + _nPoints(nPoints),
  204 + _container(new FilteringContainer1D<ElemType> ()){
176 _paramDataOutput = _paramOutput; 205 _paramDataOutput = _paramOutput;
177 } 206 }
178 207
179 virtual ~DataFiltering1D() { 208 virtual ~DataFiltering1D() {
180 -  
181 } 209 }
182 210
183 void write(ParamDataIndexInfo &pParamDataIndexInfo) { 211 void write(ParamDataIndexInfo &pParamDataIndexInfo) {
  212 +
184 // init container 213 // init container
185 - std::vector<std::list<ElemType> > outputList; 214 +
186 int size = _paramInput.get(pParamDataIndexInfo._startIndex).size(); 215 int size = _paramInput.get(pParamDataIndexInfo._startIndex).size();
187 - std::vector<int> vecInt(size, 0);  
188 - std::vector<ElemType> vecElement(size, 0);  
189 - _container._size = vecInt;  
190 - _container._nFilteredPoints = vecInt;  
191 - _container._ave = vecElement;  
192 - _container._sum = vecElement;  
193 - _container._sumsq = vecElement;  
194 - _container._sig = vecElement;  
195 - for (int j = 0; j < size; ++j) {  
196 - std::list<ElemType> list;  
197 - _container._values.push_back(list);  
198 - outputList.push_back(list);  
199 - }  
200 - for (int i = 0; i < size; ++i) { 216 + std::vector<int> vectInt(size,0);
  217 + _container->_size = vectInt;
  218 + /**
  219 + _container->_nFilteredPoints.resize(size,0);
  220 + _container->_ave.resize(size,0);
  221 + _container->_sum.resize(size,0);
  222 + _container->_sumsq.resize(size,0);
  223 + _container->_sig.resize(size,0);
  224 + */
  225 + for (unsigned int _index = pParamDataIndexInfo._startIndex;
  226 + _index < pParamDataIndexInfo._startIndex + pParamDataIndexInfo._nbDataToProcess;
  227 + ++_index) {
  228 + double crtTime = _paramInput.getTime(_index);
  229 + std::vector<ElemType> inputElt = _paramInput.get(_index);
201 230
202 - }  
203 -  
204 -  
205 -  
206 -  
207 - } 231 + _paramOutput->pushTime(crtTime);
  232 + _paramOutput->getDataList().push_back(inputElt);
  233 + /**
208 234
  235 + // initialiser et remplir container
  236 + if (*std::min_element(std::begin(_container._size), std::end(_container._size)) < _nPoints) {
  237 +
  238 + _container._values.push_back(inputElt);
  239 + _container._times.push_back(crtTime);
  240 + for (int i = 0; i < size; i++) {
  241 + if (!isNAN(inputElt[i])) {
  242 + _container._sum[i] += inputElt[i];
  243 + _container._sumsq[i] += inputElt[i]*inputElt[i];
  244 + _container._size[i] += 1;
  245 + }
  246 + }
  247 + } else {
  248 + for (int i = 0; i < size; i++) {
  249 + _container._ave[i] = (ElemType) _container._sum[i] / _container._size[i];
  250 + _container._sig[i] = std::sqrt((_container._sumsq[i] - _container._sum[i] * _container._sum[i] / _container._size[i]) / _container._size[i]);
  251 + }
  252 +
  253 + // filter Elements
  254 + for (auto elt = _container._values.begin(); elt != _container._values.end(); ++elt) {
  255 + int i;
  256 + for (auto it = elt->begin(); it != elt->end(); ++it) {
  257 + i = it - elt->begin();
  258 + ElemType crt_val = *it;
  259 + if (isNAN(crt_val)) {
  260 + continue;
  261 + }
  262 +
  263 + if (std::abs(crt_val - _container._ave[i]) > _factor * _container._sig[i]) {
  264 + _container._sum[i] -= crt_val;
  265 + _container._sumsq[i] -= crt_val*crt_val;
  266 + _container._size[i] -= 1;
  267 + _container._nFilteredPoints[i] += 1;
  268 + *it << NotANumber();
  269 + }
  270 + }
  271 + }
  272 + _paramOutput->pushTime(_container._times.front());
  273 + _paramOutput->getDataList().push_back(_container._values.front());
  274 + _container._values.pop_front();
  275 + _container._times.pop_front();
  276 + for (int i = 0; i < size; i++) {
  277 + if (!isNAN(_container._values.front()[i])) {
  278 + _container._size[i] -= 1;
  279 + _container._sum[i] -= _container._values.front()[i];
  280 + _container._sumsq[i] -= _container._values.front()[i] * _container._values.front()[i];
  281 + }
  282 + if (!isNAN(inputElt[i])) {
  283 + _container._sum[i] += inputElt[i];
  284 + _container._sumsq[i] += inputElt[i] * inputElt[i];
  285 + _container._size[i] += 1;
  286 + }
  287 + }
  288 + _container._values.push_back(inputElt);
  289 + _container._times.push_back(crtTime);
  290 + }
  291 + // last value filter and write
  292 + if (_index == pParamDataIndexInfo._startIndex + pParamDataIndexInfo._nbDataToProcess - 1) {
  293 + for (int i = 0; i < size; i++) {
  294 + _container._ave[i] = (ElemType) _container._sum[i] / _container._size[i];
  295 + _container._sig[i] = std::sqrt((_container._sumsq[i] - _container._sum[i] * _container._sum[i] / _container._size[i]) / _container._size[i]);
  296 + }
  297 + for (auto elt = _container._values.begin(); elt != _container._values.end(); ++elt) {
  298 + int i;
  299 + for (auto it = elt->begin(); it != elt->end(); ++it) {
  300 + i = it - elt->begin();
  301 + ElemType crt_val = *it;
  302 + if (isNAN(crt_val)) {
  303 + continue;
  304 + }
  305 +
  306 + if (std::abs(crt_val - _container._ave[i]) > _factor * _container._sig[i]) {
  307 + _container._sum[i] -= crt_val;
  308 + _container._sumsq[i] -= crt_val*crt_val;
  309 + _container._size[i] -= 1;
  310 + _container._nFilteredPoints[i] += 1;
  311 + *it << NotANumber();
  312 + }
  313 + }
  314 + }
209 315
  316 + std::list<double>::iterator itTimes = _container._times.begin();
  317 + for (auto elt : _container._values) {
  318 + _paramOutput->pushTime(*itTimes);
  319 + _paramOutput->getDataList().push_back(elt);
  320 + ++itTimes;
  321 + }
  322 + }
  323 + * */
  324 + }
  325 + }
210 326
211 private: 327 private:
  328 + /**
  329 + * input data
  330 + */
212 ParamDataSpec<std::vector<ElemType> >& _paramInput; 331 ParamDataSpec<std::vector<ElemType> >& _paramInput;
213 332
  333 + /**
  334 + * oupout filtered data
  335 + */
214 ParamDataSpec<std::vector<ElemType> >* _paramOutput; 336 ParamDataSpec<std::vector<ElemType> >* _paramOutput;
215 337
  338 + /**
  339 + * factor in term of sigma used in the filtering
  340 + */
216 double _factor; 341 double _factor;
  342 +
  343 + /**
  344 + Number of point used in the fitering algorithm
  345 + */
217 int _nPoints; 346 int _nPoints;
218 - FilteringContainer1D<ElemType> _container; 347 +
  348 + /**
  349 + * Data container used during filtering
  350 + */
  351 + FilteringContainer1D<ElemType>* _container;
219 352
220 }; 353 };
221 } 354 }