Controlpp
Loading...
Searching...
No Matches
DiscreteFilter.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <ostream>
4
9#include "transformations.hpp"
10
11namespace controlpp{
12
13
14
18 template<class T, int NStates_, int NInputs_=1, int NOutputs_=1>
19 class DssFilter{
20 private:
21
22 Eigen::Vector<T, NStates_> states_ = Eigen::Vector<T, NStates_>::Zero();
24
25 public:
26
27 static constexpr int n_states = NStates_;
28 static constexpr int n_inputs = NInputs_;
29 static constexpr int n_outputs = NOutputs_;
30
38
39 template<int N>
42
49
50 template<int N>
53 double Ts,
55 )
56 : DssFilter(to_state_space(ctf), Ts, method){}
57
58 Eigen::Vector<T, NOutputs_> input(const Eigen::Vector<T, NInputs_>& u){
59 const auto [x, y] = this->dss_.eval(this->states_, u);
60 this->states_ = x;
61 return y;
62 }
63
64 const Eigen::Vector<T, NStates_>& states() const {
65 return this->states_;
66 }
67
68 Eigen::Vector<T, NStates_>& states() {
69 return this->states_;
70 }
71
72 const T& states(int i) const {
73 return this->states_(i);
74 }
75
76 T& states(int i) {
77 return this->states_(i);
78 }
79
84 template<std::convertible_to<T> U>
85 requires(NInputs_ == 1 && NOutputs_ > 1)
86 Eigen::Vector<T, NOutputs_> input(const U& u){
87 const auto [x, y] = this->dss_.eval(this->states_, u);
88 this->states_ = x;
89 return y;
90 }
91
96 template<std::convertible_to<T> U>
97 requires(NInputs_ == 1 && NOutputs_ == 1)
98 T input(const U& u){
99 const auto [x, y] = this->dss_.eval(this->states_, static_cast<T>(u));
100 this->states_ = x;
101 return y;
102 }
103
104 template<std::convertible_to<T> U>
105 requires(NInputs_ == 1 && NOutputs_ == 1)
106 T operator() (const U& u){
107 return this->input(static_cast<T>(u));
108 }
109
113 void clear(){
114 this->states_.setZero();
115 }
116
122 return this->dss_;
123 }
124
132
133 friend std::ostream& operator<< (std::ostream& stream, const DssFilter& dssf){
134 stream << dssf.dss() << "\n";
135 stream << "states: " << dssf.states_.transpose() << "\n";
136 return stream;
137 }
138 };
139
140
141
145 template<class T, int NumOrder, int DenOrder>
147 private:
148
149 Eigen::Vector<T, NumOrder> uk_ = Eigen::Vector<T, NumOrder>::Zero();
150 Eigen::Vector<T, DenOrder> yk_ = Eigen::Vector<T, DenOrder>::Zero();
152 public:
153
162
163 T input(const T& u){
164 const Eigen::Vector<T, NumOrder+1> uk;
165 uk(0) = u;
166 uk.tail(NumOrder) = this->uk_;
167
168 const auto y = this->dtf_.eval(uk, this->yk_);
169
170 std::copy_backward(this->uk_.data(), this->uk_.data()+this->uk_.size(), this->uk_.data()+1);
171 this->uk_(0) = u;
172
173 std::copy_backward(this->yk_.data(), this->yk_.data()+this->yk_.size(), this->yk_.data()+1);
174 this->yk_(0) = y;
175 return y;
176 }
177
181 void clear(){
182 this->uk_.setZero();
183 this->yk_.setZero();
184 }
185
187 return this->dtf_;
188 }
189
191 return this->dtf_;
192 }
193
194 };
195
196}
Definition ContinuousStateSpace.hpp:10
Continuous transfer functions in the s lapace plain.
Definition ContinuousTransferFunction.hpp:28
Matrix (A, B, C, D) representation of a linear time invariant system.
Definition DiscreteStateSpace.hpp:41
std::tuple< Eigen::Vector< ValueType, internal_states >, Eigen::Vector< ValueType, outputs > > eval(const Eigen::Vector< ValueType, internal_states > &x, const Eigen::Vector< ValueType, inputs > &u) const
calculates the next states and calculates the output from the previous states and new inputs
Definition DiscreteStateSpace.hpp:81
Continuous transfer functions in the s lapace plain.
Definition DiscreteTransferFunction.hpp:23
constexpr T eval(const Eigen::Vector< T, NumOrder+1 > &input_series, const Eigen::Vector< T, DenOrder > &output_series)
Definition DiscreteTransferFunction.hpp:75
Controller from a discrete state space.
Definition DiscreteFilter.hpp:19
void clear()
sets the interanal state vector to zero
Definition DiscreteFilter.hpp:113
Eigen::Vector< T, NOutputs_ > input(const U &u)
input a new value to advance the internal state and calculate the new output
Definition DiscreteFilter.hpp:86
Eigen::Vector< T, NOutputs_ > input(const Eigen::Vector< T, NInputs_ > &u)
Definition DiscreteFilter.hpp:58
DssFilter(const ContinuousStateSpace< T, NStates_, NInputs_, NOutputs_ > &css, double Ts, EDiscretisation method=EDiscretisation::tustin)
Definition DiscreteFilter.hpp:43
T input(const U &u)
input a new value to advance the internal state and calculate the new output
Definition DiscreteFilter.hpp:98
static constexpr int n_outputs
Definition DiscreteFilter.hpp:29
static constexpr int n_states
Definition DiscreteFilter.hpp:27
const DiscreteStateSpace< T, NStates_, NInputs_, NOutputs_ > & dss() const
returns the contained state space object
Definition DiscreteFilter.hpp:121
const Eigen::Vector< T, NStates_ > & states() const
Definition DiscreteFilter.hpp:64
DssFilter(const ContinuousTransferFunction< T, N, NStates_ > &ctf, double Ts, EDiscretisation method=EDiscretisation::tustin)
Definition DiscreteFilter.hpp:51
const T & states(int i) const
Definition DiscreteFilter.hpp:72
Eigen::Vector< T, NStates_ > & states()
Definition DiscreteFilter.hpp:68
DssFilter(const DiscreteTransferFunction< T, N, NStates_ > &dtf)
Definition DiscreteFilter.hpp:40
DssFilter(const DiscreteStateSpace< T, NStates_, NInputs_, NOutputs_ > &dss)
construct a discrete filter from a state space
Definition DiscreteFilter.hpp:36
friend std::ostream & operator<<(std::ostream &stream, const DssFilter &dssf)
Definition DiscreteFilter.hpp:133
static constexpr int n_inputs
Definition DiscreteFilter.hpp:28
DiscreteStateSpace< T, NStates_, NInputs_, NOutputs_ > & dss()
returns the contained state space object
Definition DiscreteFilter.hpp:129
T & states(int i)
Definition DiscreteFilter.hpp:76
Controller from a discrete transfer function.
Definition DiscreteFilter.hpp:146
void clear()
sets the interanal state vector to zero
Definition DiscreteFilter.hpp:181
T input(const T &u)
Definition DiscreteFilter.hpp:163
const DiscreteTransferFunction< T, NumOrder, DenOrder > & dft() const
Definition DiscreteFilter.hpp:186
DiscreteTransferFunction< T, NumOrder, DenOrder > & dft()
Definition DiscreteFilter.hpp:190
DtfFilter(const DiscreteTransferFunction< T, NumOrder, DenOrder > &dtf)
construct a discrete filter from a Transfer Function
Definition DiscreteFilter.hpp:159
The main namespace for the Control++ library.
Definition Bode.cpp:3
DiscreteStateSpace< T, NStates, 1, 1 > discretise(const ContinuousStateSpace< T, NStates, 1, 1 > &sys, const T &sample_time, EDiscretisation method)
Definition transformations.hpp:143
EDiscretisation
Definition transformations.hpp:22
ContinuousStateSpace< T, DenOrder, 1, 1 > to_state_space(const ContinuousTransferFunction< T, NumOrder, DenOrder > &ctf)
constructs a continuous state space function from a continuous transfer function
Definition ContinuousStateSpace.hpp:91