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.4-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (744.9 kB view details)

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

doppler_dsp-0.3.4-cp313-cp313-macosx_14_0_arm64.whl (594.7 kB view details)

Uploaded CPython 3.13macOS 14.0+ ARM64

doppler_dsp-0.3.4-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (752.3 kB view details)

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

doppler_dsp-0.3.4-cp312-cp312-macosx_14_0_arm64.whl (594.8 kB view details)

Uploaded CPython 3.12macOS 14.0+ ARM64

File details

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

File metadata

File hashes

Hashes for doppler_dsp-0.3.4-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 4400f53083e465ad3e51b9dc8b27c26a01ce878394f2886cfbd280a79a6e035c
MD5 a1fabf968865ec86744fe3fc707187a9
BLAKE2b-256 9f3f4d984ed58d5d6262ac405b00a05daa073a1f0d1cfd5f5c383b8048df97ce

See more details on using hashes here.

Provenance

The following attestation bundles were made for doppler_dsp-0.3.4-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.4-cp313-cp313-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for doppler_dsp-0.3.4-cp313-cp313-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 d7ad7d6bebb8fc90a01b51ce401daa40a0de12e3af1410a17af5d61be457c0fa
MD5 b96ed4e95d6f902a8d1cfe40dbd8b025
BLAKE2b-256 eacec04014c79518e995081a5e5272a9ded060deb98653129e0c2aeeff1341d9

See more details on using hashes here.

Provenance

The following attestation bundles were made for doppler_dsp-0.3.4-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.4-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for doppler_dsp-0.3.4-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 8cdcaf73165c6dac4e30b6f9d7eb26426b606784e60d9333a258bc2a1e716e83
MD5 8a7a01244648360bb7ae9251e7cb2f9d
BLAKE2b-256 419b33e3371e80c0c1eb15badad664c22e96cdd84017d549b233b03642b5c8bb

See more details on using hashes here.

Provenance

The following attestation bundles were made for doppler_dsp-0.3.4-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.4-cp312-cp312-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for doppler_dsp-0.3.4-cp312-cp312-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 bc17cb1e56d4b932f5f62539907c17c12bebdb6894452f3564aacde740d64017
MD5 0ba81492f33503f69dc1f478bfdbdb3f
BLAKE2b-256 36ec23a1cc151f2b30e45076c7cdbd6ada339f8e7aa95ac38751f4db84f880ec

See more details on using hashes here.

Provenance

The following attestation bundles were made for doppler_dsp-0.3.4-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