1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
#pragma once
#include "Eigen/Dense"
#include <complex>
#ifndef CONTROL_H
#define CONTROL_H
namespace ct
{
// Fwd declarations
template<typename T, int n, int m, int k> struct SSModel;
template<typename T, int p, int z> struct TransferFn;
namespace math
{
template<typename T, int n, int m>
Eigen::Vector<T, n + m - 1> convolve1d(
const Eigen::Ref<Eigen::Vector<T, n>>& x
const Eigen::Ref<Eigen::Vector<T, m>>& y)
{
Eigen::Vector<T, n + m -1> out;
return out;
}
Eigen::VectorXd convolve1d(
const Eigen::Ref<Eigen::VectorXd>& x,
const Eigen::Ref<Eigen::VectorXd>& y)
{
}
}
/* Transfer Functions for SISO and frequency domain analysis */
template<typename T, int p, int z>
struct TransferFn
{
Eigen::Vector<std::complex<T>, z> zeros;
Eigen::Vector<std::complex<T>, p> poles;
explicit operator SSModel<T, p, 1, 1>() const
{
}
};
typedef TransferFn<std::complex<double>, Eigen::Dynamic, Eigen::Dynamic> TransferFnXd;
template<typename T, typename CT = std::complex<T>>
struct FreqSeries
{
size_t nsamples;
T start, end;
Eigen::VectorX<T> f;
Eigen::VectorX<CT> data;
};
typedef FreqSeries<double> FreqSeriesD;
/* State space modelling and time domain simulaiton */
template<typename T, int n, int m, int k>
struct SSModel
{
/* State space model with
* - n dimensional state x
* - m dimensional input u
* - k dimensional output y
*/
Eigen::Matrix<T, n, n> A;
Eigen::Matrix<T, n, m> B;
Eigen::Matrix<T, k, m> C;
Eigen::Matrix<T, k, m> D;
// SSModel(Eigen::VectorX<T> zeros, Eigen::VectorX<T> poles);
};
typedef SSModel<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::Dynamic> SSModelXd;
template<typename T>
struct TimeSeries
{
size_t nsamples;
T start, end;
Eigen::VectorX<T> t;
Eigen::MatrixX<T> u, x, y;
template<int n, int m, int k>
explicit TimeSeries(size_t nsamples, T start, T end, const SSModel<T, n, m, k>& ss);
};
typedef TimeSeries<double> TimeSeriesD;
template<typename T, int n, int m, int k>
void response(SSModel<T, n, m, k> ss, TimeSeries<T>& ts);
template<typename T, int n, int m, int k>
void step(SSModel<T, n, m, k> ss, TimeSeries<T>& ts);
}
#endif // CONTROL_H
// vim:ts=2 sw=2 noet:
|