Sensing xApps
ISAC (Integrated Sensing And Communication) xApps that turn the RAN's lower-layer PHY data — raw SRS/CSI and per-UE channel estimates — into sensing output: spectra, angle-of-arrival, micro-Doppler, channel impulse responses, timing-of-arrival, and SNR. Both are Python (the DSP-heavy work lives in the xApp, per the producer-owns-DSP principle).
ran-sensing
A multi-service-model ISAC pipeline. Python.
- SMs: four data paths across three SMs —
- E2SM-LLC triggered REPORT Style 1 (LLI Copy) — the live SRS/CSI PHY tap;
- E2SM-CCC cell-level periodic REPORT — decode context (numerology, PRB span, antenna geometry);
- E2SM-AIR REPORT Style 1 (SRS UE Estimate) — the gNB's own per-UE estimates;
- E2SM-AIR QUERY Style 1 (UE PHY Configuration) — the always-on
per-UE
CellGroupConfigpull that maintains the authoritative SRS-Config catalogue and UE set.
- What it does: subscribes the LLC SRS/CSI tap and runs a
configurable sensing algorithm (
summary/srs_spectral/srs_sensing/noop) on each occasion. The defaultsrs_sensingemits one unifiedsrs_sensingrecord per occasion carrying cell-wide reference-free spectra plus a nested per-UE list — for UEs whose catalogued SRS-Config matches, the true channel CIR / ToA / SNR and per-UE recomputed spectra. CCC supplies the geometry; the AIR PHY-config query maintains the per-UE SRS-Config catalogue. Output streams to the sinks (sensing scalars → timeseries, records → structured). - Notable config:
sensing.algorithm(srs_sensing),sensing.phy_config_query.interval_ms(3000), and thesensing.srs_sensing.*DSP knobs — AoA grid (aoa_spacing_wavelengths,aoa_n_angles,aoa_max_deg),micro_doppler_window/min_occasions,occupied_rel_threshold,match_min_concentration,record_min_interval_ms,channel_export; pluscell_config.{report_period_ms, static_config_enabled}.
The most sophisticated in-tree xApp — a full example of fusing multiple
SMs and correlating them on (node, c_rnti).
srs-estimates
A comprehensive collector for the gNB's own per-UE SRS channel estimates — feeds a companion dashboard. Python.
- SM: E2SM-AIR REPORT Style 1 only, requesting the
full measurement set (
SRS_WIDEBAND_SNR,SRS_PER_RB_SNR,TIMING_ADVANCE,CHANNEL_ESTIMATE_FREQ) unconditionally for every sounding UE (scope ALL, no reporting condition). - What it does: discovers AIR-capable nodes, subscribes for all four
measurement types, and on each arrival decodes the scalar fields (cRNTI,
antenna/port counts, wideband / per-RB SNR, timing advance) and the raw
channel estimate (big-endian
int16I/Q → magnitude_db / phase_rad arrays). It logs a one-line summary and streams the full estimate to the sinks. It does no DSP fusion and no algorithm selection — a heavy, exhaustive raw collector by design. - Config: no app-specific knobs (comprehensive collection is hardcoded); structured file + Redis sinks on, InfluxDB off by default (a raw Redis-fed dashboard consumes the stream).
The narrower counterpart to ran-sensing: where ran-sensing fuses
multiple SMs into sensing output, srs-estimates collects everything AIR
offers, raw, for downstream processing.