Filter.cpp
Go to the documentation of this file.
00001 /*
00002  * This file is part of ALVAR, A Library for Virtual and Augmented Reality.
00003  *
00004  * Copyright 2007-2012 VTT Technical Research Centre of Finland
00005  *
00006  * Contact: VTT Augmented Reality Team <alvar.info@vtt.fi>
00007  *          <http://www.vtt.fi/multimedia/alvar.html>
00008  *
00009  * ALVAR is free software; you can redistribute it and/or modify it under the
00010  * terms of the GNU Lesser General Public License as published by the Free
00011  * Software Foundation; either version 2.1 of the License, or (at your option)
00012  * any later version.
00013  *
00014  * This library is distributed in the hope that it will be useful, but WITHOUT
00015  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
00016  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
00017  * for more details.
00018  *
00019  * You should have received a copy of the GNU Lesser General Public License
00020  * along with ALVAR; if not, see
00021  * <http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html>.
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 } // namespace alvar


ar_track_alvar
Author(s): Scott Niekum
autogenerated on Thu Jun 6 2019 21:12:54