causal-filter.cpp
Go to the documentation of this file.
1 /*
2  * Copyright 2017-, Rohan Budhiraja LAAS-CNRS
3  *
4  * This file is part of sot-torque-control.
5  * sot-torque-control is free software: you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public License
7  * as published by the Free Software Foundation, either version 3 of
8  * the License, or (at your option) any later version.
9  * sot-torque-control is distributed in the hope that it will be
10  * useful, but WITHOUT ANY WARRANTY; without even the implied warranty
11  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU Lesser General Public License for more details. You should
13  * have received a copy of the GNU Lesser General Public License along
14  * with sot-torque-control. If not, see <http://www.gnu.org/licenses/>.
15  */
16 
17 #include <iostream>
19 
20 using namespace dynamicgraph::sot;
21 /*
22 Filter data with an IIR or FIR filter.
23 
24 Filter a data sequence, x, using a digital filter. The filter is a direct form
25 II transposed implementation of the standard difference equation. This means
26 that the filter implements:
27 
28 a[0]*y[N] = b[0]*x[N] + b[1]*x[N-1] + ... + b[m-1]*x[N-(m-1)]
29  - a[1]*y[N-1] - ... - a[n-1]*y[N-(n-1)]
30 
31 where m is the degree of the numerator, n is the degree of the denominator, and
32 N is the sample number
33 
34 */
35 
36 CausalFilter::CausalFilter(const double &timestep, const size_type &xSize,
37  const Eigen::VectorXd &filter_numerator,
38  const Eigen::VectorXd &filter_denominator)
39 
40  : m_dt(timestep),
41  m_x_size(xSize),
42  m_filter_order_m(filter_numerator.size()),
43  m_filter_order_n(filter_denominator.size()),
44  m_filter_numerator(filter_numerator),
45  m_filter_denominator(filter_denominator),
46  m_first_sample(true),
47  m_pt_numerator(0),
48  m_pt_denominator(0),
49  m_input_buffer(Eigen::MatrixXd::Zero(xSize, filter_numerator.size())),
50  m_output_buffer(
51  Eigen::MatrixXd::Zero(xSize, filter_denominator.size() - 1)) {
52  assert(timestep > 0.0 && "Timestep should be > 0");
53  assert(m_filter_numerator.size() == m_filter_order_m);
54  assert(m_filter_denominator.size() == m_filter_order_n);
55 }
56 
57 void CausalFilter::get_x_dx_ddx(const Eigen::VectorXd &base_x,
58  Eigen::VectorXd &x_output_dx_ddx) {
59  // const dynamicgraph::Vector &base_x = m_xSIN(iter);
60  if (m_first_sample) {
61  for (size_type i = 0; i < m_filter_order_m; i++)
62  m_input_buffer.col(i) = base_x;
63  for (size_type i = 0; i < m_filter_order_n - 1; i++)
64  m_output_buffer.col(i) =
65  base_x * m_filter_numerator.sum() / m_filter_denominator.sum();
66  m_first_sample = false;
67  }
68 
69  m_input_buffer.col(m_pt_numerator) = base_x;
70 
71  Eigen::VectorXd b(m_filter_order_m);
72  Eigen::VectorXd a(m_filter_order_n - 1);
73  b.head(m_pt_numerator + 1) =
74  m_filter_numerator.head(m_pt_numerator + 1).reverse();
75  b.tail(m_filter_order_m - m_pt_numerator - 1) =
77 
78  a.head(m_pt_denominator + 1) =
79  m_filter_denominator.segment(1, m_pt_denominator + 1).reverse();
80  a.tail(m_filter_order_n - m_pt_denominator - 2) =
82  .reverse();
83  x_output_dx_ddx.head(m_x_size) =
85 
86  // Finite Difference
87  Eigen::VectorXd::Index m_pt_denominator_prev =
89  x_output_dx_ddx.segment(m_x_size, m_x_size) =
90  (x_output_dx_ddx.head(m_x_size) - m_output_buffer.col(m_pt_denominator)) /
91  m_dt;
92  x_output_dx_ddx.tail(m_x_size) =
93  (x_output_dx_ddx.head(m_x_size) -
95  m_output_buffer.col(m_pt_denominator_prev)) /
96  m_dt / m_dt;
97 
101  ? (m_pt_denominator + 1)
102  : 0;
103  m_output_buffer.col(m_pt_denominator) = x_output_dx_ddx.head(m_x_size);
104  return;
105 }
106 
107 void CausalFilter::switch_filter(const Eigen::VectorXd &filter_numerator,
108  const Eigen::VectorXd &filter_denominator) {
109  Eigen::VectorXd::Index filter_order_m = filter_numerator.size();
110  Eigen::VectorXd::Index filter_order_n = filter_denominator.size();
111 
112  Eigen::VectorXd current_x(m_input_buffer.col(m_pt_numerator));
113 
114  m_input_buffer.resize(Eigen::NoChange, filter_order_m);
115  m_output_buffer.resize(Eigen::NoChange, filter_order_n - 1);
116 
117  for (size_type i = 0; i < filter_order_m; i++)
118  m_input_buffer.col(i) = current_x;
119 
120  for (size_type i = 0; i < filter_order_n - 1; i++)
121  m_output_buffer.col(i) =
122  current_x * filter_numerator.sum() / filter_denominator.sum();
123 
124  m_filter_order_m = filter_order_m;
125  m_filter_numerator.resize(filter_order_m);
126  m_filter_numerator = filter_numerator;
127 
128  m_filter_order_n = filter_order_n;
129  m_filter_denominator.resize(filter_order_n);
130  m_filter_denominator = filter_denominator;
131 
132  m_pt_numerator = 0;
133  m_pt_denominator = 0;
134 
135  return;
136 }
Eigen
dynamicgraph::sot::CausalFilter::m_filter_order_n
Eigen::VectorXd::Index m_filter_order_n
Size of the denominator .
Definition: causal-filter.hh:75
causal-filter.hh
dynamicgraph::sot::CausalFilter::m_pt_numerator
size_type m_pt_numerator
Definition: causal-filter.hh:83
dynamicgraph::sot::CausalFilter::m_x_size
size_type m_x_size
Size.
Definition: causal-filter.hh:71
i
int i
dynamicgraph::sot::CausalFilter::get_x_dx_ddx
void get_x_dx_ddx(const Eigen::VectorXd &base_x, Eigen::VectorXd &x_output_dx_ddx)
Definition: causal-filter.cpp:57
dynamicgraph::sot::CausalFilter::m_first_sample
bool m_first_sample
Definition: causal-filter.hh:81
dynamicgraph::sot::CausalFilter::CausalFilter
EIGEN_MAKE_ALIGNED_OPERATOR_NEW CausalFilter(const double &timestep, const size_type &xSize, const Eigen::VectorXd &filter_numerator, const Eigen::VectorXd &filter_denominator)
Definition: causal-filter.cpp:36
b
Vec3f b
dynamicgraph::sot::CausalFilter::m_pt_denominator
size_type m_pt_denominator
Definition: causal-filter.hh:84
dynamicgraph::sot::CausalFilter::m_filter_order_m
Eigen::VectorXd::Index m_filter_order_m
Size of the numerator .
Definition: causal-filter.hh:73
dynamicgraph::sot::CausalFilter::m_filter_numerator
Eigen::VectorXd m_filter_numerator
Coefficients of the numerator .
Definition: causal-filter.hh:78
size
FCL_REAL size() const
Index
std::size_t Index
dynamicgraph::sot::CausalFilter::m_dt
double m_dt
sampling timestep of the input signal
Definition: causal-filter.hh:69
dynamicgraph::size_type
Matrix::Index size_type
a
Vec3f a
dynamicgraph::sot::CausalFilter::m_input_buffer
Eigen::MatrixXd m_input_buffer
Definition: causal-filter.hh:85
dynamicgraph::sot::CausalFilter::switch_filter
void switch_filter(const Eigen::VectorXd &filter_numerator, const Eigen::VectorXd &filter_denominator)
Definition: causal-filter.cpp:107
dynamicgraph::sot::CausalFilter::m_output_buffer
Eigen::MatrixXd m_output_buffer
Definition: causal-filter.hh:86
dynamicgraph::sot
dynamicgraph::sot::CausalFilter::m_filter_denominator
Eigen::VectorXd m_filter_denominator
Coefficients of the denominator .
Definition: causal-filter.hh:80


sot-core
Author(s): Olivier Stasse, ostasse@laas.fr
autogenerated on Tue Oct 24 2023 02:26:31