Skip to content

UE YAML Reference

UE reads UE.yaml from its current working directory at startup. Copy a config/UE_*.yaml preset that matches your hardware and scenario, then edit the copy. Configuration is not hot-reloaded; restart the UE after making changes.

The tables follow the top-level YAML structure and use full paths such as uplink.arq_enabled to distinguish similarly named fields. A typical value is guidance, not a guaranteed default for every preset. If an optional section is omitted, the parser supplies its default values.

Keep coupled frame-structure, duplex, frequency, and resource-mapping fields consistent with the BS configuration.

PathType/UnitTypical ValueDescription
radio.radio_backendstringuhdRadio I/O backend. Use uhd for USRPs, sim for the simulator, or xr1710g for the CPU receive-only UE.
radio.xr1710g_shmstring/xr1710g-livePOSIX shared-memory name of the external single-channel host receiver.
radio.xr1710g_center_freqfloat / Hz2442000000Required actual source LO, read from the XR1710G controller; not an RF tuning command.
radio.xr1710g_attach_timeout_sfloat / s5Wait for a live host receiver, within 0–3600 seconds.
radio.xr1710g_pll_commandstring""Optional persistent PLL helper command, executed on the receiver host. Empty uses software NCO; configured uses hardware LO fine correction within ±100 kHz. See setup below.

See XR1710G setup for supported rates, source ownership and timing limits.

PathType/UnitTypical ValueDescription
simulation.sessionstringoisac_simShared simulator session namespace.
simulation.enable_comm_rxbooltrueSimulator produces the communication RX path.
simulation.enable_sensing_rxbooltrueSimulator produces sensing RX paths.
simulation.enable_uplinkboolfalseSimulator routes the UE-to-BS uplink stream.
simulation.pacing_enabledbooltruePace simulator output to wall-clock sample time.
simulation.noise_power_dbfsfloat / dBFS-100AWGN power per RX channel.
simulation.snr_control_enableboolfalseMaintain target_snr_db by scaling clean simulated signal.
simulation.target_snr_dbfloat / dB40Initial target SNR when SNR control is enabled.
simulation.control_portint10002ChannelSimulator control port.
simulation.cfo_hzfloat / Hz0Initial BS-to-UE CFO before UE RX correction. The initial UE-to-BS CFO has the opposite sign, is carrier-ratio-scaled in FDD, and its residual then follows UE uplink TX retuning.
simulation.sample_rate_offset_ppmfloat / ppm0UE sample-clock offset relative to BS.
simulation.timing_offset_samplesint / samples0Constant integer sample delay.
simulation.array_spacing_mfloat / m0.04283Physical ULA spacing.
simulation.array_spacing_lambdafloat0.5Legacy ULA spacing in wavelengths.
simulation.ring_capacity_samplesint262144Shared-memory ring capacity.
simulation.steering_override_filestring""Optional array-manifold matrix file. When empty, the simulator generates a ULA manifold from angle_deg. When set, angle_deg no longer affects the array response; encode the angle-dependent amplitude and phase directly in the matrix.
simulation.comm_multipath_taps[]object[]optionalCommunication taps with delay_samples, gain_db, and phase_deg.
simulation.targets[]object[]optionalMonostatic point scatterers.
simulation.bistatic_targets[]object[]optionalBistatic/communication point scatterers.
PathType/UnitTypical ValueDescription
rf_sampling.sample_ratefloat / Hz50000000Baseband sample rate.
rf_sampling.bandwidthfloat / Hz50000000Analog bandwidth.
rf_sampling.rx_gainfloat / dB10UE downlink RX gain.
rf_sampling.rx_agc_enablebooltrueEnable UE downlink hardware RX AGC.
rf_sampling.rx_agc_low_threshold_dbfloat / dB14Increase RX gain below this filtered delay-spectrum threshold.
rf_sampling.rx_agc_high_threshold_dbfloat / dB16Decrease RX gain above this threshold.
rf_sampling.rx_agc_max_step_dbfloat / dB1Maximum RX gain step per AGC update.
rf_sampling.rx_agc_update_framesint4Minimum processed-frame interval between AGC updates.
PathType/UnitTypical ValueDescription
usrp_device.device_argsstringaddr=...USRP device args.
usrp_device.clock_sourcestringexternalUE clock source: internal, external, or gpsdo.
usrp_device.time_sourcestringinternalUE time/PPS source. Empty resolves to internal; pps_phase requires this and clock_source to both be external.

