Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "ar_track_alvar/Alvar.h"
00025 #include "ar_track_alvar/Filter.h"
00026
00027 template class ALVAR_EXPORT alvar::FilterArray<alvar::FilterAverage>;
00028 template class ALVAR_EXPORT alvar::FilterArray<alvar::FilterMedian>;
00029 template class ALVAR_EXPORT alvar::FilterArray<alvar::FilterRunningAverage>;
00030 template class ALVAR_EXPORT alvar::FilterArray<alvar::FilterDoubleExponentialSmoothing>;
00031
00032 using namespace std;
00033
00034 namespace alvar {
00035 using namespace std;
00036
00037 Filter::Filter() {
00038 value=0;
00039 }
00040
00041 void FilterAverage::push_to_buffer(double y) {
00042 buffer.push_back(y);
00043 while (buffer.size() > window_size) {
00044 buffer.pop_front();
00045 }
00046 }
00047
00048 double FilterAverage::next(double y) {
00049 if (window_size <= 0) {
00050 count++;
00051 double alpha = 1.0/count;
00052 return (value=((1.0-alpha)*value)+(alpha*y));
00053 } else {
00054 push_to_buffer(y);
00055 double sum = 0;
00056 for (deque<double>::iterator iter = buffer.begin(); iter != buffer.end(); iter++) {
00057 sum += (double)*iter;
00058 }
00059 return (value=sum/buffer.size());
00060 }
00061 }
00062
00063 void FilterAverage::reset() {
00064 buffer.clear();
00065 }
00066
00067 double FilterAverage::deviation() const {
00068 double sum = 0;
00069 if (buffer.size() == 0) return 0;
00070 for (deque<double>::const_iterator iter = buffer.begin(); iter != buffer.end(); iter++) {
00071 double val = ((double)*iter)-value;
00072 sum += (val*val);
00073 }
00074 sum /= buffer.size();
00075 return sqrt(sum);
00076 }
00077
00078 double FilterMedian::next(double y) {
00079 if (window_size <= 1) return y;
00080 push_to_buffer(y);
00081 copy(buffer.begin(), buffer.end(), sort_buffer.begin());
00082 int nth = buffer.size()/2;
00083 nth_element(sort_buffer.begin(), sort_buffer.begin() + nth, sort_buffer.begin()+buffer.size());
00084 return value = sort_buffer[nth];
00085 }
00086
00087 double FilterRunningAverage::next(double y) {
00088 if (breset) {
00089 breset=false;
00090 value=(double)y;
00091 } else {
00092 value = ((1.0-alpha) * value) + (alpha * (double)y);
00093 }
00094 return value;
00095 }
00096
00097 void FilterRunningAverage::reset() { breset=true; }
00098
00099 double FilterDoubleExponentialSmoothing::next(double y) {
00100 if (breset) {
00101 breset=false;
00102 value=(double)y;
00103 slope=0.0;
00104 }
00105 else {
00106 double value_prev = value;
00107 value = ((1.0-alpha) * (value + slope)) + (alpha * (double)y);
00108 slope = ((1.0-gamma) * (slope)) + (gamma * (value - value_prev));
00109 }
00110 return value;
00111 }
00112
00113 }