Digital Filter Design
FIR "Windowing" Filters
In general, simplest low-pass filters: take a "window" of past samples, then "round off the corners" by multiplying by some symmetric transfer function
There are many window functions, each with their own slightly different properties as filters: simple things like triangular, plausible things like cosine, and weird things like Blackman, Hamming, Hanning
Note that windowing is also how we deal with edge effects of DFT: we make the signal have period equal to the DFT size by applying a window, but this also low-passes and changes the signal
FIR Chebyshev "Remez Exchange" Filters
There's a fancy mathematical trick for approximating a given desired filter shape with high accuracy for a given filter size
Involves treating filter coefficients as coefficients of a Chebyshev Polynomial, then adjusting the coefficients until maximum error is minimized
Probably not something you want to do yourself, but there are programs out there that will do it for you
IIR Filters
Can get much better response per unit computation by feeding the filter output back into the filter (?!)
In some applications, a 12th-order IIR filter can replace a 1024th-order FIR filter
Design of these filters really wants a full understanding of complex analysis, outside the scope of this course
Fortunately, many standard filter designs exist: Chebyschev, Bessel, Butterworth, Biquad, etc
Basic operation is the same as FIR, except that you have to remember some output:
$$ y[i] = \frac{1}{k+m} \left(x[i-k \ldots i] \cdot a[k \ldots 0] + y[i-m-1 \ldots i-1] \cdot a(0 \ldots m)\right) $$
Always use floating point, as intermediate terms can get large / small
Really, just look up a filter design and implement it: probably too hard to "roll your own"