Skip to content

doppler — signal, shifted

Practical, portable, performant digital signal processing.

CI Docs Latest release License

PyPI Python versions Wheels: Linux, macOS, Windows .deb packages .rpm packages Docker images on ghcr.io

C99 core Rust FFI uv Ruff

doppler is a C99 DSP library — NCO, FIR, FFT, polyphase resampling, DDC, AGC, carrier and burst acquisition, DSSS receivers, convolutional and Reed-Solomon coding, CCSDS framing and more — with file, buffer, and NATS-based streaming, and a scenario-driven waveform generator (wfmgen) with byte-identical CLI/Python/C parity. Python and Rust wrap the same C core — no second implementation, no divergence, full SIMD throughput from any language.

New here? Start with Start Here — a one-page map from "what are you trying to do" to the right doc.

Navigate — Python Quick Start · Architecture · Gallery · Examples · Guides · Waveform Generator · Design · Contributing

API Reference — Full Python + C API index


Why it's built this way

Every algorithm lives in C exactly once. The Python layer is type conversion and lifetime bridging — a few hundred lines of glue, not a reimplementation. Bugs get fixed once, benchmarks reflect real hardware, and a C transmitter talks to a Python subscriber without surprises.

Performance

Measured throughput, per build and per machine, is on Benchmarks — generated by make bench-docs rather than quoted here, so it cannot go stale. make bench measures your hardware.

Try it

pip install doppler-dsp
from doppler.spectral import FFT
import numpy as np

x = np.random.randn(1024).astype(np.complex64)
X = FFT(1024).execute_cf32(x)
print(f"FFT: {len(x)} samples in -> {X.shape[0]} complex64 bins out")

Using C?

jbx get-doppler gets libdoppler.a/.so and the headers in one command — see C Quick Start.

Everything else — install options, the waveform generator, streaming, building from source — is in Python Quick Start.

Docs

Full docs: doppler-dsp.github.io/doppler

Licensing

MIT. The core C library is pure C99 and links -lm and -lpthread. Its FFT uses the vendored pocketfft (BSD-3-Clause) for double precision and arbitrary sizes, and the vendored PFFFT (Pommier/FFTPACK, BSD) for the native single-precision SIMD path. The optional NATS stream component (libdoppler_stream) vendors nats.c (Apache-2.0) — it too is pure C99, so no C++ toolchain is needed anywhere in the build.