Whenever usrp_device.clock_source is non-empty, CPU, CUDA, and HIP UE perform strict device-time alignment before any stream starts, independently of the selected sync_tracking.ocxo_mode. This includes time_source: internal; time_source selects the PPS input but does not disable startup alignment. Startup observes one PPS transition, arms set_time_next_pps(0), and waits until the device time counter actually resets and time_last_pps=0. A missing PPS, unsupported backend, or failed verification aborts startup. With gpsdo, alignment intentionally replaces any UTC-like device-time epoch with zero. It aligns the software time origin but retains the X310’s 5 ns PPS capture quantization at a 200 MHz master clock.

PathType/UnitTypical ValueDescription
ofdm_frame.fft_sizeint1024OFDM FFT size.
ofdm_frame.cp_lengthint / samples128Cyclic prefix length.
ofdm_frame.sync_posint1Sync symbol index.
ofdm_frame.enable_sec_sync_symbolboolfalseExpect a duplicate ZC sync symbol at sync_pos-1.
ofdm_frame.enable_cfo_training_sequenceboolfalseUse the sync_pos+1 CFO training field to resolve CFO aliases.
ofdm_frame.cfo_training_period_samplesint / samples16CFO training repetition period.
ofdm_frame.num_symbolsint100OFDM symbols per frame.
ofdm_frame.sensing_symbol_numint100Symbols used for sensing.
ofdm_frame.frame_queue_sizeint32Demodulated RX frame queue capacity.
ofdm_frame.zc_rootint29Zadoff-Chu root.
ofdm_frame.pilot_positionsint[][571,...]Comb-pilot subcarrier indices.
ofdm_frame.midframe_pilot_symbolsint[][]Optional mid-frame BPSK pilot symbols.
ofdm_frame.midframe_pilot_seedint1296453708Deterministic mid-frame BPSK pilot seed.
PathType/UnitTypical ValueDescription
cuda.cuda_precision_profilestringfp32fp32 preserves the existing path. mixed_fp16 uses FP16 for bulk OFDM FFT/IFFT and GPU LDPC messages while retaining FP32 for channel estimation, tracking, equalization, sensing, and LLR generation. Unsupported FP16 FFT shapes fall back to FP32.
cuda.cuda_demod_pipeline_slotsint3CUDA demodulation pipeline slots.
cuda.cuda_ldpc_decoder_backendstringgpuCUDA demod LDPC decoder backend: gpu or cpu.
cuda.cuda_ldpc_worker_buffersint3CUDA LDPC async worker batch buffers.
cuda.cuda_ldpc_cross_frame_flush_framesint2Max frames accumulated before CUDA LDPC batch decode.
cuda.cuda_ldpc_cross_frame_flush_usfloat / us1000Max CUDA LDPC cross-frame batch wait time.
PathType/UnitTypical ValueDescription
ldpc.decoder_iterationsint12Maximum CPU LDPC iterations, at least 1; syndrome early stopping stays enabled.
ldpc.nms_normalization_factorfloat0.75CPU NMS normalization factor, finite and in (0, 1]; Q16 requires multiples of 0.125.
ldpc.fixed_pointboolfalseUse int16/Q16 CPU LDPC decode path.
ldpc.fixed_point_scaleint16LLR scale before int16 saturation.

These fields configure CPU decoding on the UE downlink, for both float32 and Q16. Omitting them selects 12 iterations and a factor of 0.75. Explicit YAML values remain in effect; update both fields to use these defaults in an existing config. Edit them under LDPC decode in the Web Config Console, save, and restart the backend. Q16 supports 0.125, 0.25, 0.375, 0.5, 0.625, 0.75, 0.875, 1.0; the LLR scale applies only when fixed_point: true. More iterations may improve error correction while increasing computation for weak signals.

