diff --git a/fir.c b/fir.c new file mode 100644 index 0000000..cb05368 --- /dev/null +++ b/fir.c @@ -0,0 +1,42 @@ +#include + +#define N 5 // Number of taps (filter coefficients) + +// Example filter coefficients (simple low-pass averaging filter) +float coeffs[N] = { + 0.2, 0.2, 0.2, 0.2, 0.2 // Equal weights → moving average filter +}; + +float buffer[N] = {0}; // Circular buffer to store recent inputs +int bufIndex = 0; + +float fir_filter(float input) { + buffer[bufIndex] = input; + + float output = 0.0; + int index = bufIndex; + + // Apply the convolution (dot product of input buffer and coefficients) + for (int i = 0; i < N; ++i) { + output += coeffs[i] * buffer[index]; + if (--index < 0) + index = N - 1; // Wrap around circular buffer + } + + bufIndex = (bufIndex + 1) % N; + return output; +} + +int main() { + float noisy_signal[] = {1, 2, 3, 2, + 100, 3, 2, 1}; // A spike in the middle (100) + int len = sizeof(noisy_signal) / sizeof(float); + + printf("Filtered output:\n"); + for (int i = 0; i < len; ++i) { + float filtered = fir_filter(noisy_signal[i]); + printf("%.2f\n", filtered); + } + + return 0; +}