COMMUNICATION BASICS · SIONNA RT 2.0.1

From individual ray paths
to a channel you can filter with.

Paths.cir() keeps every arrival separate. Paths.taps() projects those arrivals onto a bandwidth-defined delay grid and sums them. Change the paths below and watch that projection happen.

THE WHOLE TRANSFORMATION
hn,ℓ = Σi abi(tn) sinc(ℓ − Wτi)
continuous path i discrete tap bandwidth W
1/Wseconds between adjacent taps
continuous τCIR delay axis
complex sumpaths combine in taps
many → oneinverse is not unique

SYMBOLS · UNPACKED

How to read the equation

A path arrives at a continuous delay τi. A receiver with bandwidth W represents it on integer tap locations . The sinc term tells us how much of path i lands in each tap, and the complex contributions are then added.

hn,ℓ = ΣM−1i=0 abi(tn) sinc(ℓ − Wτi)
i, M
Path index and path count. The sum includes paths i = 0, …, M − 1. The explorer calls them P1, P2, and so on.
τi
Continuous delay of path i, in seconds. The page displays nanoseconds. Delay normalization shifts the earliest path to zero for each TX/RX link.
abi(tn)
Dimensionless complex linear-amplitude coefficient of path i for one element pair. |abi| is amplitude, |abi is power gain, and its angle is phase. Superscript b means baseband—not power.
n, tn, Fs
Channel-time sample index, time, and sample rate. tn = n/Fs. This n is not the UE route-frame index.
Integer delay-tap index. Its delay coordinate is ℓ/W relative to the selected delay origin; may be negative if the chosen tap range includes it.
hn,ℓ
Complex channel tap. It is the vector sum of every path contribution at time sample n and tap .
sinc(x)
Normalized sinc function. Here sinc(x) = sin(πx)/(πx), with sinc(0) = 1.
Σ
Complex vector sum over paths. Real and imaginary parts add, so paths can reinforce or cancel. It is not a sum of powers.
API names, settings, and tensor axes +

Returned names

a_cir and tau are the per-path baseband coefficients and delays returned by cir(); together they represent the path-resolved CIR. h is the tap tensor returned by taps().

Time and delay settings

sampling_frequency is Fs, the Doppler/time sampling rate—not W. num_time_steps chooses the number of n samples. bandwidth, l_min, and l_max define the tap grid.

Normalization

normalize_delays removes each link’s earliest delay. normalize scales each link so its average total energy, summed over taps, is one. out_type selects the returned array framework.

Axes

rx/tx are receiver/transmitter device axes—a receiver/transmitter pair defines one link. rx_ant/tx_ant are array elements; path, time, and tap are the i, n, and axes.

Doppler and imaginary unit

fD,i is path i’s Doppler shift in hertz and rotates it through exp(j2πfD,it). j is the imaginary unit, j² = −1; i is reserved for the path index.

Explorer helper

gi[] is the real projection weight sinc(ℓ − Wτi), used by the explorer to show one path’s footprint on the tap grid.

Experiment acronyms and field symbols +

Radio roles

BS is the fixed base station and UE is the moving user equipment. LOS means line of sight.

Angles

AoD/AoA mean angle of departure/arrival. Raw Sionna fields theta_* and phi_* are zenith and azimuth angles, respectively.

Detection

PD is the simulated probability of detecting a true propagation path. It is unrelated to path labels P1, P2, … in the explorer. σ denotes a noise standard deviation.

Geometry and gain

x, y, z are world-frame metres in truth and provenance fields; the current estimator-facing measurement does not contain Cartesian coordinates. path_length_m is total delay × c, and azimuth/elevation are world-axis-aligned AoA at the UE. For true detections, amplitude_db starts from array-summed path power gain and receives additive dB noise; clutter receives a synthetic uniform dB value. It has no phase and is not 20 log10|abi|. “CSI” in a raw filename means path-aligned coefficient matrices here—not a sampled frequency-grid CSI tensor.

LIVE MODEL

Build a CIR. Then sample what the radio can resolve.

Each colored impulse is one synthetic path. Bandwidth determines the delay grid spacing and nominal delay resolution; phase determines whether paths reinforce or cancel after they land in the same tap.

01
Paths.cir()continuous delays
02
sinc projectionband-limit to W
03
Paths.taps()discrete delay bins

STAGE 01 · CONTINUOUS DELAY

The CIR keeps paths separate

Drag an impulse, or use the controls. The arrow inside each marker shows complex phase.

earliest arrival 0.00 ns

STAGE 02 · BAND-LIMITED PROJECTION

One sinc kernel per path

The dots are the weights applied at each discrete tap location.

P1 gi[ℓ] = sinc(ℓ − Wτi) center = tap 0.00

STAGE 03 · DISCRETE CHANNEL

Paths combine into channel taps

Select a tap to inspect the complex contribution from every path.

tap spacing5.00 ns
tap count

COMPLEX SUM AT THE SELECTED TAP

Tap ℓ = 0

delay 0.00 ns
magnitude
phase
complex value

Swipe horizontally to inspect every contribution

pathsinc weightcomplex contribution
Σvector sum, not a power sum

