FIR filters are often used because they are simple and easy to understand [6]. Diagrams of the operation of an FIR filter are shown in Figure S1. An FIR filter works by multiplying an array of the most recent n data samples by an array of constants (called the tap coefficients), and summing the elements of the resulting array. (This operation is commonly called a dot product.) The filter then inputs another sample of data (which causes the oldest piece of data to be thrown away) and repeats the process.

*Sidebar Fig - (a) FIR Filter operation in the time domain. Given
the h[k]'s, we are implementing an FIR filter as shown in the
diagram. (b) FIR Filter operation in the frequency domain. This
diagram shows the frequency response of the filter in part a. Notice
that the tap coefficients (h[k]'s) are simply the Fourier
series coefficients of the frequency response.*

The interesting part of designing FIR filters is translating the desired frequency response into filter tap coefficients. As can be seen from Figure S1a, the equation for the output of an FIR filter in the time domain is:

(Eq. S1)

where is the sampling frequency and k is the filter tap number. Since a delay of in time corresponds to a multiplication by a complex exponential, the corresponding equation in the frequency domain (from Figure S1b) is:

(Eq. S2a)

where

(Eq. S2b)

is the frequency response of the FIR filter. It can be seen that h[k], the filter tap coefficients, are precisely the Fourier series coefficients of H(f) which is periodic with period . Therefore the tap coefficients may be calculated from the following equation:

(Eq. S3)

An additional option for improving the performance of the filters, is to apply a window function to the filter tap coefficients [2]. Coefficients affecting the higher frequencies are scaled down to reduce the ripple in the stop band. This can be done as follows:

(Eq. S4)

where w[k] are the window scale factors, h[k] are the original tap coefficients, and are the windowed tap coefficients. The resulting coefficients may now be used in place of the original ones. An unwanted side effect of windowing, however, is the sacrifice of a sharp roll-off at the cutoff frequency.

So, the design process is to pick the desired frequency response, H(f), and then calculate the tap coefficients (Eq. S3). The actual frequency response will only approximate the desired response because the number of filter taps is finite. Optionally, a window function may then be applied to the filter tap coefficients. The final step is to plot the actual frequency response, H(f), using Eq. S2b to make sure the resulting response is acceptable. Lousy responses can be tweaked using different windowing schemes.