====== Algorithms ====== ====== Low-pass filters ====== ===== IIR ===== y[i] := ß * x[i] + (1-ß) * y[i-1] From [[https://en.wikipedia.org/wiki/Low-pass_filter#Simple_infinite_impulse_response_filter|Wiki]]: This discrete-time implementation of a simple RC low-pass filter is the exponentially weighted moving average (aka [[https://en.wikipedia.org/wiki/Exponential_smoothing|Exponential smoothing]]) Exponential smoothing: y[i] := y[i-1] + α * (x[i] - y[i-1]) where α = (1-ß) (from above) #define ALPHA_PERCENT 60 int16_t exponential_smoothing(int16_t input, int16_t old_value) { int32_t val = old_value; int32_t diff = input - old_value; val += (ALPHA_PERCENT * diff) / 100; return val; } ===== Moving Average (MA) ===== aka moving average / rolling average / running average #define LPA_NUM 10 static int16_t lpa_buf[LPA_NUM]; void low_pass_average_init(int16_t init_value) { for (int i = 0; i < sizeof(lpa_buf)/sizeof(lpa_buf[0]); i++) { lpa_buf[i] = init_value; } } int16_t low_pass_average(int16_t input) { int32_t sum = 0; for (unsigned int i = (LPA_NUM)-1; i > 0; --i) { lpa_buf[i] = lpa_buf[i-1]; sum += lpa_buf[i]; } sum += input; lpa_buf[0] = input; return sum/LPA_NUM; } ==== Weighted Moving Average ==== Time-weighted moving average LWMA - Linearly Weighted Moving Average #define LPA_NUM 10 static int16_t wma_buf[LPA_NUM]; static int16_t ma_w[LPA_NUM] = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 }; void mag_moving_average_init(int16_t init_value) { for (int i = 0; i < sizeof(ma_buf)/sizeof(ma_buf[0]); i++) { wma_buf[i] = init_value; } } nt16_t mag_weighted_moving_average(int16_t input) { int32_t sum = 0; int32_t w_sum = 0; for (unsigned int i = (LPA_NUM)-1; i > 0; --i) { wma_buf[i] = wma_buf[i-1]; sum += wma_buf[i] * ma_w[i]; w_sum += ma_w[i]; } wma_buf[0] = input; sum += wma_buf[0] * ma_w[0]; w_sum += ma_w[0]; return sum / w_sum; } ====== Change detection ====== aka: anomaly detection ===== CuSum ===== * [[https://en.wikipedia.org/wiki/CUSUM|CUSUM]] - Cumulative sum control chart * [[https://hal.archives-ouvertes.fr/hal-00914697/document]]