About dsp
DSP is a reference skill for implementing real-time audio processing in C/C++. It serves developers building audio algorithms and processing loops, with topic-specific guides for filters, effects, synthesis, analysis, and optimization.
Key features
- 01Cover filters and parameter smoothing
- 02Reference delay, reverb, and compressor techniques
- 03Explain oscillators and waveform synthesis
- 04Cover FFT, detection, and audio analysis
- 05Address real-time thread safety and optimization
Use cases
- 01Implement audio filters in C/C++
- 02Develop reverb, compression, or distortion effects
- 03Build synthesizers and waveform generators
- 04Optimize real-time audio processing code
Install
Copy the command and run it in a terminal.
npx skills add https:/ / github.com/ shortwavlabs/ agent-skills --skill dspAfter installing, type/dspin Claude Code to confirm it loaded.
Bundled files
References and scripts installed along with SKILL.md.
agents/openai.yamlreferences/analysis.mdeffects.mdfilters.mdsynthesis.mdutilities.mdDetails
From the project READMEDSP — Digital Signal Processing for Audio
A comprehensive reference for implementing real-time audio DSP algorithms in C/C++. Derived from the musicdsp.org community archive covering two decades of practitioner knowledge.
When to Use This Skill
- Implementing audio filters, effects, synthesizers, or analyzers in C/C++
- Writing
processBlock(),process(), or sample-by-sample DSP loops - Designing biquad coefficients, Moog ladder filters, or state variable filters
- Building delay lines, reverbs, compressors, waveshapers, or stereo processors
- Generating bandlimited waveforms, noise, or envelopes
- Optimizing audio code with fast math approximations or denormal prevention
For circuit-accurate emulation of a specific analog circuit (matching a schematic or SPICE reference), load circuit-to-dsp as well: it decides structure, solver, integrator and rate from measured error; this skill supplies the building blocks.
Architecture
The skill is organized into domain-specific references. Read the relevant file(s) for the task at hand:
| Reference | Coverage | When to read |
|---|---|---|
references/filters.md | Biquad/RBJ, Moog ladder, SVF, FIR, DC block, formant, parameter smoothing, crossover | Any filter implementation |
references/effects.md | Delay, reverb, compressor/limiter, phaser/wah, waveshaper/distortion, lo-fi, stereo, convolution | Any audio effect |
references/synthesis.md | Oscillators, bandlimited waveforms, FM/PM, DSF, noise, envelopes, Chebyshev waveshaping, LFOs | Any sound generation |
references/analysis.md | FFT, DFT, Goertzel, Walsh-Hadamard, envelope following, beat detection, LPC, limiting | Spectral analysis, detection |
references/utilities.md | Fast math (exp, log, sin, sqrt), interpolation, clipping, denormals, dithering, MIDI conversion, parameter mapping, benchmarking, lock-free FIFO | Performance optimization, conversion, audio safety |
Implementation Principles
These principles apply across all domains:
Sample Rate Independence
Always derive coefficients from the sample rate. Never hard-code values that assume 44.1 kHz.
// Coefficient from frequency and sample rate
float w0 = 2.0f * M_PI * cutoffHz / sampleRate;
Denormal Prevention
Floating-point denormals (subnormal numbers near zero) cause massive CPU stalls on x86. Add a tiny offset to state variables:
static constexpr float kDenormal = 1e-24f;
// In process loop:
state += kDenormal;
Alternatively, flush-to-zero compiler flags (-ffast-math on GCC/Clang) handle this at the CPU level.
Parameter Smoothing
Never change filter coefficients or gain values instantaneously — this causes clicks. Smooth parameters with a one-pole lowpass:
// Time-based smoothing coefficient
float a = expf(-2.0f * M_PI / (smoothTimeMs * 0.001f * sampleRate));
// Per sample:
smoothedValue = a * smoothedValue + (1.0f - a) * targetValue;
Audio Thread Safety
The process callback must never allocate memory, take locks, or call blocking OS functions. Pre-allocate all buffers, use lock-free communication for parameter updates, and avoid virtual dispatch in hot loops.
Bilinear Transform / Prewarping
Most digital filters are derived from analog prototypes via the bilinear transform. The key mapping:
w0 = 2 * pi * fc / Fs
For higher accuracy at high frequencies, apply frequency prewarping:
wa = 2 * Fs * tan(w0 / 2)
Code Conventions
All code examples in this skill use C/C++ with these conventions:
floatfor audio samples (32-bit),doublefor coefficient calculationsampleRateorsrfor sample rate in HzM_PIfor pi (define as#ifndef M_PI ... #endiffor portability)- Processing functions take input sample and return output sample
- State variables are class members (not globals)
- All frequencies in Hz unless explicitly noted otherwise