ringbuf.c 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #include <math.h>
  2. #include "ringbuf.h"
  3. int ringbuf_init(struct ringbuf *ringbuf, int cap)
  4. {
  5. if (cap > RINGBUF_MAX_SIZE)
  6. return -1;
  7. ringbuf->p = 0;
  8. ringbuf->full = 0;
  9. ringbuf->sum = ringbuf->sum2 = 0.0;
  10. ringbuf->cap = cap;
  11. return 0;
  12. }
  13. void ringbuf_push(struct ringbuf *ringbuf, float value)
  14. {
  15. if (ringbuf->full) {
  16. float old = ringbuf->buf[ringbuf->p];
  17. ringbuf->sum -= old;
  18. ringbuf->sum2 -= old * old;
  19. }
  20. ringbuf->sum += value;
  21. ringbuf->sum2 += value * value;
  22. ringbuf->buf[ringbuf->p++] = value;
  23. if (ringbuf->p == ringbuf->cap) {
  24. ringbuf->p = 0;
  25. ringbuf->full = 1;
  26. }
  27. }
  28. int ringbuf_size(struct ringbuf *ringbuf)
  29. {
  30. return ringbuf->full ? ringbuf->cap : ringbuf->p;
  31. }
  32. float ringbuf_mean(struct ringbuf *ringbuf)
  33. {
  34. int sz = ringbuf_size(ringbuf);
  35. if (sz == 0)
  36. return 0;
  37. return ringbuf->sum / sz;
  38. }
  39. float ringbuf_variance(struct ringbuf *ringbuf)
  40. {
  41. float mean;
  42. int sz = ringbuf_size(ringbuf);
  43. if (sz == 0)
  44. return 0;
  45. mean = ringbuf_mean(ringbuf);
  46. return ringbuf->sum2 / sz - mean * mean;
  47. }
  48. float ringbuf_stdev(struct ringbuf *ringbuf)
  49. {
  50. return sqrt(ringbuf_variance(ringbuf));
  51. }
  52. /* vim: set ts=8 sw=8 sts=8 noet: */