Skip to main content

TODO: describe your project.

Project description

doppler

Dead-simple, ultra-fast digital signal processing.

CI Docs PyPI Python License: MIT C99 Rust uv Ruff

doppler is a lean C99 signal processing library built for one goal: maximum throughput with minimum friction — from any language. The full DSP stack lives in one portable core with paper-thin Python bindings and a Rust FFI. No runtime surprises, no framework lock-in.

What's inside

  • NCO / LO — 32-bit phase accumulator, 2¹⁶-entry LUT, AVX-512 batch generation, FM ctrl port
  • FIR filter — AVX-512 complex taps, CI8/CI16/CI32/CF32 input types
  • FFT — 1D and 2D, selectable backend (FFTW or pocketfft)
  • Polyphase resampler — continuously-variable rate, built-in 4096-phase × 19-tap Kaiser bank (60 dB)
  • Halfband decimator — dedicated 2:1 decimator exploiting halfband symmetry; 375 MSa/s at 60 dB
  • DDC / DDCR — digital down-converter for complex and real ADC input; Architecture D2 for ~2× savings on real input
  • Accumulator — F32 and CF64 running accumulators with configurable window
  • Delay — CF64 sample delay line
  • Signal streaming — low-latency ZMQ transport (PUB/SUB, PUSH/PULL, REQ/REP)
  • Circular buffers — double-mapped ring buffers for zero-copy, lock-free IPC (F32/F64/I16)
  • Multi-language — clean C ABI; Python bindings for all modules and Rust FFI

Benchmarks

Throughput depends heavily on hardware, compiler, and SIMD availability. On a Ryzen 7 AI 350 (16 GB, -O2), typical figures range from hundreds of MSa/s (FFT, FIR complex, resampler) to tens of GSa/s (raw NCO phase accumulator).

To measure on your machine:

make bench              # C + Python; saves JSON to benchmarks/history/
make build              # then run C binaries directly, e.g.:
./build/native/src/fir/bench_fir_core
./build/native/src/hbdecim/bench_hbdecim_core
./build/native/src/resamp/bench_resamp_core

Historical Python benchmark snapshots are in benchmarks/history/.

Quick example

C:

#include "fft/fft_core.h"
#include <complex.h>

dp_fft_t *fft = dp_fft_create(1024, -1, 1);
dp_cf32_t in[1024], out[1024];
/* ... fill in[] ... */
dp_fft_execute_cf32(fft, in, 1024, out);
dp_fft_destroy(fft);

Python:

import numpy as np
from doppler.spectral import FFT

x = np.random.randn(1024).astype(np.complex64)
spectrum = FFT(1024).execute(x)

DDC (tune a carrier to baseband):

from doppler.ddc import DDC
import numpy as np

ddc = DDC(norm_freq=-0.1, num_in=4096, rate=0.25)
x = np.random.randn(4096).astype(np.complex64)
y = ddc.execute(x)   # CF32, len ≈ 1024

Documentation

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

Document Contents
Quick Start Build, install, run the examples (Docker quickstart included)
Build Guide CMake options, platform notes, Python setup, Docker details
Architecture Design overview and layer diagram
Examples: C C code examples — FFT, FIR, NCO, streaming
Examples: Python Python code examples
Examples: Streaming PUB/SUB and PUSH/PULL examples

| CLAUDE.md | Development notes and project context (for contributors) |

Build

make          # build (Linux/macOS; MSYS2 on Windows)
make test     # run CTest suite

Or with Python bindings:

make pyext && uv sync

See Build Guide for platform-specific instructions and all CMake options.

Licensing

The doppler source code is MIT-licensed.

If built with FFTW support (default), the resulting binary links against FFTW, which is licensed under the GNU General Public License (GPL). In this case, the distributed binary is covered by the GPL.

If built with -DUSE_FFTW=OFF, the pocketfft backend is used instead. pocketfft is BSD-3-Clause-licensed (see POCKETFFT_LICENSE) which is compatible with the MIT-license and so the resulting binary remains MIT-licensed with BSD-3-Clause licensed FFT features.

See Build Guide for details and the installed LICENSE files.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

doppler_dsp-0.3.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (732.3 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.24+ x86-64manylinux: glibc 2.28+ x86-64

doppler_dsp-0.3.1-cp313-cp313-macosx_14_0_arm64.whl (579.1 kB view details)

Uploaded CPython 3.13macOS 14.0+ ARM64

doppler_dsp-0.3.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (732.3 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.24+ x86-64manylinux: glibc 2.28+ x86-64

doppler_dsp-0.3.1-cp312-cp312-macosx_14_0_arm64.whl (579.1 kB view details)

Uploaded CPython 3.12macOS 14.0+ ARM64

File details

Details for the file doppler_dsp-0.3.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for doppler_dsp-0.3.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 7b31be268cefba2feff411a5c6c0684463957544ba34616bce54bd1a2ccdc072
MD5 3c81bd16144f1039d5345898405e971f
BLAKE2b-256 2b14f4b0b83fe881f1c898751dee8e85e3e5b41c1539da554a4735a563968e0b

See more details on using hashes here.

Provenance

The following attestation bundles were made for doppler_dsp-0.3.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl:

Publisher: release.yml on doppler-dsp/doppler

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file doppler_dsp-0.3.1-cp313-cp313-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for doppler_dsp-0.3.1-cp313-cp313-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 629ff64713e98a1d706ae659c4e878044b3604a1e6c047b651ccfee34f6a076b
MD5 cab4c852416a11937da5222abf61ebcc
BLAKE2b-256 ff58afd083249439fcb96da8c6847450e72d89a8d17c89822dce24b07171769b

See more details on using hashes here.

Provenance

The following attestation bundles were made for doppler_dsp-0.3.1-cp313-cp313-macosx_14_0_arm64.whl:

Publisher: release.yml on doppler-dsp/doppler

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file doppler_dsp-0.3.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for doppler_dsp-0.3.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 f4c47f1bd72a00aa9af208dfdbf546ed50d63c7d190079a6c9b0276c9c9c90d9
MD5 f6e798b953bbd0dc000dbcb666f65a72
BLAKE2b-256 830bcec717bd4a3cde6bd2a5291853d61cf2fbe4c2f9e6be658885ba45a4418e

See more details on using hashes here.

Provenance

The following attestation bundles were made for doppler_dsp-0.3.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl:

Publisher: release.yml on doppler-dsp/doppler

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file doppler_dsp-0.3.1-cp312-cp312-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for doppler_dsp-0.3.1-cp312-cp312-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 1c2c53c9c6e53252cf88205ea2b7c3c8beb90f7ceb37e3c72a7129a4341919d1
MD5 97cdb9e5d944ee468d0bac25c76b1c9e
BLAKE2b-256 b860592a1841f59e1df9fd86af22b2c5781db4fc0fb6151f1c3adee859243e6e

See more details on using hashes here.

Provenance

The following attestation bundles were made for doppler_dsp-0.3.1-cp312-cp312-macosx_14_0_arm64.whl:

Publisher: release.yml on doppler-dsp/doppler

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page