// fir.c
// David_Harris@hmc.edu 20 January 2022
// Finite Impulse Response Filter

#include <stdio.h>  // supports printf
#include <math.h>   // supports fabs
#include "util.h"   // supports verify

void fir(int N, int M, double X[], double c[], double Y[]) {
  int i, n;
  double sum; 

  for (n=0; n<N; n++) {
      sum = 0;
      for (i=0; i<M; i++) {
          sum += c[i]*X[n-i+(M-1)];
      }
      Y[n] = sum;
  }
}

int main(void) {
    double X[20] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
    double c[5] = {0.2, 0.2, 0.2, 0.2, 0.2};
    double Y[15];
    double Yexpected[15] = {3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17}; 
 
    setStats(1);
    fir(15, 5, X, c, Y);
    setStats(0);
    // library linked doesn't support printing doubles, so convert to integers to print
    for (int i=0; i<15; i++)  {
        int tmp = Y[i];
        printf("Y[%d] = %d\n", i, tmp);
    }
    // verifyDouble doesn't work exaclty because of rounding, so check for almost equal
    for (int i=0; i<15; i++) {
        if (fabs(Y[i] - Yexpected[i]) > 1e-10) {
            return 1;
        }
    }
    return 0;
}