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
Each chapter has 18–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.
- Outlier detection: streaming anomaly detection using robust statistics
- Noise whitening: characterising and whitening 1/f^α noise
- 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]
- Matched filtering: detecting known signals in noise, from bat echolocation to LIGO [HW]
- Beamforming: direction-of-arrival estimation with sensor arrays, inspired by the scorpion [HW]
- Biquad filters: the universal building block for IIR filtering [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]
- Smoothing: moving averages, Savitzky-Golay, exponential, and kernel methods [HW]
- Detrending: removing slow drifts for stationarity and clean spectra
- Zero-phase filtering: forward-backward filtering without phase distortion
- Zero-crossing detection: frequency estimation, event detection, and hysteresis
- Multirate systems: decimation, interpolation, polyphase decomposition, and CIC filters [HW]
- Pitch detection: estimating fundamental frequency from autocorrelation to real-time embedded systems [HW]
- Pole-zero explorer: interactive tool for exploring how pole and zero placement shapes the frequency response
- 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.