Filter.cpp
Go to the documentation of this file.
1 /*
2  * This file is part of ALVAR, A Library for Virtual and Augmented Reality.
3  *
4  * Copyright 2007-2012 VTT Technical Research Centre of Finland
5  *
6  * Contact: VTT Augmented Reality Team <alvar.info@vtt.fi>
7  * <http://www.vtt.fi/multimedia/alvar.html>
8  *
9  * ALVAR is free software; you can redistribute it and/or modify it under the
10  * terms of the GNU Lesser General Public License as published by the Free
11  * Software Foundation; either version 2.1 of the License, or (at your option)
12  * any later version.
13  *
14  * This library is distributed in the hope that it will be useful, but WITHOUT
15  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
16  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
17  * for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public License
20  * along with ALVAR; if not, see
21  * <http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html>.
22  */
23 
24 #include "ar_track_alvar/Alvar.h"
25 #include "ar_track_alvar/Filter.h"
26 
31 
32 using namespace std;
33 
34 namespace alvar {
35 using namespace std;
36 
37 Filter::Filter() {
38  value=0;
39 }
40 
41 void FilterAverage::push_to_buffer(double y) {
42  buffer.push_back(y);
43  while (buffer.size() > window_size) {
44  buffer.pop_front();
45  }
46 }
47 
48 double FilterAverage::next(double y) {
49  if (window_size <= 0) {
50  count++;
51  double alpha = 1.0/count;
52  return (value=((1.0-alpha)*value)+(alpha*y));
53  } else {
54  push_to_buffer(y);
55  double sum = 0;
56  for (deque<double>::iterator iter = buffer.begin(); iter != buffer.end(); iter++) {
57  sum += (double)*iter;
58  }
59  return (value=sum/buffer.size());
60  }
61 }
62 
64  buffer.clear();
65 }
66 
67 double FilterAverage::deviation() const {
68  double sum = 0;
69  if (buffer.size() == 0) return 0;
70  for (deque<double>::const_iterator iter = buffer.begin(); iter != buffer.end(); iter++) {
71  double val = ((double)*iter)-value;
72  sum += (val*val);
73  }
74  sum /= buffer.size();
75  return sqrt(sum);
76 }
77 
78 double FilterMedian::next(double y) {
79  if (window_size <= 1) return y;
80  push_to_buffer(y);
81  copy(buffer.begin(), buffer.end(), sort_buffer.begin());
82  int nth = buffer.size()/2;
83  nth_element(sort_buffer.begin(), sort_buffer.begin() + nth, sort_buffer.begin()+buffer.size());
84  return value = sort_buffer[nth];
85 }
86 
87 double FilterRunningAverage::next(double y) {
88  if (breset) {
89  breset=false;
90  value=(double)y;
91  } else {
92  value = ((1.0-alpha) * value) + (alpha * (double)y);
93  }
94  return value;
95 }
96 
97 void FilterRunningAverage::reset() { breset=true; }
98 
99 double FilterDoubleExponentialSmoothing::next(double y) {
100  if (breset) {
101  breset=false;
102  value=(double)y;
103  slope=0.0;
104  }
105  else {
106  double value_prev = value;
107  value = ((1.0-alpha) * (value + slope)) + (alpha * (double)y);
108  slope = ((1.0-gamma) * (slope)) + (gamma * (value - value_prev));
109  }
110  return value;
111 }
112 
113 } // namespace alvar
Main ALVAR namespace.
Definition: Alvar.h:174
This file implements multiple filters.
Class for handling an array of filtered values.
Definition: Filter.h:206
#define ALVAR_EXPORT
Definition: Alvar.h:168
This file defines library export definitions, version numbers and build information.


ar_track_alvar
Author(s): Scott Niekum
autogenerated on Mon Jun 10 2019 12:47:04