A finite impulse response filter forms each output from a finite number of input samples:

y[n]=∑k=0M−1h[k]x[n−k]y[n] = \sum_{k=0}^{M-1} h[k]x[n-k]

The coefficients h[k]h[k] are also the filter’s impulse response. That makes them a useful bridge between the time-domain implementation and the frequency-domain behavior.

Evaluate the response on the unit circle

The transfer function of an FIR filter is a polynomial in z−1z^{-1}:

H(z)=∑k=0M−1h[k]z−kH(z) = \sum_{k=0}^{M-1} h[k]z^{-k}

For frequency response, evaluate it at z=ejωz = e^{j\omega}:

H(ejω)=∑k=0M−1h[k]e−jωkH(e^{j\omega}) = \sum_{k=0}^{M-1} h[k]e^{-j\omega k}

Its magnitude describes how much a sinusoid at angular frequency ω\omega is scaled. Its phase describes the corresponding phase shift.

A two-tap example

Take h[0]=h[1]=12h[0] = h[1] = \frac{1}{2}. Then

H(ejω)=12(1+e−jω)=e−jω/2cos⁡(ω/2).H(e^{j\omega}) = \frac{1}{2}(1 + e^{-j\omega}) = e^{-j\omega/2}\cos(\omega/2).

The magnitude is ∣cos⁡(ω/2)∣|\cos(\omega/2)|, so low frequencies pass with larger gain than frequencies near ω=π\omega=\pi. This is a simple averaging filter, not a sharp low-pass design.

What the math leaves out

An implementation also needs choices about coefficient precision, sample representation, rounding, saturation, and clocked architecture. Those details can change the realized response. A useful workflow compares a fixed-point or hardware model with a higher-precision reference and makes the tolerance explicit.

The equations explain the ideal linear filter. The implementation and its tests explain how closely a particular system follows that model.