BipedalLocomotion::ContinuousDynamicalSystem::ButterworthLowPassFilter class

ButterworthLowPass implements a low pass filter of order N.

The system is described by the following transfer function

\[ H(s) = \frac{1}{\sqrt{1 + \left(\frac{s}{\omega_c}\right)^{2N}}} \]

where $\omega_c$ is the cutoff frequency and $N$ is the order of the filter and $s$ is the Laplace variable.

What follows is a brief description of the filter and how it is implemented.

Compute the transfer function of the continuous system

What follows is taken from from Passive and Active Network Analysis and Synthesis, Aram Budak, Houghton Mifflin, 1974 and from https://dsp.stackexchange.com/questions/79498/butterworth-filter-poles The poles of the Butterworth filter are evenly spaced on a circle of radius $\omega_c$ in the s-plane. The poles are given by

\[ p_k = \omega_c e^{j \frac{\pi}{2} \left(1 + \frac{2k - 1}{2N}\right)} \]

where $k = 0, 1, \ldots, N-1$ and $j$ is the imaginary unit. By construction, the Butterworth filter does not have zeros. The gain of the filter is given by

\[ K = \prod_{k=0}^{N-1} s_k = \omega_c^N \]

Compute the transfer function of the discrete system

As mentioned before, the transfer function of the discrete system is obtained by the bilinear transform

\[ s = \frac{2}{\delta t} \frac{1 - z^{-1}}{1 + z^{-1}} \]

The poles of the discrete system are obtained by substituting the poles of the continuous system in the bilinear transformation as explained in https://it.mathworks.com/help/signal/ref/bilinear.html The poles of the discrete system are given by

\[ p^d_k = \frac{1 + p_k \delta t/2}{1 - p_k \delta t/2} \]

where $p_k$ are the poles of the continuous system, $\delta t$ is the sampling time and $k = 0, 1, \ldots, N-1$ . All the zeros of the continuous system are mapped to -1. Finally, the gain of the discrete system is given by

\[ K^d = \text{real} \frac{K}{ \prod (\frac{2}{\delta T} - p_k) } \]

Pre-wrapping

The ButterworthLowPass supports the pre-wrapping of the filter. The pre-wrapping is a technique used to mitigate the distortion that can occur during the bilinear transformation. It consists in shifting the poles of the continuous system in the s-plane. To easily implement the pre-wrapping, we slightly modify the bilinear transformation as

\[ s = \frac{\omega_c}{\tan\left(\frac{\omega_c \delta t}{2}\right)} \frac{1 - z^{-1}}{1 + z^{-1}} \]

where $\omega_c$ is the cutoff frequency and $\delta t$ is the sampling time. In the class the pre-wrapping is enabled by default and can be disabled by setting the parameter enable_prewrapping to false. The interested reader can find more information about the pre-wrapping at this link.

Compute the coefficients of the discrete system

Once we have the poles and the gain of the discrete system we can compute the coefficients of the filter by applying the Vieta's formulas. The transfer function of the discrete system is given by

\[ H(z) = \frac{a_n + a_{n-1} z^{-1} + \ldots + a_1 z^{-n+1} + a_0 z^{-n}}{1 + b_{n-1} z^{-1} + \ldots + b_1 z^{-n+1} + b_0 z^{-n}} \]

Once the numerator and the denominator are computed we can easily antitransform the transfer function to obtain the coefficients of the filter as

\[ y[k] = \frac{1}{b_0} \left( a_0 x[k] + a_1 x[k-1] + \ldots + a_n x[k-n] - b_1 y[k-1] - \ldots - b_n y[k-n] \right) \]

where $x[k]$ is the input of the filter and $y[k]$ is the output of the filter.

Base classes

template<class _Input, class _Output>
class BipedalLocomotion::System::Advanceable<Eigen::VectorXd, Eigen::VectorXd>
Basic class that represents a discrete system.

Constructors, destructors, conversion operators

ButterworthLowPassFilter()
Constructor.
~ButterworthLowPassFilter() override
Destructor.

Public functions

auto initialize(std::weak_ptr<const ParametersHandler::IParametersHandler> handler) -> bool override
Initialize the Dynamical system.
auto reset(Eigen::Ref<const Eigen::VectorXd> initialState) -> bool
Set the state of the smoother.
auto advance() -> bool override
Compute the output of the filter.
auto getOutput() const -> const Eigen::VectorXd& override
Get the output of the filter.
auto setInput(const Eigen::VectorXd& input) -> bool override
Set the input of the filter.
auto isOutputValid() const -> bool override
Determines the validity of the object retrieved with getOutput()

Function documentation

bool BipedalLocomotion::ContinuousDynamicalSystem::ButterworthLowPassFilter::initialize(std::weak_ptr<const ParametersHandler::IParametersHandler> handler) override

Initialize the Dynamical system.

Parameters
handler pointer to the parameter handler.
Returns true in case of success/false otherwise.

bool BipedalLocomotion::ContinuousDynamicalSystem::ButterworthLowPassFilter::reset(Eigen::Ref<const Eigen::VectorXd> initialState)

Set the state of the smoother.

Parameters
initialState initial state of the smoother
Returns true in case of success, false otherwise.

bool BipedalLocomotion::ContinuousDynamicalSystem::ButterworthLowPassFilter::advance() override

Compute the output of the filter.

Returns true in case of success, false otherwise.

const Eigen::VectorXd& BipedalLocomotion::ContinuousDynamicalSystem::ButterworthLowPassFilter::getOutput() const override

Get the output of the filter.

Returns a vector containing the output of the smoother

bool BipedalLocomotion::ContinuousDynamicalSystem::ButterworthLowPassFilter::setInput(const Eigen::VectorXd& input) override

Set the input of the filter.

Parameters
input the vector representing the input of the filter
Returns True in case of success and false otherwise

bool BipedalLocomotion::ContinuousDynamicalSystem::ButterworthLowPassFilter::isOutputValid() const override

Determines the validity of the object retrieved with getOutput()

Returns True if the object is valid, false otherwise.