## Digital Filters

• Idea: get signal into system as close to Nyquist as possible

• Do filtering mostly in software (or digital hardware)

• Can build much better filters

## Aside: Number Representation

• How shall we represent samples for this kind of processing?

• Obvious choice: integers at sampling resolution

• Can get weird for 24-bit, so promote to 32?

• Math is tricky: overflow etc. Promote to next higher size?

• What resolution to output? May have more or less precision than started with

• Fast

• Obvious choice: floating-point

• Scale input to -1..1 or 0..1

• 32 or 64 bit? (32-bit conveniently has 24 bits of precision)

• Issues of precision and resolution mostly go away (Inf and NaN).

• Fast with HW support, slow otherwise especially on 8-bit hardware

• Less obvious choice: "fixed-point"

• Treat integer as having implicit fixed "binary point"

  .1001011000000001
1.001011000000001
-.001011000000001
10010110.00000001

• Fiddly, especially for languages that don't allow implementing a fixed-point type with normal arithmetic

• Slightly slower than integer: must keep the decimal in the right place

• Typical used on integer-only embedded systems, "DSP chips"

• Strongly suggest 64-bit floating point for this course: just say no to a bunch of annoying bugs

## DFT Filters

• Obvious approach: Convert to frequency domain, scale the frequencies you don't want, convert back

• For real-time filter output, this in principle means doing a DFT and inverse DFT at every sample position, which seems…expensive to get one sample out

• Can cheat by sliding the window more than one, but you will lose time information from your signal

• Also, DFT has ripple: frequencies between bin centers will be slightly lower than they should be, since they are split between two bins and the sum of gaussians there isn't quite 1

• Frequency resolution can be an issue: a 128-point FFT on a 24KHz sample will produce roughly 200Hz bins, so the passband is going to be something like 400Hz, which is significant

## FIR and IIR Filters

• We characterize filters in terms of impulse response: what if you have an input sample consisting of a single pulse of amplitude 1 and then zeros forever?

• Taking a look at the DFT sum, our DFT filter will treat an impulse anywhere in its window identically (linear time-invariant). When the pulse leaves the window, the FFT will then say 0 forever

• We call this Finite Impulse Response: an impulse presented to the filter will eventually go away

• A trick that we will explore is to actually use past filter outputs as well as inputs to decide the next filter output

• In this case, an impulse will make it into the outputs, which means that it will be looped back into the inputs: Infinite Impulse Response

• Of course, the IIR filter should reduce the amplitude of the impulse over time, else badness. Such a filter is a stable filter

• IIR filters have cheap implementation (analog or digital) per unit quality, but:

• Are less flexible

• Are harder to design

• Have lots of issues with stability, noise, numerics