Skip to content

Quick Start

Install

pip install doppler-dsp

That's it. The wheel bundles all native dependencies — no system libraries required.

Optional extras:

pip install doppler-specan    # live spectrum analyzer web UI
pip install doppler-cli       # compose / Dopplerfile pipeline CLI

Signal processing

NCO — generate a complex tone

from doppler import Nco

with Nco(0.25) as nco:        # normalised frequency: 0.25 → Fs/4
    iq = nco.execute_cf32(8)
    print(iq)
    # [1.+0.j  0.+1.j  -1.+0.j  0.-1.j ...]

FFT

from doppler.fft import fft
import numpy as np

x = np.random.randn(1024) + 1j * np.random.randn(1024)
X = fft(x)                    # complex spectrum, same length

FIR filter

from doppler import FirFilter
import numpy as np

filt = FirFilter.lowpass_cf32(cutoff=0.1, num_taps=63)
y = filt.execute(x.astype(np.complex64))

Resample

from doppler.resample import HalfbandDecimator

decim = HalfbandDecimator()
y = decim.execute(x.astype(np.complex64))  # 2:1 decimation

Streaming

Doppler streams IQ data over ZMQ. Transmit and receive on the same machine or across a network — the API is identical.

Publisher (Python)

from doppler.stream import Publisher
import numpy as np

pub = Publisher("tcp://*:5555")

samples = np.ones(1024, dtype=np.complex64)
pub.send(samples, sample_rate=1e6, center_freq=2.4e9)

Subscriber (Python)

from doppler.stream import Subscriber

sub = Subscriber("tcp://localhost:5555")

msg = sub.recv()
print(f"Received {len(msg.samples)} samples @ {msg.sample_rate/1e6:.1f} MHz")

C transmitter → Python subscriber

Build the C examples once, then mix and match:

make          # builds ./build/c/transmitter, receiver, etc.

# Terminal 1
./build/c/transmitter tcp://*:5555 cf32

# Terminal 2 (Python)
python - <<'EOF'
from doppler.stream import Subscriber
sub = Subscriber("tcp://localhost:5555")
while True:
    msg = sub.recv()
    print(f"seq={msg.seq}  samples={len(msg.samples)}")
EOF

Spectrum analyzer

doppler-specan opens a live FFT display in your browser.

Demo mode (no hardware needed):

doppler-specan --source demo

From a live IQ stream:

doppler-specan --source socket --endpoint tcp://localhost:5555

The web UI is served at http://127.0.0.1:8765 by default. See Spectrum Analyzer for configuration options.


Pipeline CLI

doppler compose wires blocks into a processing pipeline defined in a YAML file.

# Create a named pipeline file
doppler compose init --name my_pipeline

# Edit my_pipeline.yaml, then start it
doppler compose up --file my_pipeline.yaml

# Monitor running blocks
doppler ps
doppler logs

See CLI & Pipelines and Dopplerfile for writing custom blocks.


Build from source

If you need the C library, examples, or Rust FFI bindings:

Dependencies:

=== "Ubuntu / Debian"

```bash
sudo apt-get install \
    build-essential cmake pkg-config \
    libzmq3-dev libfftw3-dev python3-dev
```

=== "macOS"

```bash
brew install cmake zeromq fftw
```

=== "Windows (MSYS2 UCRT64)"

```bash
pacman -S mingw-w64-ucrt-x86_64-gcc \
          mingw-w64-ucrt-x86_64-cmake \
          mingw-w64-ucrt-x86_64-zeromq \
          mingw-w64-ucrt-x86_64-fftw make
```

Build:

git clone https://github.com/doppler-dsp/doppler
cd doppler
make                      # C library + examples
make pyext                # Python extensions (requires uv)
make test-all             # C + Python + Rust test suites

See Build & Install for CMake options, Docker, and platform-specific notes.


Next steps