PathType/UnitTypical ValueDescription
downlink.center_freqfloat / Hz2400000000UE downlink RF center frequency.
downlink.rx_wire_formatstringsc16UE downlink RX wire format.
downlink.rx_channelint0UE downlink RX channel index.
downlink.equalizer_modestringmmseDownlink equalizer inverse mode: zf or mmse.
downlink.channel_tracking_modestringpilot_phasePer-symbol comb-pilot tracking mode.
downlink.equalizer_mag_floorfloat1e-6Lower bound for `
downlink.channel_tracking_min_pilot_snrfloat1e-4Minimum comb-pilot residual weight before fallback.
downlink.arq_enabledboolfalseEnable downlink ARQ on the UE receiver.
downlink.arq_ordered_deliveryboolfalseBuffer downlink packets for in-order UDP delivery.
downlink.arq_window_packetsint256Downlink ARQ receive/reorder window; valid range 1–32767.
downlink.arq_feedback_interval_msint / ms10Minimum interval between downlink ARQ ACK feedback packets.
PathType/UnitTypical ValueDescription
uplink.enabledboolfalseMaster switch for UE uplink/duplex.
uplink.duplex_modestringtddMust match BS: tdd windowed uplink or fdd full-frame uplink.
uplink.center_freqfloat / Hz2500000000FDD-only uplink carrier. TDD uses the downlink center frequency.
uplink.idle_waveformstringrandom_qpskUE uplink idle waveform: random_qpsk or zero.
uplink.symbol_startint90TDD-only first uplink symbol.
uplink.symbol_countint10TDD-only uplink window length.
uplink.guard_symbolsint1TDD-only leading guard symbols.
uplink.tx_gainfloat / dB0UE uplink TX gain.
uplink.tx_channelint0UE uplink TX channel index.
uplink.wire_format_txstringsc16UE uplink TX wire format.
uplink.ue_timing_advanceint / samples50UE uplink transmit timing advance.
uplink.debug_self_channelboolfalseEstimate UE self-TX leakage channel from RX windows for TADV debugging.
uplink.ertm_to_enableboolfalseEnable eRTM TO payload consumption and TO logs.
uplink.ertm_timing_metricstringdelay_magnitudeDifferential-TO metric: phase-robust delay_magnitude or coherent maximum_likelihood.
uplink.ertm_delay_oversample_factorint10eRTM delay-spectrum IFFT oversampling factor.
uplink.ertm_dl_rf_delay_samplesfloat / samples67.0Calibrated downlink RF-chain delay for eRTM equations.
uplink.ertm_ul_rf_delay_samplesfloat / samples67.0Calibrated uplink RF-chain delay for eRTM equations.
uplink.ertm_debug_output_enabledboolfalseEnable UE-side eRTM debug ZMQ spectra.
uplink.ertm_report_interval_framesint / frames32BS eRTM report cadence; keep matched with BS.
uplink.arq_enabledboolfalseEnable uplink ARQ on the UE transmitter.
uplink.arq_window_packetsint256Uplink ARQ outstanding packet window; valid range 1–32767.
uplink.arq_retransmit_timeout_msint / ms100Uplink ARQ retransmission timeout.
uplink.arq_max_retriesint5Max uplink retransmission retries; 0 means unlimited within the window.

With timed uplink enabled on a real radio, CPU, CUDA, and HIP UE startup queries the device’s actual RX and TX sample rates. A difference greater than 1 Hz aborts startup before worker threads are launched because exact uplink identity mapping requires both directions to use the same sample-time grid.

PathType/UnitTypical ValueDescription
sync_tracking.sync_queue_sizeint32Sync-search batch queue capacity.
sync_tracking.sync_cfo_alias_search_range_hzfloat / Hz800000CFO range covered by the sync alias resolver.
sync_tracking.reset_hold_sfloat / s0.5Consecutive invalid-delay or preamble-mismatch duration before a hard reset to sync search.
sync_tracking.software_syncbooltrueEnable software sync tracking.
sync_tracking.predictive_delaybooltrueUse CFO-based predictive delay compensation.
sync_tracking.hardware_syncboolfalseEnable hardware OCXO discipline.
sync_tracking.hardware_sync_ttystring/dev/ttyUSB0Serial device for the OCXO DAC controller.
sync_tracking.ocxo_modestringautoauto, freq, and phase retain the legacy TO-based behavior; pps_phase explicitly selects PPS phase locking.
sync_tracking.ocxo_dac_ppm_per_lsbfloat9.71e-7Calibrated DAC ppm per LSB (MV197 map).
sync_tracking.ocxo_dac_zero_wordint493367DAC word for 0 ppm.
sync_tracking.ocxo_dac_state_filestring.openisac_ocxo_dac_state.yamlPersist the last SF word acknowledged by the DAC. A relative path is resolved from the UE working directory; an empty value disables restart persistence.
sync_tracking.ocxo_max_abs_ppmfloat / ppm0.45Absolute OCXO command clamp.
sync_tracking.ocxo_actuator_max_slew_ppm_per_sfloat / ppm/s0.01Hard actuator slew limit; applied steps are fed back to the controller.
sync_tracking.ocxo_coarse_*varioussee presetsOne-target startup correction: Mode A averages residual CFO; Mode B regresses Alignment-continuous TO_clock against absolute frame sequence over the coarse window.
sync_tracking.ocxo_fll_fast_*, ocxo_fll_slow_*varioussee presetsFast/slow FLL on residual CFO in Mode A or rolling TO_clock regression SFO in Mode B, with threshold hysteresis and dwell.
sync_tracking.ocxo_fll_slow_kpfloat0.1Slow FLL proportional gain.
sync_tracking.ocxo_fll_slow_kifloat0.007Slow FLL integral gain.
sync_tracking.ocxo_fll_slow_max_slew_ppm_per_sfloat / ppm/s0.005Slow FLL command slew limit.
sync_tracking.ocxo_fll_slow_enter_abs_ppmfloat / ppm0.0005Residual threshold for entering Slow FLL from Fast FLL.
sync_tracking.ocxo_phase_setpoint_modestringfreeze_on_lockLegacy auto/phase target: freeze TO_clock on Phase entry, use zero, or use a fixed target.
sync_tracking.ocxo_phase_setpoint_fixed_samplesfloat / samples0.0Legacy fixed TO_clock target when the setpoint mode is fixed.
sync_tracking.ocxo_phase_*varioussee presetsVelocity-form Phase PI. Its error is setpoint-TO_clock in legacy auto/phase, or wrapped P_U-P_B in pps_phase; entry/exit still uses TO_clock SFO regression.
sync_tracking.ocxo_pps_initial_ap_enablebooltrueLegacy key name. In pps_phase, start one PPSOUT alignment transaction on every FllSlow -> Phase entry before releasing SF phase tracking. Disabling it emits a startup warning because a large residual may converge very slowly through the slew-limited PI.
sync_tracking.ocxo_pps_initial_ap_max_abs_nsfloat / ns500000000Absolute AP clamp, matching the PPSDO hardware range.
sync_tracking.ocxo_pps_initial_ap_settle_sfloat / s2.0Minimum AP settling time; a newer eRTM/PPS observation is also required.
sync_tracking.ocxo_pps_initial_ap_command_timeout_sfloat / s3.0Total AP worker wall-clock budget, including all JAMSYNCING retries. The aligner waits a 0.5 s terminal-status grace; no AP copy is sent after the worker deadline.
sync_tracking.ocxo_pps_initial_ap_max_retriesint1Bounded retries (0..3) when AP was accepted but no fresh post-AP publication arrived by settle_s + command_timeout_s. A retry waits for a new valid publication and recomputes AP from its residual.
sync_tracking.ocxo_pps_initial_ap_deadzone_nsfloat / ns10.0Skip AP and the settling wait when the PPS error at Phase entry is already within this range.
sync_tracking.ocxo_pps_initial_ap_polarityint1AP command sign for a positive P_U-P_B error. The default is the polarity confirmed by the PPSOUT bench measurement; -1 remains available for different hardware/firmware polarity.
sync_tracking.cfo_ewma_enablebooltrueEWMA pre-filter on residual CFO ppm for Mode A Coarse/FLL.
sync_tracking.cfo_ewma_alphafloat0.02EWMA weight on new residual samples (0..1; higher = faster, noisier).
sync_tracking.desired_peak_posint20Target delay-peak position for alignment logic.

The hardware presets use ocxo_fll_slow_kp=0.1, ocxo_fll_slow_ki=0.007, ocxo_fll_slow_max_slew_ppm_per_s=0.005, and ocxo_fll_slow_enter_abs_ppm=0.0005. They retain ocxo_fll_slow_deadzone_ppm=5.0e-5, ocxo_phase_kp=2.0e-4, ocxo_phase_ki=1.0e-6, and ocxo_phase_enter_sfo_abs_ppm=2.0e-4. The PPSOUT AP correction is enabled on every Phase entry and uses the bench-confirmed positive command polarity by default.

Normal synchronization reacquisition resets OCXO observations, dwell timers, and loop stages without writing the DAC zero word. The discipliner restarts at the actuator’s retained command. The actuator rebases its slew timer at the first actual nonzero post-lock correction, so time spent searching cannot inflate that correction. After an SF command receives OK, the non-real-time serial worker durably updates ocxo_dac_state_file. On the next UE/CUDAUE process start, that acknowledged raw word initializes both the DAC and controller instead of starting at zero. During graceful shutdown, the serial worker is stopped first and the last SF word that actually received OK is saved again; a newer unacknowledged queued word is never promoted to the steady-state restart value. Restore also requires the saved serial device, zero_word, and ppm_per_lsb to match the active configuration. A missing file starts from the calibrated zero word and is created after an acknowledged command. A corrupt, mismatched, or out-of-range file also falls back to zero, but remains unchanged and disables persistence for that process run; fix or remove it before restarting. This assumes the external DAC itself remains powered and retains its word while the UE process restarts.

auto and phase preserve the existing Phase anchor: the PI controls setpoint - TO_clock, including freeze_on_lock, zero, and fixed. They do not read time_last_pps() or run the AP gate.

pps_phase is a separate explicit mode. For downlink frame N, eRTM reconstructs r_B=B_N-P_B from the BS anchor refreshed immediately before each ERTM5 report is packed, and obtains r_U=U_N-P_U from the UE frame-boundary and PPS timestamps. Its Phase error is wrap_1s(tau_DL_RF - TO_UE + r_B - r_U) = wrap_1s(P_U-P_B), with target zero. This mode is rejected unless sync_tracking.hardware_sync=true, uplink.ertm_to_enable=true, and both usrp_device.clock_source and usrp_device.time_source are explicitly external; an empty time_source means internal. The BS must likewise use the PPSDO-connected external clock and time sources when producing the PPS anchor. The BS anchor refresh runs at the eRTM report cadence configured by uplink.ertm_report_interval_frames, outside the TX/modulation real-time path. On every FllSlow -> Phase transition, the AP gate is rearmed and computes one correction from the latest valid PPS residual. It remains done throughout that Phase residence, so normal Phase updates and Freeze do not repeat AP. If Phase falls back through FLL and later re-enters, one new correction is allowed. AP changes PPSDO PPSOUT only and never resets USRP time, reanchors the air-frame clock, clears eRTM state, or rebuilds TO. If the previous AP is still queued or in flight, the new entry waits for hardware Idle instead of treating it as a terminal queue failure. JAMSYNCING retries reuse the same AP request.

PathType/UnitTypical ValueDescription
sensing.sensing_delay_correction_modestringlos_trackingBistatic sensing delay correction source: los_tracking or ertm_absolute.
sensing.bi_enabledbooltrueEnable bistatic sensing processing.
sensing.bistatic_phase_referenceboolfalseLoS phase reference; improves sensing with less stable clocks. Requires LoS and a transmitter/receiver pair stationary relative to each other; restart UE to apply.
sensing.phase_reference_min_coherencefloat0.05Minimum reference coherence in (0, 1]; effective when phase reference is enabled.
sensing.range_fft_sizeint1024Range FFT size.
sensing.doppler_fft_sizeint100Doppler FFT size.
sensing.view_range_binsint0Backend RD view width; 0 means full range.
sensing.view_doppler_binsint0Backend RD view height; 0 means full Doppler size.
sensing.output_modestringdensedense full-buffer output or compact_mask selected-RE output.
sensing.on_wire_formatstringcomplex_float32Sensing payload wire format.
sensing.backend_processing_enabledboolfalsePublish backend RD/CFAR/micro-Doppler sidecars when supported.
sensing.symbol_strideint20Default dense-mode STRD applied at startup.

This option can improve bistatic sensing coherence and Doppler stability when independent or less stable transmitter/receiver clocks leave residual common phase drift after synchronization. It requires a stable line-of-sight (LoS) path between the transmitter and receiver, and the two radios must remain stationary relative to each other. Sensing targets may still move. Do not enable it for NLoS-only links or when the transmitter and receiver move relative to each other: motion of the reference path would also be subtracted from the measured Doppler.

On the UE Linux host, merge these fields into the active UE.yaml:

sensing:
bi_enabled: true
output_mode: dense
sensing_delay_correction_mode: los_tracking
bistatic_phase_reference: true
phase_reference_min_coherence: 0.05

This is a startup YAML option, also editable in the Web Config Console. Save the YAML and restart the UE to apply it; there is currently no online enable/disable command for this option.

The correction removes residual common phase from bistatic CSI in dense output mode after CFO/SFO/delay and system-response correction, before MTI.

Each slow-time row uses a Hamming-weighted LoS reference and a unit-magnitude conjugate rotation on all subcarriers. The reference follows the known ALGN display translation: it cancels that phase ramp only while measuring the reference, and retains the requested delay shift in the output. A translation clears the incomplete sensing batch and MTI/micro-Doppler history so the two display coordinates are not mixed. Amplitudes are preserved. The direct path must be static and dominant: the displayed Doppler is relative to this path; a moving reference also subtracts its own motion. This does not correct the radio sample clock.

sensing.phase_reference_min_coherence defaults to 0.05, with range (0, 1]. Coherence is |sum(w H)|² / (sum(w) sum(w |H|²)), where w is the Hamming weight and H is evaluated after cancelling the known display phase ramp. A weak, near-zero or non-finite reference rejects the entire sensing batch and clears MTI/micro-Doppler history. Communication samples are unaffected. Missing slow-time samples reset the sensing window and history to keep Doppler processing on a uniform timeline.

Restart the UE after changing these YAML fields. On the UE Linux host, check the startup log for static LoS phase reference enabled before MTI. Frequent weak/invalid LoS phase reference messages indicate that this path is unsuitable as a reference; disable the feature or improve the direct-path signal.

PathType/UnitTypical ValueDescription
resource_preview.data_resource_blocks[]object[]optionalPayload / sensing-pilot RE rectangles; each item has kind, symbol_start, symbol_count, subcarrier_start, and subcarrier_count.
resource_preview.mask_blocks[]object[]optionalCompact sensing RE rectangles with symbol_start, symbol_count, subcarrier_start, and subcarrier_count.
PathType/UnitTypical ValueDescription
measurement.measurement_enableboolfalseEnable internal PRBS measurement checking.
measurement.measurement_modestringinternal_prbsMeasurement checker mode.
measurement.measurement_run_idstring""Run ID written to measurement CSV summaries.
measurement.measurement_output_dirstring""Output directory for measurement CSV summaries.
measurement.measurement_payload_bytesint / bytes1024Expected bytes per measurement payload.
measurement.measurement_prbs_seedint0x5ABase seed for rebuilding deterministic PRBS payloads.
measurement.measurement_packets_per_pointint1Expected packets for one measurement epoch.
measurement.measurement_max_packets_per_frameint1Max measurement packets checked per frame; 0 means unlimited.
PathType/UnitTypical ValueDescription
network_output.udp_input_ipstring / IPv40.0.0.0UE uplink payload UDP bind IP.
network_output.udp_input_portint50002UE uplink payload UDP bind port.
network_output.udp_output_ipstring / IPv4""UE decoded downlink UDP destination IP; empty uses runtime.default_out_ip.
network_output.udp_output_portint50001UE decoded downlink UDP destination port.
network_output.udp_egress_pacer_enabledboolfalseEnable queued pacing for decoded UDP egress.
network_output.udp_egress_pacer_target_mbpsfloat / Mbps0Egress pacer target rate; 0 auto-estimates.
network_output.udp_egress_pacer_queue_packetsint10240Egress pacer queue capacity.
network_output.udp_egress_pacer_max_delay_msfloat / ms0Max queued packet age; 0 disables age drops.
network_output.bi_sensing_output_enabledbooltrueEnable bistatic sensing ZMQ output.
network_output.bi_sensing_ipstring / IPv40.0.0.0Bistatic sensing/control ZMQ bind IP.
network_output.bi_sensing_portint8889Bistatic sensing PUB port.
network_output.channel_ipstring / IPv40.0.0.0Channel-estimate PUB IP.
network_output.channel_portint12348Channel-estimate PUB port.
network_output.pdf_ipstring / IPv40.0.0.0Delay-spectrum PUB IP.
network_output.pdf_portint12349Delay-spectrum PUB port.
network_output.constellation_ipstring / IPv40.0.0.0Constellation PUB IP.
network_output.constellation_portint12346Constellation PUB port.
network_output.self_channel_ipstring / IPv40.0.0.0UE self-channel debug PUB IP.
network_output.self_channel_portint12350UE self-channel debug PUB port.
network_output.self_pdf_ipstring / IPv40.0.0.0UE self-delay-spectrum debug PUB IP.
network_output.self_pdf_portint12351UE self-delay-spectrum debug PUB port.
network_output.ertm_debug_ipstring / IPv40.0.0.0UE eRTM debug PUB IP.
network_output.ertm_debug_portint12362UE eRTM debug PUB port.
network_output.ocxo_debug_ipstring / IPv40.0.0.0OCXO debug ZMQ PUB bind IP.
network_output.ocxo_debug_portint12347OCXO debug ZMQ PUB port.
network_output.control_portint10001ZMQ ROUTER port for runtime control.
PathType/UnitTypical ValueDescription
cpu_cores.downlink_cpu_coresint[][1,2,3]UE downlink cores: RX, processing, bit processing.
cpu_cores.demod_worker_cpu_coresint[][]UE CPU demod worker cores; empty starts one unbound worker.
cpu_cores.ldpc_worker_cpu_coresint[][]UE CPU LDPC decode worker cores; empty starts one unbound worker.
cpu_cores.sensing_cpu_coresint[][4]UE bistatic sensing cores.
cpu_cores.uplink_cpu_coresint[][]UE uplink cores: LDPC encode, modulation, TX send, UDP receive.
cpu_cores.main_cpu_coreint-1Main-thread CPU core; -1 disables binding.
PathType/UnitTypical ValueDescription
runtime.default_out_ipstring / IPv4127.0.0.1Default destination IP for UDP outputs when a specific IP field is empty.

When hardware sync is enabled, the OCXODBG3 ZeroMQ packet retains these 16 fixed channels:

ChannelSignalChannelSignal
0modulo CFO (Hz)8active-window TO_clock regression SFO (ppm)
1de-aliased CFO (Hz)9cumulative Alignment (samples)
2raw residual CFO (ppm)10Alignment feedforward (samples)
3filtered control CFO (ppm)11desired OCXO delta (ppm)
4OFDM delay-track SFO (ppm; channel compensation only)12applied OCXO delta (ppm)
5raw TO_UE (samples)13applied OCXO command (ppm)
6continuous TO_clock (samples)14coarse target outstanding (ppm)
7active Phase error: legacy setpoint-TO_clock or pps_phase P_U-P_B (samples)15stage (0..4: Coarse, Fast, Slow, Phase, Freeze)

The packet is a fixed 152-byte little-endian frame: magic, version, channel count, sequence, Unix-nanosecond source timestamp, the original 16 float32 values, and a typed PPS diagnostic trailer. The trailer and CSV append r_bs_samples and r_ue_samples (float64), bs_last_pps_ticks, bs_t0_to_pps_ticks, and ue_last_pps_ns (exact int64), plus bs_tick_rate and sample_rate (float64). These fields distinguish BS-anchor, UE-PPS-latch, and TO discontinuities without passing absolute timestamps through float32. The viewer still accepts legacy OCXODBG2 packets. Launch the rolling viewer with python3 scripts/plot_ocxo_debug.py. Use --channels 6,7,8,13,15 to choose initial curves and --record capture/ocxo.csv to start CSV recording; automatic names use ocxo_debug_YYYYMMDD_01.csv and increment to _02, _03, and so on for later captures on the same day. Recording always stores all channels even when only a subset is visible. Periodic state packets are supplemented by immediate control, stage-transition, TO-jump, and Alignment event packets so one-frame delta channels are not lost.

Same hierarchical filter as BS (logging.*). Debug examples: ertm: debug, recovery: info, demod.snr: info. Performance (paths end with _profiling, off until set): demod_profiling: info, demod_eq_profiling: info.

Resource-map notes:

  • resource_preview.data_resource_blocks should normally match between BS and UE, including kind.
  • Built-in ZC sync symbols, the optional CFO training field, comb pilots, and mid-frame BPSK pilots take precedence over configured resource blocks.
  • resource_preview.mask_blocks controls compact sensing export only. In output_mode=compact_mask, runtime STRD is ignored because the mask defines the sampling pattern.
  • Compact sensing payloads begin with CompactSensingFrameHeader, followed by fixed-order raw complex<float> samples.