HOW TO GET ONE FROM THE OTHER

CIR → taps is a projection.
Taps → individual paths is an estimation problem.

01

FORWARD · DETERMINISTIC

Continuous CIR to taps

  1. Choose bandwidth W.This fixes tap spacing—and nominal delay resolution—at Δτ = 1/W.
  2. Evaluate a sinc at every tap.Each off-grid path spreads across neighboring bins.
  3. Sum complex contributions.Magnitude and phase decide reinforcement or cancellation.
Deterministic for a selected path-resolved CIR, time samples, W, tap range, and normalization.
02

REVERSE · GENERALLY NON-UNIQUE

Taps back to individual paths

  1. A tap may contain several paths.The path identity was removed by the sum.
  2. Finite bandwidth blurred the delays.Sub-tap delays appear only through the sinc pattern.
  3. Recovery needs assumptions.SAGE or sparse super-resolution estimates a likely CIR.
!Unique recovery needs additional assumptions and sufficient observations; a finite tap vector generally does not preserve path identity.

THE BANDWIDTH LEVER

More bandwidth gives a finer delay grid.

The experiment configuration records W = 1 GHz. If taps are later computed at that bandwidth, adjacent tap indices are 1 ns apart—equivalent to about 30 cm of one-way propagation-path difference (or 15 cm of monostatic radar range).

100 MHz10 ns · 3.00 m
200 MHz5 ns · 1.50 m
1 GHz1 ns · 0.30 m

RADIO-SLAM EXPERIMENT

What was actually stored?

This was a reproducible Sionna RT simulation, not a physical-radio capture. “Stored directly,” “derived,” and “simulated downstream” are separated below because they are different data boundaries. The list follows the serializer fields in the current source checkout; bulk generated artifacts live outside this website repository.

sourcesynthetic radio
configured carrier bands6.75 and 16.95 GHz
configured bandwidth1 GHz
saved CIR / tapsneither
fixed input stored directly derived / repackaged simulated downstream not stored
01FIXED INPUT · NOT AN OBSERVATION

Scene, route, radio metadata, and solver configuration

These configure or document the run and make it reproducible.

  • 3-D scene meshes, Mitsuba/Sionna scene, object names, and radio materials
  • fixed BS position and the named, ordered UE route
  • weather, trajectory type, frame count, nominal speed, seed, and scene variant; derived timing is stored in summaries
  • carrier, materials, BS 8 × 8 / UE 4 × 4 arrays, and antenna pattern/polarization configure the ray-tracing solve
  • bandwidth, horn HPBW, and BS power are recorded radio metadata/downstream assumptions; exported path gains exclude transmit power
  • LOS/reflection/diffuse/refraction/diffraction flags, depth policy, path samples, and path cap
02STORED DIRECTLY · FRAME JSON

Solver output and path geometry for every frame

The JSON preserves run context plus one structured record for each valid propagation path.

  • frame index/count, timestamp, route, weather, scene, variant, seed, band, frequency, and radio/solver configuration
  • BS position; UE position and velocity; valid/dropped/window-involved path counts; CSI filename and format
  • per path: RX/TX/path indices, delay_s, doppler_hz, and departure/arrival theta (zenith) and phi (azimuth)
  • per path: linear and dB gain summed over the antenna array
  • per interaction: depth, type/code, object ID/name, material, primitive ID, and world-frame vertex_xyz_m
  • object and interaction-code maps, including specular, diffuse, refraction, and diffraction codes
03STORED DIRECTLY · PATH COEFFICIENT NPZ

Complex MIMO coefficient matrix for each path

Each frame’s sidecar contains one array named a, aligned with the JSON path order.

  • a: complex64 [P, 16, 64] for P paths, 16 UE elements, and 64 BS elements
  • a[i] is the full per-element matrix aligned with JSON list entry paths[i]; the stored path_index is a separate source ID and need not equal i
  • a blackout frame keeps shape [0, 16, 64]
  • Σ |a[i]|² over antenna elements matches that list entry’s stored linear path gain
  • raw a is Sionna Paths.a, the passband path coefficient—not abi(tn) above or amplitude_db; cir() applies carrier-delay phase and optional Doppler evolution, adding a time axis
  • Despite the “CSI” filename, this is not a sampled CIR, tap vector, OFDM grid, or frequency-grid channel response.
04STORED DIRECTLY · SUMMARIES + KINEMATIC REPEAT

Run manifest, frame index, timing, and motion context

Summary files bind individual frames into a reproducible run. The kinematic tree is a separate solve that writes the same JSON + coefficient schema; both raw-v3 and kinematic records include timestamps, UE velocity, and Doppler.

  • scene, route, trajectory/weather, carrier/radio, BS position, solver options, and output filenames
  • per-frame seed, UE position/velocity, timestamp, path count, and file reference
  • time origin, frame interval/rate, nominal speed, route length, closed-route flag, and Doppler model/source
  • operational manifest: run status, arguments, interpreter, timestamps, job ID, artifact directories, and preservation hashes
05DERIVED / REPACKAGED · LAMBDA COMPACT NPZ

