Mercurial > hg > beaglert
view include/stats.hpp @ 556:ce391098f321 prerelease tip
THIS PROJECT HAS MOVED TO https://github.com/BelaPlatform/bela
author | Giulio Moro <giuliomoro@yahoo.it> |
---|---|
date | Sat, 25 Jun 2016 20:21:00 +0100 |
parents | 89f28a867a09 |
children |
line wrap: on
line source
#ifndef STATS_HPP_INCLUDED #define STATS_HPP_INCLUDED #include <stdlib.h> #include <stdio.h> #include <string.h> template<class TYPE> class MovingAverage{ private: TYPE* array; int length; bool bufferFull; int pointer; TYPE sum; double scale; double average; void dealloc(){ free(array); // delete array; } void init(int aLength){ length=aLength; scale=1.0/length; // array= new TYPE(length); // for some reason this causes memory corruption, so I am using malloc() instead... array=(TYPE*)malloc(sizeof(TYPE)*length); sum=0; if(array==NULL) printf("Error while allocating array\n"); memset(array, 0, sizeof(TYPE)*length); reset(); } public: MovingAverage(){ init(0); } MovingAverage(int aLength){ init(aLength); } ~MovingAverage(){ dealloc(); } int getLength(){ return bufferFull ? length : pointer; } void setLength(int aLength){ dealloc(); init(aLength); } double add(TYPE newElement){ sum-=array[pointer]; array[pointer]=newElement; sum+=newElement; if(bufferFull==true){ average=sum*scale; } else{ average=sum/(double)(1+pointer); } pointer++; if(pointer==length){ pointer=0; bufferFull=true; } return average; } double getAverage(){ return average; } void reset(){ pointer=0; bufferFull=false; } }; #endif /* STATS_HPP_INCLUDED */