rm_control
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
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
39template <typename T>
40class Filter
41{
42public:
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
50template <typename T>
51class ButterworthFilter : public Filter<T>
52{
53public:
54 ButterworthFilter(int num_sample, T dt, T cutoff_frequency);
56 void input(T input_value);
57 T output();
58 void clear();
59
60private:
61 T* mpBuffer_;
62 int mCurIdx_;
63 int mNumSample_;
64 T mDt_;
65 T mCutoffFreq_;
66 T mValue_;
67};
68
69template <typename T>
70class DigitalLpFilter : public Filter<T>
71{
72public:
73 DigitalLpFilter(T w_c, T t_s);
75 void input(T input_value);
76 T output();
77 void clear();
78
79private:
80 T Lpf_in_prev_[2];
81 T Lpf_out_prev_[2];
82 T Lpf_in1_, Lpf_in2_, Lpf_in3_, Lpf_out1_, Lpf_out2_;
83 T lpf_out_;
84};
85
86template <typename T>
87class MovingAverageFilter : public Filter<T>
88{
89public:
90 explicit MovingAverageFilter(int num_data);
92 void input(T input_value);
93 T output();
94 void clear();
95
96private:
97 T* buffer_;
98 int num_data_;
99 int idx_;
100 T sum_;
101};
102
103template <typename T>
105{
106public:
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
135private:
136 std::vector<std::shared_ptr<MovingAverageFilter<T>>> filter_vector_;
137};
138
139template <typename T>
140class DerivLpFilter : public Filter<T>
141{
142public:
143 DerivLpFilter(T w_c, T t_s);
145 void input(T input_value);
146 T output();
147 void clear();
148
149private:
150 T Lpf_in_prev_[2];
151 T Lpf_out_prev_[2];
152 T Lpf_in1_, Lpf_in2_, Lpf_in3_, Lpf_out1_, Lpf_out2_;
153 T lpf_out_;
154};
155
156template <typename T>
157class FF01Filter : public Filter<T>
158{
159public:
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
166private:
167 T Lpf_in_prev_[2];
168 T Lpf_out_prev_[2];
169 T Lpf_in1_, Lpf_in2_, Lpf_in3_, Lpf_out1_, Lpf_out2_;
170 T lpf_out_;
171};
172
173template <typename T>
174class FF02Filter : public Filter<T>
175{
176public:
177 FF02Filter(float t_s, float w_c);
179 void input(T input_value);
180 T output();
181 void clear();
182
183private:
184 T Lpf_in_prev_[2];
185 T Lpf_out_prev_[2];
186 T Lpf_in1_, Lpf_in2_, Lpf_in3_, Lpf_out1_, Lpf_out2_;
187 T lpf_out_;
188};
189
190template <typename T>
191class AverageFilter : public Filter<T>
192{
193public:
194 AverageFilter(T dt, T t_const, T limit);
196 void input(T input_value);
197 T output();
198 void clear();
199
200private:
201 T est_value_;
202 T dt_;
203 T t_const_;
204 T limit_;
205};
206
207template <typename T>
208class RampFilter : public Filter<T>
209{
210public:
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
219private:
220 T last_value_;
221 T acc_;
222 T dt_;
223};
224
225template <typename T>
226class OneEuroFilter : public Filter<T>
227{
228public:
229 OneEuroFilter(double _freq, T _mincutoff, T _beta, T _dcutoff);
231 void input(T input_value);
232 T output();
233 void clear();
234
235private:
236 double freq;
237 bool firsttime;
238 T mincutoff, beta, dcutoff;
239 T x_prev, dhatxprev, hatxprev;
240 T filtered_val;
241};
Definition filters.h:192
~AverageFilter()
Definition filters.cpp:363
AverageFilter(T dt, T t_const, T limit)
Definition filters.cpp:357
T output()
Definition filters.cpp:386
void input(T input_value)
Definition filters.cpp:375
void clear()
Definition filters.cpp:369
Definition filters.h:52
~ButterworthFilter()
Definition filters.cpp:94
void clear()
Definition filters.cpp:126
void input(T input_value)
Definition filters.cpp:100
ButterworthFilter(int num_sample, T dt, T cutoff_frequency)
Definition filters.cpp:81
T output()
Definition filters.cpp:120
Definition filters.h:141
T output()
Definition filters.cpp:230
void input(T input_value)
Definition filters.cpp:216
DerivLpFilter(T w_c, T t_s)
Definition filters.cpp:189
void clear()
Definition filters.cpp:236
Definition filters.h:71
DigitalLpFilter(T w_c, T t_s)
Definition filters.cpp:140
void clear()
Definition filters.cpp:175
T output()
Definition filters.cpp:169
void input(T input_value)
Definition filters.cpp:158
Definition filters.h:158
virtual void clear()
Definition filters.cpp:288
virtual void input(T input_value)
Definition filters.cpp:271
virtual ~FF01Filter()
virtual T output()
Definition filters.cpp:282
FF01Filter(float t_s, float w_c)
Definition filters.cpp:250
Definition filters.h:175
void input(T input_value)
Definition filters.cpp:326
void clear()
Definition filters.cpp:343
T output()
Definition filters.cpp:337
FF02Filter(float t_s, float w_c)
Definition filters.cpp:302
Definition filters.h:41
virtual void clear()=0
virtual T output()=0
virtual void input(T input_value)=0
virtual ~Filter()=default
Filter()=default
Definition filters.h:88
T output()
Definition filters.cpp:57
MovingAverageFilter(int num_data)
Definition filters.cpp:40
~MovingAverageFilter()
Definition filters.cpp:70
void clear()
Definition filters.cpp:63
void input(T input_value)
Definition filters.cpp:47
Definition filters.h:227
void clear()
Definition filters.cpp:479
void input(T input_value)
Definition filters.cpp:454
T output()
Definition filters.cpp:473
OneEuroFilter(double _freq, T _mincutoff, T _beta, T _dcutoff)
Definition filters.cpp:440
Definition filters.h:209
void setAcc(T acc)
Definition filters.cpp:423
void clear()
Definition filters.cpp:411
~RampFilter()=default
T output()
Definition filters.cpp:429
void input(T input_value)
Definition filters.cpp:405
RampFilter(T acc, T dt)
Definition filters.cpp:397
Definition filters.h:105
void input(T vector[3])
Definition filters.h:112
T y()
Definition filters.h:126
Vector3WithFilter(int num_data)
Definition filters.h:107
void clear()
Definition filters.h:117
T x()
Definition filters.h:122
T z()
Definition filters.h:130