Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2b2cf0a1c5 | ||
|
|
20fab90546 | ||
|
|
0e08a1e484 |
@@ -1,26 +0,0 @@
|
|||||||
#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;
|
|
||||||
}
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
#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