Recipes¶
Copy-paste starting points. Every flag is documented in Waveforms, Output & containers, and Scenes.
# A clean tone at +100 kHz (1 MHz Fs), 1 Msample, 16-bit I/Q to a file
wfmgen --type tone --freq 1e5 --fs 1e6 --count 1000000 --sample-type ci16 -o tone.ci16
# Noisy BPSK at 6 dB Eb/No, as CSV for quick inspection
wfmgen --type bpsk --snr 6 --snr-mode ebno --count 2000 --file-type csv -o bpsk.csv
# A band-limited WCDMA-style QPSK downlink (RRC roll-off 0.22)
wfmgen --type qpsk --sps 8 --pulse rrc --rrc-beta 0.22 --count 100000 -o wcdma.cf32
# A length-9 MLS, primitive polynomial chosen automatically
wfmgen --type pn --pn-length 9 --sps 1 --file-type csv -o pn.csv
# Your own constellation (e.g. 16-QAM) from a raw cf32 file
wfmgen --type symbols --symbols-file qam16.cf32 --sps 8 --pulse rrc -o qam.cf32
# A scenario: tone burst, gap, then QPSK — recorded for reproducibility
wfmgen --from-file scenario.json --record run.json --file-type blue -o scene.blue
# Endless bursts, each at a random Doppler offset and a jittered gap
wfmgen --type bpsk --fs 1e6 --sps 8 --pn-length 7 \
--freq 11200:12800 --count 8192 --off 4000:5600 \
--continuous --realtime -o stream.cf32
# Stream continuous QPSK to ZMQ for a live receiver, paced to real time
wfmgen --type qpsk --snr 10 --continuous --realtime --output zmq://tcp://*:5555
The three faces of wfmgen¶
wfmgen is generated by just-makeit in three faces that accept the same flags
and produce byte-identical output:
wfmgen --type qpsk --count 4096 -o out.iq # 1. installed C-backed console script
python -m doppler.wfm.cli --type qpsk --count 4096 # 1b. same, as a module
python wfmgen.py --type qpsk --count 4096 # 2. PEP 723 script (uv run wfmgen.py)
./build/wfmgen --type qpsk --count 4096 # 3. standalone C binary
See also¶
- Gallery: wfmgen — one engine, every waveform — the spectra/constellations behind each type.
- Python: Waveform Generator API — the full class reference.
- Python: Source (NCO / LO / AWGN) — the building-block primitives the engine composes.