Skip to content

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.

For remote-friendly configuration editing and process control, run:

Terminal window
python3 scripts/config_web_editor.py --host 0.0.0.0 --port 8765

Then open http://<your-host>:8765 in a browser.

  • Provides separate BS / UE tabs, plus a Resource Planner tab for data_resource_blocks and a Sensing Resource Map tab for mask_blocks.
  • Edits build/BS.yaml and build/UE.yaml as 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 for mask_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 Grid preset that follows scripts/plot_const.py, i.e. it keeps only subcarriers 1..489 and 535..N-1 before the normal sync/pilot stripping rules are applied.

The LDPC decode section on both BS and UE tabs provides:

  • decoder_iterations: a positive maximum iteration count, default 12.
  • nms_normalization_factor: a finite NMS factor in (0, 1], default 0.75.
  • fixed_point: selects Q16 decoding; enabling it reveals fixed_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: false

Save 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.

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:

Terminal window
cmake --build build --target LDPCFixedBench -j4
cd build
taskset -c 5 ./LDPCFixedBench 32768 32 4 6 1.0 2 7
taskset -c 5 ./LDPCFixedBench 32768 32 4 12 0.75 2 7

Choose 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 ./BS and ./UE; switch to the CUDA preset if needed.
  • The editor currently targets the runtime YAML files in build/, because the binaries read BS.yaml / UE.yaml from their working directory.
  • Resource Planner edits data_resource_blocks: it decides which RE carry payload and which RE are reserved as sensing_pilot.
  • Sensing Resource Map edits mask_blocks: it decides which RE are exported on the compact sensing path when output_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_blocks on both sides.
  • If CPU cores are limited, reserve a dedicated core for main thread affinity first, 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. Process AllowedCPUs spans 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.