/* ** $Id: runningmean.c,v 1.1 1997/12/22 19:56:53 frank Exp $ ** runningmean.c 1.0 Solaris 2.6 Unix 971218 SIO/ODF fmd ** ** Running Mean functions */ #include #include RunningMean RunningMeanInit(int n, double initVal) { int i; double sum, *pQ; RunningMean pR; if (n<1) n = 1; pR = (RunningMean)malloc(sizeof (RunningMeanDesc)+ n * sizeof (double)); pR->q = (double *)&pR[1]; for (i=0, sum=initVal, pQ=pR->q; isum = sum; pR->last = 0; pR->n = n; return (pR); } double RunningMeanReset(RunningMean pR, double initVal) { int i, n; double sum, *pQ; for (i=0, n=pR->n, pQ=pR->q, sum=initVal; isum = sum; pR->last = 0; return (initVal); } double RunningMeanCalc(RunningMean pR, double val) { double newVal, *pQ = pR->q, sum = pR->sum; int index = pR->last, n = pR->n; pR->sum = sum = sum-pQ[index]+val; pQ[index] = val; newVal = sum / n; pR->last = (++index) % n; return (newVal); }