Skip to content

Gallery

Worked examples across every doppler subsystem — each one a runnable script under src/doppler/examples/, grouped below by DSP domain. Most pages render a figure; run make gallery to regenerate every image, or run a single script directly (each page lists its command under Reproduce / Run it).

Looking for a runnable script that isn't a rendered walkthrough — LO, NCO, FFT, ring buffers, C programs, or the NATS streaming demo? Those live on the Examples page instead.

Sources & Waveforms

  • Waveform Generator — tone / PN / QPSK / BPSK from one declarative Synth.
  • Symbols: bring your own constellation — pi/4-QPSK and 16-QAM from an arbitrary complex stream.
  • Waveform Scenes — sum, add, headroom; a SoI under a CW interferer over one noise floor.
  • Waveform I/O — one capture written to raw / CSV / BLUE / SigMF and read back.
  • Waveform JSON Round-Trip--record a scene to JSON and replay it byte-identically.
  • Waveform Write — the shortest path from a Composer to a file and back.
  • WCDMA Carriers — four RRC channels measured with PSD and AccTrace.
  • Prepare Once, Sweep Many (Plan) — one declarative scene evaluated at many SNR operating points via the Plan stimulus engine.
  • One Cache Slot for a Whole Background Fieldbackground=True folds a static emitter population into a single pre-summed cache entry: 67x smaller, and the whole field becomes one overridable control.
  • A Crowded Band — twenty RRC carriers in one segment, prepared in parallel across cores; Plan.render(enable=...) thins them for free.
  • AWGN — complex Box-Muller noise, amplitude histogram, and flat PSD.
  • Doppler Channel — clock Doppler as an impairment: one ppm dilates the whole time base and shifts the carrier, so a code loop sees the rate error its carrier loop implies.

Filters & Resampling

Down-Conversion (DDC)

  • Real-input DDC — real passband in, complex baseband out, caller-owned buffer, thread-per-shard scaling.

Detection & Acquisition

  • Correlation — coherent integration, 2-D template matching, streaming CFAR.
  • Detection Curves — Pd vs SNR and dwell from closed-form Marcum Q.
  • Monte Carlo — 30,000-trial validation of the Marcum Q curves.
  • Lock Detection: Verify Counts — level + time hysteresis vs. a naive comparator on a marginal signal.
  • 2-D Acquisition — GPS/CDMA Doppler × code-phase search with Bonferroni-corrected CFAR.
  • DSSS Acquisition: Pd/Pfa — detection characterisation curves.
  • 5-Burst DSSS Link (wfmgen's 3 Faces) — every wfmgen production path feeding the same full receiver chain.
  • Streaming Async DespreaderDll(segments) PN-epoch despreader.
  • Full-Chain Lock-UpDll -> Costas -> SymbolSync cold-started with no code, carrier, or timing knowledge, watched over one shared Telemetry context.
  • DsssReceiver — the Composed Continuous DSSS ReceiverAcquisition -> Dll(segments) -> RateConverter -> MpskReceiver at real chip/symbol rates, collapsed into one DsssReceiver and one steps() call -- the despreader removes the code and an explicit resampler bridges it to a normal demodulator.
  • AsyncDsssReceiver: the SPEC Waveform — the packaged receiver decoding SPEC's own continuous async DSSS (CCSDS Gold-1023, 3.069 Mcps, 2700 bps) through physically-coupled clock Doppler, in both pass regimes (TCA-crossing ramp and ±50 kHz offset extremum), with the pre-despread carrier loop tracking the ramp and a binary symbol-lock indicator.
  • CarrierAcquisition: RRC Pulse Shaping — PSDMF residual-carrier estimation against an RRC-shaped BPSK stream, and why the psd_template override matters.

Synchronization Loops

Constellations & Receivers

Measurement

Quantization & Fixed-Point

  • ADC Quantisation — staircase resolution and noise floor across 3–8 bits.
  • Q15 vs UQ15 — bipolar vs offset-binary encodings of the same Q15 step.
  • cvt Quantization — the three cvt formats overlaid at identical noise floor.

Gain Control

  • AGC — closed-loop power controller with decimated and per-sample loop updates.

Telemetry