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–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.