STAGE 01 · CONTINUOUS DELAY
The CIR keeps paths separate
Drag an impulse, or use the controls. The arrow inside each marker shows complex phase.
COMMUNICATION BASICS · SIONNA RT 2.0.1
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.
SYMBOLS · UNPACKED
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.
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().
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.
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.
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.
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.
gi[ℓ] is the real projection weight sinc(ℓ − Wτi), used by the explorer to show one path’s footprint on the tap grid.
BS is the fixed base station and UE is the moving user equipment. LOS means line of sight.
AoD/AoA mean angle of departure/arrival. Raw Sionna fields theta_* and phi_* are zenith and azimuth angles, respectively.
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.
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
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.
STAGE 01 · CONTINUOUS DELAY
Drag an impulse, or use the controls. The arrow inside each marker shows complex phase.
STAGE 02 · BAND-LIMITED PROJECTION
The dots are the weights applied at each discrete tap location.
gi[ℓ] = sinc(ℓ − Wτi)
center = tap 0.00
STAGE 03 · DISCRETE CHANNEL
Select a tap to inspect the complex contribution from every path.
COMPLEX SUM AT THE SELECTED TAP
Swipe horizontally to inspect every contribution
HOW TO GET ONE FROM THE OTHER
FORWARD · DETERMINISTIC
REVERSE · GENERALLY NON-UNIQUE
THE BANDWIDTH LEVER
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).
RADIO-SLAM EXPERIMENT
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.
These configure or document the run and make it reproducible.
The JSON preserves run context plus one structured record for each valid propagation path.
delay_s, doppler_hz, and departure/arrival theta (zenith) and phi (azimuth)vertex_xyz_mEach 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 elementsa[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[0, 16, 64]Σ |a[i]|² over antenna elements matches that list entry’s stored linear path gaina 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 axisSummary 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.
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 countSelected ray geometry is flattened into Parquet tables used to generate measurements and score results.
kind, x, y, z, amplitude_db, material, path_index, depth_index, interaction_type, path_bounce_countframe_index, x, y, zMonte 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.
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 bounceis_clutter, is_bs, source_path_index, source_bounce_count, bounce_x, bounce_y, bounce_z20260703; archived run counts must be read from that run’s summaryThe saved path ingredients can support later derivation, but the following are absent as experiment artifacts.
Paths.cir() return tensor; delays and path coefficients exist separately in the raw exportsPaths.taps() tensor h[n, ℓ]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
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.
[rx, rx_ant, tx, tx_ant, path, time][rx, rx_ant, tx, tx_ant, time, tap]# 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.Experiment again ↑
Taps say what a bandwidth-limited discrete receiver sees.
The experiment saved the path-resolved ingredients—not either derived output.