#include #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: */