Subject: DSP Trick: Filtering From: rainer.storn@infineon.com Date: 1999/04/21 Newsgroups: comp.dsp THIS WORK IS PLACED IN THE PUBLIC DOMAIN
Name: Filtering in C
Category: Programming Trick
Application: FIR-Filtering
Advantages: Simple and fast
Introduction:
This is more like a trick in C but might also be applicable in DSP environments. It allows to compute FIR-filtering in a fast manner when the filter length contains a factor of, let’s say 4 (other factors are also possible).
The Trick:
Let’s suppose you have an array for the FIR filter coefficients w[LEN] and an array for the delay line x[LEN]. A straightforward approach to do the filtering operation would be:
y=0; //will contain your result for (i=0; i<LEN; i++) { y = y + w[i]*x[i]; }
However, many processors don’t like the index calculations, so it is sometimes advantageous to do less index calculations. Here’s how it goes (suppose LEN is divisible by four. As stated above, the trick basically also works for other factors):
//-----Initialization--------------------------------------------- w_end_ptr = &w[LEN]; // load sentinel w_ptr = w; x_ptr = x; y0 = 0.; // we assume floating point here, so scaling is y1 = 0.; // not an issue y2 = 0.; y3 = 0.; //----Do the filtering------------------------------------------ while(w_ptr != w_end_ptr) { y0 = y0 + w_ptr[0]*x_ptr[0]; y1 = y1 + w_ptr[1]*x_ptr[1]; y2 = y2 + w_ptr[2]*x_ptr[2]; y3 = y3 + w_ptr[3]*x_ptr[3]; w_ptr = w_ptr + 4; x_ptr = x_ptr + 4; } y = y0 + y1 + y2 + y3; // y will contain the filtering result