Digital Filters

Article by:
Date Published:
Last Modified:


Child Pages

  • Exponential Moving Average (EMA) Filters
  • Kalman Filter
  • Windowed Moving Average Filters
  • Overview

    Digital filters are signal filters which act on discrete, sampled data – as opposed to analogue filters which act on continuous signals such as fluctuating voltages.

    For information on the popular moving average (windowed) filters (all with a finite impulse response, FIR), including frequency responses and performance implications, see the Windowed Moving Average Filters page.

    For info on the exponential moving average IIR filter (non-windowed), including the impulse response, see the Exponential Moving Average (EMA) Filter page.



    Casual filters are filters whose present output does not depend on future input. Non-casual filters are those whose present output does depend on future input. Real-time filters must be casual, but filters which are either time delayed or do not act in the time domain can be non-casual.

    Cycles Per Sample

    Cycles per sample is a convenient way of expressing a frequency w.r.t. the sample frequency. It is found by dividing the frequency in Hz (cycles/second) by the sampling rate in samples per second (samples/second), giving you units of cycles/sample.

    Difference Equation

    A difference equation is the core equation of a filter which shows how the next output value is calculated based on past and present input and output values. For example, the difference equation for an exponential moving average filter is:

    \begin{align} y_i = y_{i-1} \cdot (1 - \alpha) + x_i \cdot \alpha \nonumber \end{align}

    Discrete Unit Sample Function

    The discrete unit sample function \(\delta[n]\) is the digital equivalent of the analogue impulse function (the analogue impulse function is infinitely thin, but has an area of 1). The discrete unit sample function has a value of 1 at sample 1, but is 0 everywhere else. It is defined as:

    \begin{align} \delta[n] = \begin{cases} 1 & n = 0 \\ 0 & n \neq 0 \\ \end{cases} \end{align}

    This function is used for finding the impulse response of digital filters. One example is using it to find the impulse response of the EMA filter.

    Converting From A Continuous Time-Domain To Normalised Discrete Time-Domain Frequency

    Remember, to map a continuous time-domain frequency to the discrete time-domain, use the following equation:

    $$ F = \frac{f}{f_s} $$

    \( F \) is the frequency in the discrete time-domain, in \(cycles/sample\)
    \( f \) is the frequency in the continuous time-domain, in \(Hz\) (or \(cycles/second\))
    \( f_s \) is the sample frequency in the continuous time-domain, in \(Hz\) (or \(samples/second\))

    Creating Digital Filters In Python

    Python is a great language for experimenting with digital filters. The popular numpy and scipy libraries provide a variety of functions to make it easy to create and visualize the behaviour of a digital filter.

    scipy.fftpack.fft(x) performs a discrete Fourier transform on the input data. Passing in a window (an array of the weighting at each sample in the window) will return an array of complex numbers.

    scipy.fftpack.fftshift() shifts the result from fft() so that the DC component is centered in the array.

    fftfreq() converts normalized frequencies into real frequencies.

    scipy.signal.freqz() calculates the frequency response of a digital filter. It expects the coefficients of the transfer function described as:

    \begin{align} H(z) &= \frac{Y(z)}{X(z)} \nonumber \\ &= \frac{b_0 + b_1 z^{-1} + b_2 z^{-2} + ... + b_m z^{-m}} {a_0 + a_1 z^{-1} + a_2 z^{-2} + ... + a_n z^{-n}} \\ \end{align}

    The order of these coefficients to freqz() is the reverse of what is standard in most places.



    Geoffrey Hunter

    Dude making stuff.

    Creative Commons License
    This work is licensed under a Creative Commons Attribution 4.0 International License .

    Related Content:


    comments powered by Disqus