meta data for this page
Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
algo [2020/03/23 15:58] niziak |
algo [2020/04/20 07:25] (current) niziak |
||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ====== Algorithms ====== | ||
+ | |||
====== Low-pass filters ====== | ====== Low-pass filters ====== | ||
Line 10: | Line 12: | ||
where α = (1-ß) (from above) | where α = (1-ß) (from above) | ||
</code> | </code> | ||
+ | <code c> | ||
+ | #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; | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | ===== Moving Average (MA) ===== | ||
+ | aka moving average / rolling average / running average | ||
+ | |||
+ | <code c> | ||
+ | #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; | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | ==== Weighted Moving Average ==== | ||
+ | Time-weighted moving average | ||
+ | LWMA - Linearly Weighted Moving Average | ||
+ | <code c> | ||
+ | #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; | ||
+ | } | ||
+ | </code> | ||
+ | |||
====== Change detection ====== | ====== Change detection ====== | ||
Line 16: | Line 83: | ||
===== CuSum ===== | ===== CuSum ===== | ||
- | [[https://en.wikipedia.org/wiki/CUSUM|CUSUM]] - Cumulative sum control chart | + | * [[https://en.wikipedia.org/wiki/CUSUM|CUSUM]] - Cumulative sum control chart |
+ | * [[https://hal.archives-ouvertes.fr/hal-00914697/document]] | ||