12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- #include <math.h>
- #include "ringbuf.h"
- int ringbuf_init(struct ringbuf *ringbuf, int cap)
- {
- if (cap > RINGBUF_MAX_SIZE)
- return -1;
- ringbuf->p = 0;
- ringbuf->full = 0;
- ringbuf->sum = ringbuf->sum2 = 0.0;
- ringbuf->cap = cap;
- return 0;
- }
- void ringbuf_push(struct ringbuf *ringbuf, float value)
- {
- if (ringbuf->full) {
- float old = ringbuf->buf[ringbuf->p];
- ringbuf->sum -= old;
- ringbuf->sum2 -= old * old;
- }
- ringbuf->sum += value;
- ringbuf->sum2 += value * value;
- ringbuf->buf[ringbuf->p++] = value;
- if (ringbuf->p == ringbuf->cap) {
- ringbuf->p = 0;
- ringbuf->full = 1;
- }
- }
- int ringbuf_size(struct ringbuf *ringbuf)
- {
- return ringbuf->full ? ringbuf->cap : ringbuf->p;
- }
- float ringbuf_mean(struct ringbuf *ringbuf)
- {
- int sz = ringbuf_size(ringbuf);
- if (sz == 0)
- return 0;
- return ringbuf->sum / sz;
- }
- float ringbuf_variance(struct ringbuf *ringbuf)
- {
- float mean;
- int sz = ringbuf_size(ringbuf);
- if (sz == 0)
- return 0;
- mean = ringbuf_mean(ringbuf);
- return ringbuf->sum2 / sz - mean * mean;
- }
- float ringbuf_stdev(struct ringbuf *ringbuf)
- {
- return sqrt(ringbuf_variance(ringbuf));
- }
- /* vim: set ts=8 sw=8 sts=8 noet: */
|