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 learning path through the foundations of DSP, designed to build intuition step by step. By the end you’ll design, implement, and evaluate digital filters for real sensor signals.

Each chapter has 18 to 21 practice problems with solutions: Exercises

Explorations

Standalone explorations of specific DSP problems, each with theory, clean Python code, and runnable experiments. Topics marked [HW] include embedded C/C++ implementations for real microcontrollers, from ESP32-S3 and STM32 to an 8-bit AVR and a Cortex-M33 with an NPU.

  • Estimation basics: what makes one estimator better than another: bias, variance, MSE, the √N law, weighted least squares, and the Cramér-Rao speed limit
  • Outlier detection: streaming anomaly detection using robust statistics
  • Noise whitening: characterising and whitening 1/f^α noise
  • Noise & stochastic processing: a seven-topic guided arc: where noise comes from, how to measure it, how to build it, and when adding more of it actually helps [HW]
  • Adaptive filtering: LMS, NLMS, and RLS for system identification and noise cancellation [HW]
  • PSO for filter design: particle swarm optimization for the non-convex IIR designs where gradients get stuck, plus on-device adaptation [HW]
  • Finite word-length effects: quantization, round-off noise, coefficient sensitivity, and limit cycles in fixed-point filters
  • Short-Time Fourier Transform: the sliding-window DFT behind every spectrogram, the resolution trade-off, and overlap-add reconstruction, plus a real-time block FFT on the metal [HW]
  • Spectral features: a spectrum’s shape in five numbers (centroid, spread, rolloff, flux, flatness), the cheap front end of classifiers, all from the same FFT bins on the metal [HW]
  • Wavelets: when one window size is not enough, a transform whose tiles change shape with frequency, from the scalogram to a filter-bank DWT, denoising, and integer lifting on the metal [HW]
  • Mel-frequency cepstral coefficients: the speech feature front end, from pre-emphasis through the mel filterbank to the DCT, and a training-free wakeword detector on the metal [HW]
  • Statistical features: summarising a window of samples with mean, variance, RMS, skew, kurtosis, and ZCR, the cheapest feature front end there is, and an on-device activity classifier and voice gate from an 8-bit AVR up [HW]
  • Feature extraction: a five-topic guided arc: STFT → spectral features → wavelets → MFCC → statistical features, in that order, with a why-this-order thread [HW]
  • The Goertzel algorithm: one DFT bin from a three-line filter, and the DTMF decoder it powers [HW]
  • Matched filtering: detecting known signals in noise, from bat echolocation to LIGO [HW]
  • Model-based filtering: optimal estimation from signal and noise statistics, from the Wiener filter to a Kalman tracker on the metal [HW]
  • Beamforming: direction-of-arrival estimation with sensor arrays, inspired by the scorpion [HW]
  • Gammatone filters: the cochlea as a bank of bandpass filters, one auditory channel per four biquads [HW]
  • Gabor filters: oriented visual-cortex receptive fields, from the uncertainty principle to 2-D convolution on hardware [HW]
  • Pitch detection: estimating fundamental frequency from autocorrelation to real-time embedded systems [HW]
  • Empirical mode decomposition: data-driven decomposition into intrinsic mode functions
  • PPG signal processing: a complete DSP pipeline for heart rate extraction, case study with ESP32 [HW]

About

Created by Jeroen Veen from decades 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.