Infuse-IoT SDK API 0.0.1
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
filter.h
Go to the documentation of this file.
1
10#ifndef INFUSE_SDK_INCLUDE_INFUSE_MATH_FILTER_H_
11#define INFUSE_SDK_INCLUDE_INFUSE_MATH_FILTER_H_
12
13#include <math.h>
14
15#include <zephyr/kernel.h>
16#include <zephyr/sys/__assert.h>
17
18#ifdef __cplusplus
19extern "C" {
20#endif
21
35static inline uint32_t iir_filter_alpha_init(float alpha)
36{
37 return (uint32_t)(alpha * (1ULL << 32));
38}
39
47 int16_t y_prev;
48 uint16_t alpha;
49 uint16_t error;
50};
51
62 uint32_t alpha, int16_t initial)
63{
64 __ASSERT_NO_MSG(alpha != 0);
65 filter->y_prev = initial;
66 filter->alpha = alpha >> 16;
67 filter->error = 0;
68}
69
79 int16_t x)
80{
81 uint32_t one = (1U << 16);
82 uint32_t alpha32 = filter->alpha;
83 uint32_t alpha32_inv = one - alpha32;
84 int32_t y_scaled = (alpha32 * x) + (alpha32_inv * filter->y_prev) + filter->error;
85 int16_t y = (y_scaled >> 16);
86
87 filter->error = y_scaled & UINT16_MAX;
88 filter->y_prev = y;
89 return y;
90}
91
99 int32_t y_prev;
100 uint32_t alpha;
101 uint32_t error;
102};
103
114 uint32_t alpha, int32_t initial)
115{
116 __ASSERT_NO_MSG(alpha != 0);
117 filter->y_prev = initial;
118 filter->alpha = alpha;
119 filter->error = 0;
120}
121
131 int32_t x)
132{
133 uint64_t one = (1ULL << 32);
134 uint64_t alpha64 = filter->alpha;
135 uint64_t alpha64_inv = one - alpha64;
136 int64_t y_scaled = (alpha64 * x) + (alpha64_inv * filter->y_prev) + filter->error;
137 int32_t y = (y_scaled >> 32);
138
139 filter->error = y_scaled & UINT32_MAX;
140 filter->y_prev = y;
141 return y;
142}
143
152
161 float alpha, float initial)
162{
163 __ASSERT_NO_MSG((alpha > 0.0f) && (alpha < 1.0f));
164 filter->y_prev = initial;
165 filter->alpha = alpha;
166 filter->inv_alpha = 1.0f - alpha;
167}
168
178 float x)
179{
180 float y = (filter->alpha * x) + (filter->inv_alpha * filter->y_prev);
181
182 filter->y_prev = y;
183 return y;
184}
185
190#ifdef __cplusplus
191}
192#endif
193
194#endif /* INFUSE_SDK_INCLUDE_INFUSE_MATH_FILTER_H_ */
static uint32_t iir_filter_alpha_init(float alpha)
Convert a filter alpha to a form compatible with IIR filters.
Definition filter.h:35
static void iir_filter_single_pole_s32_init(struct iir_filter_single_pole_s32 *filter, uint32_t alpha, int32_t initial)
Initialise the integer IIR single-pole filter.
Definition filter.h:113
static int16_t iir_filter_single_pole_s16_step(struct iir_filter_single_pole_s16 *filter, int16_t x)
Run the filter for one step.
Definition filter.h:78
static int32_t iir_filter_single_pole_s32_step(struct iir_filter_single_pole_s32 *filter, int32_t x)
Run the filter for one step.
Definition filter.h:130
static void iir_filter_single_pole_f32_init(struct iir_filter_single_pole_f32 *filter, float alpha, float initial)
Initialise the float IIR single-pole filter.
Definition filter.h:160
static float iir_filter_single_pole_f32_step(struct iir_filter_single_pole_f32 *filter, float x)
Run the filter for one step.
Definition filter.h:177
static void iir_filter_single_pole_s16_init(struct iir_filter_single_pole_s16 *filter, uint32_t alpha, int16_t initial)
Initialise the integer IIR single-pole filter.
Definition filter.h:61
Floating point IIR single-pole filter.
Definition filter.h:147
float inv_alpha
Definition filter.h:150
float alpha
Definition filter.h:149
float y_prev
Definition filter.h:148
Signed 16-bit IIR single-pole filter with fraction saving.
Definition filter.h:46
uint16_t error
Definition filter.h:49
uint16_t alpha
Definition filter.h:48
int16_t y_prev
Definition filter.h:47
Signed 32-bit IIR single-pole filter with fraction saving.
Definition filter.h:98
uint32_t error
Definition filter.h:101
int32_t y_prev
Definition filter.h:99
uint32_t alpha
Definition filter.h:100