DSP Workshop

Digital Signal Processing: from math to metal

Welcome to DSP Workshop, where we take digital signal processing from theory to embedded implementation.

This is a workshop, not a textbook. It covers fundamentals with care, builds working Python prototypes, and shows how the same algorithms land on real microcontrollers. Open questions are flagged, not papered over.

Figure 1: A bat sends out an FM chirp and listens for echoes that come back buried in noise. Matched filtering compresses each echo into a sharp peak at the right range: a faint moth at 0.6 m, a branch at 1.5 m. One of the techniques you’ll learn here.
New to DSP?

Start with Chapter 1: Signals and sampling (no prior DSP knowledge needed, just calculus and basic Python). By Chapter 6 you’ll be designing digital filters from scratch.

Basics

A twelve-chapter learning path through the foundations, meant to be read in order, and it runs in two movements.

The first six chapters are the theory a filter design rests on: sampling, discrete-time systems, noise, the z-domain, the frequency domain, and filter design itself. By the end of them you are designing filters from a specification rather than copying coefficients.

The remaining six are about making a design real, and they are where the workshop starts earning its subtitle: filter structures and what finite arithmetic does to them, smoothing, biquads, multirate, convolution and correlation, closing with DSP on a microcontroller, the cost model behind every embedded page on this site. Alongside the path sit a few applied techniques and an interactive pole-zero explorer.

Chapters 1 to 6 each have 18 to 21 practice problems with solutions, capped by an end-to-end capstone project: Exercises

Topics

Explorations of specific DSP problems, some threaded into guided arcs and some standing alone: theory plus, for nearly all of them, a clean, importable Python module with tests. Topics marked [HW] include embedded C/C++ implementations, by default for the ESP32-S3 and STM32F4 (NUCLEO-F446RE) pair; some pages range wider, from an 8-bit AVR to a Cortex-M33 with an NPU, where crossing capability tiers is itself the lesson.

Where to start. Learning this material, take one of the three guided arcs below and read it in order; each threads its topics with a why-this-order map, so you are never guessing what to open next. Here to see what the workshop can do, go to the voice pitch estimator: one complete instrument, theory through Python to hardware. Hunting a specific technique, skip to the full topic index.

  • Estimation & detection: a guided arc on the two things a measurement in noise can produce, a number or a verdict. What the theory says is achievable, then instruments (tone tracker, lock-in, CFAR detector, drift monitor, direction finder) each priced against that limit [HW]
  • Noise & stochastic processing: a guided arc that treats noise as a subject rather than a nuisance: where it comes from, how to measure it, how to build it to a specification, and when adding more of it actually helps [HW]
  • Feature extraction: a guided arc on reducing a signal to a handful of numbers, from the STFT front end down to statistics cheap enough for an 8-bit part [HW]
  • A voice pitch estimator: the estimation arc’s capstone, listed on its own because it is the site in miniature: a speaking-voice pitch tracker from bandpass front end through cepstral readout to a calibrated voicing decision, built for speech-therapy feedback and shipped on an ESP32 wearable prototype [HW]
  • The full topic index: every topic page, with the arcs unpacked into their members and the standalone topics listed separately

About

Created by Jeroen Veen from years of teaching and practising signal processing. Everything here runs: the Python is importable, the experiments are reproducible, and the embedded code targets real hardware you can buy.

Found an error, or have a question? Use the “Report an issue” link on any page, or get in touch. Corrections and questions are welcome: this is a workshop, not a finished textbook.

Built with Quarto.