filters.h
Go to the documentation of this file.
1 /*******************************************************************************
2  * BSD 3-Clause License
3  *
4  * Copyright (c) 2021, Qiayuan Liao
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions are met:
9  *
10  * * Redistributions of source code must retain the above copyright notice, this
11  * list of conditions and the following disclaimer.
12  *
13  * * Redistributions in binary form must reproduce the above copyright notice,
14  * this list of conditions and the following disclaimer in the documentation
15  * and/or other materials provided with the distribution.
16  *
17  * * Neither the name of the copyright holder nor the names of its
18  * contributors may be used to endorse or promote products derived from
19  * this software without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE
25  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
26  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
28  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
30  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32  *******************************************************************************/
33 
34 #pragma once
35 
36 #include <vector>
37 #include <memory>
38 
39 template <typename T>
40 class Filter
41 {
42 public:
43  Filter() = default;
44  virtual ~Filter() = default;
45  virtual void input(T input_value) = 0;
46  virtual T output() = 0;
47  virtual void clear() = 0;
48 };
49 
50 template <typename T>
51 class ButterworthFilter : public Filter<T>
52 {
53 public:
54  ButterworthFilter(int num_sample, T dt, T cutoff_frequency);
56  void input(T input_value);
57  T output();
58  void clear();
59 
60 private:
62  int mCurIdx_;
64  T mDt_;
67 };
68 
69 template <typename T>
70 class DigitalLpFilter : public Filter<T>
71 {
72 public:
73  DigitalLpFilter(T w_c, T t_s);
75  void input(T input_value);
76  T output();
77  void clear();
78 
79 private:
84 };
85 
86 template <typename T>
87 class MovingAverageFilter : public Filter<T>
88 {
89 public:
90  explicit MovingAverageFilter(int num_data);
92  void input(T input_value);
93  T output();
94  void clear();
95 
96 private:
97  T* buffer_;
98  int num_data_;
99  int idx_;
100  T sum_;
101 };
102 
103 template <typename T>
105 {
106 public:
107  Vector3WithFilter(int num_data)
108  {
109  for (int i = 0; i < 3; i++)
110  filter_vector_.push_back(std::make_shared<MovingAverageFilter<T>>(num_data));
111  }
112  void input(T vector[3])
113  {
114  for (int i = 0; i < 3; i++)
115  filter_vector_[i]->input(vector[i]);
116  }
117  void clear()
118  {
119  for (int i = 0; i < 3; i++)
120  filter_vector_[i]->clear();
121  }
122  T x()
123  {
124  return filter_vector_[0]->output();
125  }
126  T y()
127  {
128  return filter_vector_[1]->output();
129  }
130  T z()
131  {
132  return filter_vector_[2]->output();
133  }
134 
135 private:
136  std::vector<std::shared_ptr<MovingAverageFilter<T>>> filter_vector_;
137 };
138 
139 template <typename T>
140 class DerivLpFilter : public Filter<T>
141 {
142 public:
143  DerivLpFilter(T w_c, T t_s);
144  ~DerivLpFilter();
145  void input(T input_value);
146  T output();
147  void clear();
148 
149 private:
154 };
155 
156 template <typename T>
157 class FF01Filter : public Filter<T>
158 {
159 public:
160  FF01Filter(float t_s, float w_c);
161  virtual ~FF01Filter();
162  virtual void input(T input_value);
163  virtual T output();
164  virtual void clear();
165 
166 private:
171 };
172 
173 template <typename T>
174 class FF02Filter : public Filter<T>
175 {
176 public:
177  FF02Filter(float t_s, float w_c);
178  ~FF02Filter();
179  void input(T input_value);
180  T output();
181  void clear();
182 
183 private:
188 };
189 
190 template <typename T>
191 class AverageFilter : public Filter<T>
192 {
193 public:
194  AverageFilter(T dt, T t_const, T limit);
195  ~AverageFilter();
196  void input(T input_value);
197  T output();
198  void clear();
199 
200 private:
202  T dt_;
205 };
206 
207 template <typename T>
208 class RampFilter : public Filter<T>
209 {
210 public:
211  RampFilter(T acc, T dt);
212  ~RampFilter() = default;
213  void input(T input_value);
214  void clear();
215  void clear(T last_value);
216  void setAcc(T acc); // without clear.
217  T output();
218 
219 private:
221  T acc_;
222  T dt_;
223 };
224 
225 template <typename T>
226 class OneEuroFilter : public Filter<T>
227 {
228 public:
229  OneEuroFilter(double _freq, T _mincutoff, T _beta, T _dcutoff);
230  ~OneEuroFilter();
231  void input(T input_value);
232  T output();
233  void clear();
234 
235 private:
236  double freq;
237  bool firsttime;
241 };
OneEuroFilter::clear
void clear()
Definition: filters.cpp:479
FF02Filter::Lpf_in2_
T Lpf_in2_
Definition: filters.h:186
Filter
Definition: filters.h:40
FF01Filter::Lpf_in2_
T Lpf_in2_
Definition: filters.h:169
DigitalLpFilter::~DigitalLpFilter
~DigitalLpFilter()
RampFilter
Definition: filters.h:208
DigitalLpFilter::clear
void clear()
Definition: filters.cpp:175
ButterworthFilter::mDt_
T mDt_
Definition: filters.h:64
Vector3WithFilter
Definition: filters.h:104
Vector3WithFilter::z
T z()
Definition: filters.h:130
AverageFilter::output
T output()
Definition: filters.cpp:386
MovingAverageFilter::clear
void clear()
Definition: filters.cpp:63
MovingAverageFilter
Definition: filters.h:87
DerivLpFilter::~DerivLpFilter
~DerivLpFilter()
ButterworthFilter::mpBuffer_
T * mpBuffer_
Definition: filters.h:61
DigitalLpFilter::DigitalLpFilter
DigitalLpFilter(T w_c, T t_s)
Definition: filters.cpp:140
OneEuroFilter::output
T output()
Definition: filters.cpp:473
MovingAverageFilter::idx_
int idx_
Definition: filters.h:99
ButterworthFilter::output
T output()
Definition: filters.cpp:120
FF01Filter::clear
virtual void clear()
Definition: filters.cpp:288
MovingAverageFilter::sum_
T sum_
Definition: filters.h:100
DerivLpFilter::Lpf_out2_
T Lpf_out2_
Definition: filters.h:152
RampFilter::setAcc
void setAcc(T acc)
Definition: filters.cpp:423
ButterworthFilter
Definition: filters.h:51
FF01Filter::Lpf_out_prev_
T Lpf_out_prev_[2]
Definition: filters.h:168
AverageFilter::dt_
T dt_
Definition: filters.h:202
MovingAverageFilter::input
void input(T input_value)
Definition: filters.cpp:47
OneEuroFilter::dcutoff
T dcutoff
Definition: filters.h:238
AverageFilter::limit_
T limit_
Definition: filters.h:204
FF01Filter::Lpf_out2_
T Lpf_out2_
Definition: filters.h:169
OneEuroFilter::~OneEuroFilter
~OneEuroFilter()
AverageFilter::~AverageFilter
~AverageFilter()
Definition: filters.cpp:363
FF01Filter::input
virtual void input(T input_value)
Definition: filters.cpp:271
DerivLpFilter::Lpf_in1_
T Lpf_in1_
Definition: filters.h:152
Vector3WithFilter::clear
void clear()
Definition: filters.h:117
ButterworthFilter::input
void input(T input_value)
Definition: filters.cpp:100
FF01Filter::Lpf_out1_
T Lpf_out1_
Definition: filters.h:169
DigitalLpFilter::Lpf_in2_
T Lpf_in2_
Definition: filters.h:82
AverageFilter::AverageFilter
AverageFilter(T dt, T t_const, T limit)
Definition: filters.cpp:357
DigitalLpFilter::Lpf_in1_
T Lpf_in1_
Definition: filters.h:82
MovingAverageFilter::~MovingAverageFilter
~MovingAverageFilter()
Definition: filters.cpp:70
AverageFilter
Definition: filters.h:191
ButterworthFilter::~ButterworthFilter
~ButterworthFilter()
Definition: filters.cpp:94
DerivLpFilter::Lpf_in3_
T Lpf_in3_
Definition: filters.h:152
Vector3WithFilter::Vector3WithFilter
Vector3WithFilter(int num_data)
Definition: filters.h:107
OneEuroFilter::x_prev
T x_prev
Definition: filters.h:239
OneEuroFilter::mincutoff
T mincutoff
Definition: filters.h:238
OneEuroFilter
Definition: filters.h:226
OneEuroFilter::dhatxprev
T dhatxprev
Definition: filters.h:239
FF02Filter::lpf_out_
T lpf_out_
Definition: filters.h:187
DerivLpFilter::Lpf_in2_
T Lpf_in2_
Definition: filters.h:152
ButterworthFilter::mNumSample_
int mNumSample_
Definition: filters.h:63
RampFilter::acc_
T acc_
Definition: filters.h:221
RampFilter::RampFilter
RampFilter(T acc, T dt)
Definition: filters.cpp:397
FF01Filter::output
virtual T output()
Definition: filters.cpp:282
FF02Filter::FF02Filter
FF02Filter(float t_s, float w_c)
Definition: filters.cpp:302
DigitalLpFilter::output
T output()
Definition: filters.cpp:169
OneEuroFilter::freq
double freq
Definition: filters.h:236
DerivLpFilter::input
void input(T input_value)
Definition: filters.cpp:216
OneEuroFilter::beta
T beta
Definition: filters.h:238
AverageFilter::input
void input(T input_value)
Definition: filters.cpp:375
Vector3WithFilter::filter_vector_
std::vector< std::shared_ptr< MovingAverageFilter< T > > > filter_vector_
Definition: filters.h:136
FF02Filter::Lpf_in1_
T Lpf_in1_
Definition: filters.h:186
ButterworthFilter::ButterworthFilter
ButterworthFilter(int num_sample, T dt, T cutoff_frequency)
Definition: filters.cpp:81
RampFilter::clear
void clear()
Definition: filters.cpp:411
OneEuroFilter::input
void input(T input_value)
Definition: filters.cpp:454
FF01Filter::FF01Filter
FF01Filter(float t_s, float w_c)
Definition: filters.cpp:250
OneEuroFilter::OneEuroFilter
OneEuroFilter(double _freq, T _mincutoff, T _beta, T _dcutoff)
Definition: filters.cpp:440
FF02Filter::Lpf_in3_
T Lpf_in3_
Definition: filters.h:186
FF02Filter::input
void input(T input_value)
Definition: filters.cpp:326
FF02Filter::Lpf_in_prev_
T Lpf_in_prev_[2]
Definition: filters.h:184
AverageFilter::clear
void clear()
Definition: filters.cpp:369
FF01Filter
Definition: filters.h:157
RampFilter::~RampFilter
~RampFilter()=default
FF01Filter::Lpf_in3_
T Lpf_in3_
Definition: filters.h:169
ButterworthFilter::mCutoffFreq_
T mCutoffFreq_
Definition: filters.h:65
Vector3WithFilter::input
void input(T vector[3])
Definition: filters.h:112
FF02Filter::output
T output()
Definition: filters.cpp:337
Vector3WithFilter::x
T x()
Definition: filters.h:122
FF01Filter::Lpf_in_prev_
T Lpf_in_prev_[2]
Definition: filters.h:167
DigitalLpFilter
Definition: filters.h:70
RampFilter::output
T output()
Definition: filters.cpp:429
FF01Filter::lpf_out_
T lpf_out_
Definition: filters.h:170
RampFilter::dt_
T dt_
Definition: filters.h:222
AverageFilter::est_value_
T est_value_
Definition: filters.h:201
ButterworthFilter::clear
void clear()
Definition: filters.cpp:126
DigitalLpFilter::lpf_out_
T lpf_out_
Definition: filters.h:83
FF01Filter::~FF01Filter
virtual ~FF01Filter()
DerivLpFilter::DerivLpFilter
DerivLpFilter(T w_c, T t_s)
Definition: filters.cpp:189
Vector3WithFilter::y
T y()
Definition: filters.h:126
DerivLpFilter::clear
void clear()
Definition: filters.cpp:236
FF01Filter::Lpf_in1_
T Lpf_in1_
Definition: filters.h:169
RampFilter::input
void input(T input_value)
Definition: filters.cpp:405
MovingAverageFilter::buffer_
T * buffer_
Definition: filters.h:97
OneEuroFilter::firsttime
bool firsttime
Definition: filters.h:237
ButterworthFilter::mValue_
T mValue_
Definition: filters.h:66
FF02Filter
Definition: filters.h:174
DigitalLpFilter::Lpf_in_prev_
T Lpf_in_prev_[2]
Definition: filters.h:80
DigitalLpFilter::input
void input(T input_value)
Definition: filters.cpp:158
FF02Filter::clear
void clear()
Definition: filters.cpp:343
DigitalLpFilter::Lpf_in3_
T Lpf_in3_
Definition: filters.h:82
DerivLpFilter::lpf_out_
T lpf_out_
Definition: filters.h:153
MovingAverageFilter::num_data_
int num_data_
Definition: filters.h:98
FF02Filter::Lpf_out2_
T Lpf_out2_
Definition: filters.h:186
DerivLpFilter
Definition: filters.h:140
ButterworthFilter::mCurIdx_
int mCurIdx_
Definition: filters.h:62
FF02Filter::~FF02Filter
~FF02Filter()
DigitalLpFilter::Lpf_out1_
T Lpf_out1_
Definition: filters.h:82
OneEuroFilter::hatxprev
T hatxprev
Definition: filters.h:239
FF02Filter::Lpf_out1_
T Lpf_out1_
Definition: filters.h:186
MovingAverageFilter::output
T output()
Definition: filters.cpp:57
DigitalLpFilter::Lpf_out_prev_
T Lpf_out_prev_[2]
Definition: filters.h:81
OneEuroFilter::filtered_val
T filtered_val
Definition: filters.h:240
DerivLpFilter::output
T output()
Definition: filters.cpp:230
DerivLpFilter::Lpf_out_prev_
T Lpf_out_prev_[2]
Definition: filters.h:151
DerivLpFilter::Lpf_in_prev_
T Lpf_in_prev_[2]
Definition: filters.h:150
MovingAverageFilter::MovingAverageFilter
MovingAverageFilter(int num_data)
Definition: filters.cpp:40
DerivLpFilter::Lpf_out1_
T Lpf_out1_
Definition: filters.h:152
DigitalLpFilter::Lpf_out2_
T Lpf_out2_
Definition: filters.h:82
RampFilter::last_value_
T last_value_
Definition: filters.h:220
FF02Filter::Lpf_out_prev_
T Lpf_out_prev_[2]
Definition: filters.h:185
AverageFilter::t_const_
T t_const_
Definition: filters.h:203


rm_common
Author(s):
autogenerated on Tue May 6 2025 02:23:36