Larus glider flight sensor system 3.9.2024
Software-In-The-Loop test and validation system
Loading...
Searching...
No Matches
Linear_Least_Square_Fit.h
Go to the documentation of this file.
1/***********************************************************************/
25#ifndef LINEAR_LEAST_SQUARE_FIT_H_
26#define LINEAR_LEAST_SQUARE_FIT_H_
27
28#include "embedded_math.h"
29
31template<typename sample_type>
33 {
34 public:
36 : y_offset( sample_type()),
37 slope( sample_type()),
38 variance_offset( sample_type()),
39 variance_slope( sample_type()),
40 id(0)
41 {}
42 sample_type y_offset;
43 sample_type slope;
44 sample_type variance_offset;
45 sample_type variance_slope;
46 uint32_t id;
47 };
48
50template<typename sample_type, typename evaluation_type=sample_type>
52 {
53 public:
55 : sum_x(ZERO),
56 sum_y(ZERO),
57 sum_xx(ZERO),
58 sum_yy(ZERO),
59 sum_xy(ZERO),
60 n(ZERO)
61 {}
62 void
63 add_value (const sample_type x, const sample_type y)
64 {
65 sum_x += x;
66 sum_xx += x * x;
67 sum_y += y;
68 sum_yy += y * y;
69 sum_xy += x * y;
70 ++n;
71 }
72 void
73 reset (void)
74 {
75 sum_x = sum_xx = sum_y = sum_yy = sum_xy = n = ZERO;
76 }
77 void
79 {
81
82 evaluation_type x_mean = (evaluation_type)sum_x * inv_n;
83 evaluation_type Qx = (evaluation_type)sum_xx - inv_n * sum_x * sum_x;
85 evaluation_type Qy = (evaluation_type)sum_yy - inv_n * sum_y * sum_y;
86 evaluation_type Qxy = (evaluation_type)sum_xy - inv_n * sum_x * sum_y;
87
88// ASSERT( n > TWO);
89 evaluation_type Vyx = (Qy - Qxy * Qxy / Qx) / (n - TWO);
90
91 b = Qxy * invQx;
92 a = sum_y * inv_n - b * x_mean;
93
94 variance_a = Vyx * (inv_n + SQR( x_mean) * invQx);
95 variance_b = Vyx * invQx;
96 }
97 void
102 unsigned
103 get_count (void) const
104 {
105 return (unsigned) n;
106 }
107 sample_type get_mean_y( void) const
108 {
109 return sum_y / n;
110 }
111 sample_type get_mean_x( void) const
112 {
113 return sum_x / n;
114 }
115 private:
116 sample_type sum_x;
117 sample_type sum_y;
118 sample_type sum_xx;
119 sample_type sum_yy;
120 sample_type sum_xy;
121 sample_type n;
122 };
123
124#endif /* LINEAR_LEAST_SQUARE_FIT_H_ */
double evaluation_type
float a[2]
linear least square fit for y = a + b * x
void evaluate(linear_least_square_result< evaluation_type > &r) const
void add_value(const sample_type x, const sample_type y)
sample_type get_mean_x(void) const
sample_type get_mean_y(void) const
void evaluate(evaluation_type &a, evaluation_type &b, evaluation_type &variance_a, evaluation_type &variance_b) const
maintains result and precision data from a linear least square fit
uint32_t id
channel identifier (for logging)
defines platform-dependent algorithms and constants
#define ONE
#define TWO
#define ZERO
#define SQR(x)