Listing 4 Filter with Circular Buffer

/* Filters the vector, v, of input values, putting the
 * results back in the same vector.
 */
void filter(Filter *f, double *v, int length)
{
   /* Making a local copy saves execution time */
   CircularBuffer y = *(f->y);
   
   /* Loop through the vector values */
   for(; length--; v++)
   {
      double
         sum = *v,       /* becomes filter output */
         *c = f->coef;
      int k = f->order,  /* The number of coefficients */
         i = y.index;    /* Index to previous outputs */
      
      /* Loop through filter coefficients */
      for(; k--; c++)
      {
         i = (i - 1) & y.mask;
         sum -= *c * y.buffer[i];
      }
      /* Save output for next data point */
      y.buffer[y.index] = sum;
      y.index= (y.index + 1) & y.mask;
      
      *v = sum; /* Set output value */
   }
   /* Store the local copy back in the filter structure
*/
   *(f->y) = y;
}