3 * \brief 1st and 2nd order filter implementation
4 * \author Jean Baptiste Lanfrey <jean-baptiste.lanfrey@parrot.com>
8 #include <Maths/maths.h>
9 #include <Maths/filter.h>
12 void filter_init(uint32_t n, float32_t *old_input, float32_t initial_input, float32_t *old_output, float32_t initial_output)
16 for (ii=0; ii<n ; ii++)
17 old_input[ii] = initial_input;
19 for (ii=0; ii<n; ii++)
20 old_output[ii] = initial_output;
23 float filter(uint32_t n, const float32_t *b, const float32_t *a, float32_t input, float32_t *old_input, float32_t *old_output)
26 float32_t inno, past, output;
28 // innovation computation
30 for (ii=1; ii<n+1; ii++)
31 inno += b[ii] * old_input[ii-1];
35 for (ii=1; ii<n+1; ii++)
36 past -= a[ii] * old_output[ii-1];
38 // output = (inno + past) / a[0];
39 // We assume a[0] is always equal to 1
40 output = (inno + past);
42 // inputs and outputs shift
43 for (ii=n-1; ii>0; ii--)
44 old_input[ii] = old_input[ii-1];
48 for (ii=n-1; ii>0; ii--)
49 old_output[ii] = old_output[ii-1];
51 old_output[0] = output;
57 // Filtre du type Kd.p / (1+Td.p)
58 float32_t deriv(deriv_param_t *param, float32_t input)
60 static float32_t exp_1 = 0.3678794411714423412f; // expf(-1.0f);
66 if( f_is_zero( param->td ) )
68 // prevent from dividing by 0.
75 // exp = expf(-param->te/td);
76 exp = exp_taylor(-param->te/td);
79 param->internal_state = exp * param->internal_state + td * (1 - exp) * param->old_input;
81 out = ( param->kd / td ) * ( input - param->internal_state / td );
83 param->old_input = input;
88 void delay_init(uint32_t m, float32_t *old_input, float32_t initial_input)
92 for (ii=0; ii<m ; ii++)
93 old_input[ii] = initial_input;
96 float32_t delay(uint32_t m, float32_t input, float32_t *old_input)
101 output = old_input[m-1];
104 for (ii=m-1; ii>0; ii--)
105 old_input[ii] = old_input[ii-1];
107 old_input[0] = input;
112 float32_t rate_limiter(float32_t input, float32_t old_output, float32_t rate_max)
115 float_or_int_t FOI_rate,FOI_rate_max;
117 FOI_rate.f = input - old_output;
118 FOI_rate_max.f = rate_max;
120 if( f_abs( FOI_rate ) > FOI_rate_max.f )
121 output = old_output + f_set_clamp( FOI_rate, FOI_rate_max );