Phase-center paths plus geometry and provenance

This export reshapes the raw path records for LAMBDA-style processing; it is not a new sensor measurement.

  • a_real/a_imag phase-center scalar coefficient; tau; four Sionna angles; Doppler; gain; path index and interaction count
  • padded interaction codes, vertices, object IDs, and primitive IDs for each path
  • TX/UE position, UE velocity, TX/RX rotations, and array shapes
  • frame/time, carrier, weather, trajectory type, source files/schema, phase-center/reference-element model, Doppler source, and interaction-code map
  • source reference coefficient retained for reconstruction checks; the original 16 × 64 matrices remain in the raw sidecars
06DERIVED · EVALUATION TRUTH

World-frame BS, UE trajectory, and reflection map

Selected ray geometry is flattened into Parquet tables used to generate measurements and score results.

  • frame rows: kind, x, y, z, amplitude_db, material, path_index, depth_index, interaction_type, path_bounce_count
  • one BS row, one true UE row, and retained specular/diffuse reflection-point rows
  • per-path truth tables add total delay-derived length, the pose-independent prefix length, the final bounce vertex, LOS state, bounce count, and gain
  • separate true trajectory: frame_index, x, y, z
  • summary: coordinate frame, storage schema, LOS counts/gain availability, reflection/material counts, dropped-zero-gain counts, and source files
07SIMULATED DOWNSTREAM · SLAM MEASUREMENTS

Noisy UE-relative radio-path detections

Monte Carlo generation samples a per-trial UE trajectory deviation, adds measurement noise, drops detections, adds clutter, and shuffles every frame. The nominal ray-traced reflection locations, visibility/LOS state, and baseline gains remain fixed across trials.

  • measurement fields: path_length_m, azimuth_rad, elevation_rad, amplitude_db; path length is the total bistatic BS→bounce(s)→UE length from delay × c, and AoA points toward the last bounce
  • stored provenance fields, withheld from estimators: is_clutter, is_bs, source_path_index, source_bounce_count, bounce_x, bounce_y, bounce_z
  • per-trial true UE trajectory plus band/trial summaries, seeds, counts, noise, clutter, and motion policies
  • current generator defaults: PD = 0.8; σpath length = 0.30 m; σangle = 0.5°; σamplitude = 1 dB; detections below −135 dB after noise are removed
  • current clutter defaults: Poisson mean 50, 200 m radius, absolute z ceiling 40 m, and −135 to −115 dB; these are source defaults, not a claim about every archived run
  • the current source defaults to one trial with base seed 20260703; archived run counts must be read from that run’s summary
08NOT STORED

Representations and sensor streams not stored

The saved path ingredients can support later derivation, but the following are absent as experiment artifacts.

  • no saved Paths.cir() return tensor; delays and path coefficients exist separately in the raw exports
  • no saved Paths.taps() tensor h[n, ℓ]
  • no sampled RF/IQ or baseband waveform, OFDM resource grid, or frequency-grid CFR/CSI tensor
  • no camera/RGB, depth, LiDAR, or IMU observations
Downstream products derived from the stored data +

Visualizations: point-cloud renders, channel/PDP/CFR plots, GIFs, and diagnostic figures. Plotting code may synthesize a frequency response in memory, but does not save it as collected CSI.

SAGE branch: synthesizes a wideband observation Y in memory from saved coefficients and delays, then estimates path delay, AoA/AoD, complex amplitude, class, triangulated point, gates, and reliability. Y is not a stored raw artifact.

SLAM outputs: estimated trajectories/maps, method diagnostics, PLY conversions, scores, and comparison reports. These are results—not sensor observations.

Audit scope: the current checkout contains the serializers and schemas, but not the bulk generated frame artifacts, so this inventory describes what the code writes rather than claiming realized frame or trial counts. Large generated datasets are routed outside the website and Git history.

SIONNA RT 2.0.1

How CIR and taps can be derived later

cir() returns per-path complex coefficients and delays. taps() calls that CIR internally, applies the sinc projection, and removes the path axis by summing it. The formula and signatures follow the official Sionna RT 2.0.1 Paths documentation.

Illustrative API example: these calls explain the transformation, but they were not run by the project collection exporter.

CIR coefficient return shape · not stored[rx, rx_ant, tx, tx_ant, path, time]
Tap return shape · not stored[rx, rx_ant, tx, tx_ant, time, tap]
sionna_cir_to_taps.py
# Individual paths with continuous delays
a_cir, tau = paths.cir(
    sampling_frequency=1_000,
    num_time_steps=64,
    normalize_delays=True,
    out_type="numpy",
)

# The same paths projected to a 1 GHz delay grid
h = paths.taps(
    bandwidth=1e9,         # Δτ = 1 ns
    l_min=0,
    l_max=200,
    sampling_frequency=1_000,
    num_time_steps=64,
    normalize=False,
    normalize_delays=True,
    out_type="numpy",
)

THE SHORT VERSION

CIR says which paths arrived, when, and with what complex weight.
Taps say what a bandwidth-limited discrete receiver sees.
The experiment saved the path-resolved ingredients—not either derived output.
Experiment again