Web Config Console
The web config console edits runtime YAML in the browser. It makes nested YAML fields easier to inspect, reduces mistakes in long configuration files, and is useful when switching hardware targets, enabling simulation modes, or tuning sensing parameters.
Launch
Section titled “Launch”For remote-friendly configuration editing and process control, run:
python3 scripts/config_web_editor.py --host 0.0.0.0 --port 8765Then open http://<your-host>:8765 in a browser.
What it does
Section titled “What it does”- Provides separate BS / UE tabs, plus a
Resource Plannertab fordata_resource_blocksand aSensing Resource Maptab formask_blocks. - Edits
build/BS.yamlandbuild/UE.yamlas parameter/value forms instead of a raw YAML text area. - Provides module-local CPU-binding fields for downlink, uplink, sensing real-time loops, and the main thread.
- Saves the current form back to YAML and starts/stops BS and UE processes from the
build/directory. - Includes launch options such as enabling/disabling CPU isolation and overriding the isolate CPU list.
- Includes CPU/CUDA command presets and a custom command field for each tab.
- Lets you draw payload / sensing-pilot rectangles for
data_resource_blocks, or compact sensing rectangles formask_blocks, snap the block boundaries to integer RE grid points, and apply the result independently to the transmitter or receiver YAML. - Includes a
Guard Band Gridpreset that followsscripts/plot_const.py, i.e. it keeps only subcarriers1..489and535..N-1before the normal sync/pilot stripping rules are applied.
CPU LDPC decoding parameters
Section titled “CPU LDPC decoding parameters”The LDPC decode section on both BS and UE tabs provides:
decoder_iterations: a positive maximum iteration count, default12.nms_normalization_factor: a finite NMS factor in(0, 1], default0.75.fixed_point: selects Q16 decoding; enabling it revealsfixed_point_scale.
The defaults are 12 maximum iterations and a factor of 0.75:
ldpc: decoder_iterations: 12 nms_normalization_factor: 0.75 fixed_point: falseSave to build/UE.yaml and restart UE to configure downlink CPU decoding, or save to build/BS.yaml and restart BS to configure uplink CPU decoding. Receiver settings can be tuned independently while keeping the transmitter’s code matrices and frame geometry matched.
Syndrome early stopping remains enabled, so decoding can finish before the maximum count. Increasing the maximum normally increases computation for weak signals. Evaluate NMS settings using BER/FER or full-payload integrity checks; explicit YAML values remain in effect when upgrading. Q16 supports 0.125, 0.25, 0.375, 0.5, 0.625, 0.75, 0.875, 1.0. Both Web saves and backend YAML loading validate these settings and report specific errors for unsupported values.
Stopping a backend sends SIGINT so UHD streaming and thread cleanup finish before the next start.
Measure CPU LDPC throughput
Section titled “Measure CPU LDPC throughput”Build the public CPU benchmark and run it from build/. For example, pin it to an available CPU and compare a 6-iteration, 1.0-factor baseline with the current defaults:
cmake --build build --target LDPCFixedBench -j4cd buildtaskset -c 5 ./LDPCFixedBench 32768 32 4 6 1.0 2 7taskset -c 5 ./LDPCFixedBench 32768 32 4 12 0.75 2 7Choose a CPU that is available on your host and does not share a physical core with an active real-time worker. The optional positional arguments are frames, q16_scale, q8_scale, iterations, nms, timing_esn0_db, and reps; defaults are 8192 64 4 12 0.75 2 5. Frame count must be a positive multiple of 64. Replace the timing value 2 with -0.5 to compare a weak-signal case. Copy iteration and factor values from the YAML you want to evaluate; the benchmark does not edit runtime YAML.
The benchmark uses a fixed random seed, BPSK AWGN, and the same (1008,504) matrix for float32 and Q16 NMS. It checks BER/FER separately, then reports median information-bit Mbps across repeated decoding passes, with syndrome early stopping enabled. Here Es/N0 refers to energy per coded BPSK bit; for this rate-1/2 code, Eb/N0 is 3.01 dB higher. Coded-bit rates are twice the information-bit rates. Q16 dec+quant_Mbps is an estimate that adds separately timed quantization to decoding; it is not an end-to-end measurement of the receiver. Q8 uses MS without the NMS factor. These results measure a single CPU decoder and do not include OFDM processing, SDR I/O, or UDP goodput.
- Default commands are
./BSand./UE; switch to the CUDA preset if needed. - The editor currently targets the runtime YAML files in
build/, because the binaries readBS.yaml/UE.yamlfrom their working directory. Resource Plannereditsdata_resource_blocks: it decides which RE carry payload and which RE are reserved assensing_pilot.Sensing Resource Mapeditsmask_blocks: it decides which RE are exported on the compact sensing path whenoutput_mode=compact_mask.- Both planners can be applied to either side. During experiments TX and RX may differ temporarily, but normal operation still expects matching
data_resource_blockson both sides. - If CPU cores are limited, reserve a dedicated core for
main thread affinityfirst, then prioritize TX/RX threads, and finally modulation/demodulation plus sensing/signal-processing threads; these compute-heavy stages typically have larger buffers and tolerate transient jitter better. - CPU affinity is configured only for real-time pipeline threads and the main thread. Non-real-time service/output/helper threads are intentionally left unbound.
- Use
-1,[], or an omitted optional field to leave that module unbound. - The runtime panel shows Isolated / Bound / Process / System CPU lists. Default isolation covers only the most sensitive threads (USRP TX/RX, main; BS sensing RX) — not OFDM mod/demod.
- BS+UE (isolate both sides) unions sensitive cores from both YAML files when checked; unchecked isolates only the current tab.
- Save + Start / Apply Isolation call
scripts/isolate_cpus.py; this non-interactive path leaves NIC IRQ policy off unless the CLI is run separately with--nic-irq isolate|split. ProcessAllowedCPUsspans application CPUs and excludes dedicated NIC IRQ CPUs when such a policy is active in saved state. - Override isolated CPU list allows a manual isolate set for this launch/apply.
- Reset Isolation restores system slices to all CPUs.
- Because the console can launch arbitrary commands entered in the web UI, bind it only to trusted networks or keep the default
127.0.0.1.