forked from Github_Repos/cvw
		
	
		
			
				
	
	
		
			43 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			43 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
// 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;
 | 
						|
} |