Skip to content

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 —
    1. E2SM-LLC triggered REPORT Style 1 (LLI Copy) — the live SRS/CSI PHY tap;
    2. E2SM-CCC cell-level periodic REPORT — decode context (numerology, PRB span, antenna geometry);
    3. E2SM-AIR REPORT Style 1 (SRS UE Estimate) — the gNB's own per-UE estimates;
    4. E2SM-AIR QUERY Style 1 (UE PHY Configuration) — the always-on per-UE CellGroupConfig pull 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 default srs_sensing emits one unified srs_sensing record 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 the sensing.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; plus cell_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 int16 I/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.