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.
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.
- Signals and sampling
- Discrete-time systems
- Noise and SNR
- The z-domain
- The frequency domain
- Filter design
- Filter structures
- Smoothing
- Biquad filters
- Multirate systems
- Applied techniques: zero-phase filtering, zero-crossing detection, detrending
- Interactive: pole-zero explorer
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
- Estimating a sinusoid: amplitude, phase, and frequency of a tone in noise; why frequency accuracy improves as N^-3/2 rather than N^-1/2, and the threshold SNR where every estimator breaks [HW]
- 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.