summaryrefslogtreecommitdiffstats
path: root/src/control.h.old
blob: 3a147fcb038f5a832252e8b04fcf18c4119f6180 (plain)
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: