Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6d272f85b8 | ||
|
|
bdc3ae542f | ||
|
|
b8a47e247a |
26
app/src/util/average.c
Normal file
26
app/src/util/average.c
Normal file
@@ -0,0 +1,26 @@
|
||||
#include "average.h"
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
void
|
||||
sc_average_init(struct sc_average *avg, unsigned range) {
|
||||
avg->range = range;
|
||||
avg->avg = 0;
|
||||
avg->count = 0;
|
||||
}
|
||||
|
||||
void
|
||||
sc_average_push(struct sc_average *avg, float value) {
|
||||
if (avg->count < avg->range) {
|
||||
++avg->count;
|
||||
}
|
||||
|
||||
assert(avg->count);
|
||||
avg->avg = ((avg->count - 1) * avg->avg + value) / avg->count;
|
||||
}
|
||||
|
||||
bool
|
||||
sc_average_get(struct sc_average *avg, float *value) {
|
||||
*value = avg->avg;
|
||||
return avg->count;
|
||||
}
|
||||
36
app/src/util/average.h
Normal file
36
app/src/util/average.h
Normal file
@@ -0,0 +1,36 @@
|
||||
#ifndef SC_AVERAGE
|
||||
#define SC_AVERAGE
|
||||
|
||||
#include "common.h"
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
|
||||
struct sc_average {
|
||||
// Current average value
|
||||
float avg;
|
||||
|
||||
// Target range, to update the average as follow:
|
||||
// avg = ((range - 1) * avg + new_value) / range
|
||||
unsigned range;
|
||||
|
||||
// Number of values pushed when less than range (count <= range).
|
||||
// The purpose is to handle the first (range - 1) values properly.
|
||||
unsigned count;
|
||||
};
|
||||
|
||||
void
|
||||
sc_average_init(struct sc_average *avg, unsigned range);
|
||||
|
||||
/* Push a new value to update the "rolling" average */
|
||||
void
|
||||
sc_average_push(struct sc_average *avg, float value);
|
||||
|
||||
/* Get the current average value (if available)
|
||||
*
|
||||
* An average is available if sc_average_push() has been called at least once.
|
||||
*/
|
||||
bool
|
||||
sc_average_get(struct sc_average *avg, float *value);
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user