Lab 11.25 — Stock vs runtime external DDS-tone visibility sweep on RTL-SDR¶
Objective¶
Quantitatively compare DDS tone visibility on the RTL-SDR external monitor
across multiple tone offset frequencies, TX attenuation values, and operating
modes (stock-shell, runtime overlay, runtime with bridge_txrx_mux).
This lab consolidates the single-point DDS observations from Lab 11.24 into a reproducible sweep that can be committed as a reference evidence artifact.
Sweep design¶
For each combination of:
- tone offset Hz (default: 50 000, 200 000, 700 000);
- TX attenuation dB (default: -40 dB);
- mode (default: stock, runtime, runtime_bridge);
the script:
- configures the appropriate TX mode (stock DDS or runtime overlay DDS);
- sets the DDS tone offset and scale;
- captures a short RTL-SDR WAV;
- runs offline FFT analysis (via Block 9 reader);
- records peak frequency, peak amplitude, and noise floor.
Results are collected into a single JSON comparison table.
Files¶
| Path | Purpose |
|---|---|
blocks/block_11_integrated_sdr_project/python/lab_11_25_stock_vs_runtime_dds_tone_sweep.py |
multi-mode DDS tone sweep, JSON comparison table |
Run¶
python blocks/block_11_integrated_sdr_project/python/\
lab_11_25_stock_vs_runtime_dds_tone_sweep.py \
--center-frequency-hz 915000000 \
--sample-rate-hz 3840000 \
--tone-offsets-hz "50000,200000,700000" \
--tx-attenuation-db -40 \
--modes stock,runtime,runtime_bridge \
--bit-bin tmp/bridge_txrx_mux.wordswap.bit.bin \
--json-out docs/assets/lab1125_stock_vs_runtime_dds_tone_sweep.json
Expected JSON structure¶
{
"sweep_id": "...",
"timestamp_utc": "...",
"points": [
{
"mode": "stock",
"tone_offset_hz": 50000,
"tx_attenuation_db": -40.0,
"measured_peak_hz": 49980,
"peak_amplitude_db": -32.1,
"noise_floor_db": -71.3,
"snr_db": 39.2
},
...
]
}
Success criteria¶
| Criterion | Target |
|---|---|
| Tone detected in all modes | yes |
| Peak offset error | < 5 kHz |
| SNR | > 20 dB at -40 dB TX attenuation |
| Stock vs runtime amplitude difference | < 3 dB |
Live result on 2026-06-24¶
All three tone offsets (50 kHz, 200 kHz, 700 kHz) were detected in all three modes. The stock vs runtime amplitude difference was < 1 dB for all tones. Peak offset error was < 1 kHz for all points (limited by RTL-SDR frequency accuracy, not DDS accuracy).
This sweep constitutes the final external RF evidence that:
- the ZynqSDR DDS → AD9361 → TX antenna chain is healthy in both stock and runtime modes;
- the runtime
fpga_managerreload does not disturb the DDS tone output; - the remaining bring-up problem is isolated to the PL RX input path.
Later correction (Lab 11.26). The tone measurements above stand, but the conclusion that only the PL RX path was left broken does not. The DDS tone travels DDS → DAC; the PL BPSK stream must be switched onto the DAC separately, and after the overlay reload it was not (DDS-only mode). A healthy DDS tone was exactly what made the PL TX path look healthy. See Lab 11.26.
The sweep artifact is the reference evidence for the controlled DDS tone lab
committed in git as e355c14.
Report checklist¶
- Attach JSON sweep file.
- Confirm all tone offsets were detected in all modes.
- Record peak offset error and SNR for each point.
- Record amplitude difference between stock and runtime modes.
- State final isolation conclusion (TX chain vs RX chain).
Engineering conclusion template¶
DDS tone sweep covered offsets ____ Hz, TX attenuation ____ dB, modes ____.
Tone detection: ____ out of ____ points successful. Peak offset error range:
____ Hz to ____ Hz. SNR range: ____ dB to ____ dB. Stock vs runtime amplitude
difference: max ____ dB. The DDS tone path is / is not
healthy in both modes. This test does / does not cover the PL data path to the
DAC, because ______.