cvw/examples/C/fir/fir.c
2022-01-28 00:26:06 +00:00

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;
}