10#ifndef INFUSE_SDK_INCLUDE_INFUSE_MATH_FILTER_H_
11#define INFUSE_SDK_INCLUDE_INFUSE_MATH_FILTER_H_
15#include <zephyr/kernel.h>
16#include <zephyr/sys/__assert.h>
37 return (uint32_t)(alpha * (1ULL << 32));
62 uint32_t alpha, int16_t initial)
64 __ASSERT_NO_MSG(alpha != 0);
66 filter->
alpha = alpha >> 16;
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);
87 filter->
error = y_scaled & UINT16_MAX;
114 uint32_t alpha, int32_t initial)
116 __ASSERT_NO_MSG(alpha != 0);
118 filter->
alpha = alpha;
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);
139 filter->
error = y_scaled & UINT32_MAX;
161 float alpha,
float initial)
163 __ASSERT_NO_MSG((alpha > 0.0f) && (alpha < 1.0f));
165 filter->
alpha = alpha;
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