Paths
A propagation path\(i\) starts at a transmit antenna and ends at a receive antenna. It is described byits channel coefficient\(a_i\) and delay\(\tau_i\), as well as theangles of departure\((\theta_{\text{T},i}, \varphi_{\text{T},i})\)and arrival\((\theta_{\text{R},i}, \varphi_{\text{R},i})\).For more detail, see thePrimer on Electromagnetics.
In Sionna, paths are computed with the help of a path solver (such asPathSolver)which returns an instance ofPaths.Paths can be visualized by providing them as arguments to the functionsrender(),render_to_file(), orpreview().
Channel impulse responses (CIRs) can be obtained withcir() which canthen be used for link-level simulations. This is for example done in theSionna Ray Tracing Tutorial.
- classsionna.rt.Paths(scene,src_positions,tgt_positions,tx_velocities,rx_velocities,synthetic_array,paths_buffer,rel_ant_positions_tx,rel_ant_positions_rx)[source]
Stores the simulated propagation paths
Paths are generated for the loaded scene using a path solver, such as
PathSolver. Please refer to the documentation of thisclass for further details.- Parameters:
scene (
sionna.rt.scene.Scene) – Scene for which paths are computedsrc_positions (
mitsuba.Point3f) – Positions of the sourcestgt_positions (
mitsuba.Point3f) – Positions of the targetstx_velocities (
mitsuba.Vector3f) – Velocities of the transmittersrx_velocities (
mitsuba.Vector3f) – Velocities of the receiverssynthetic_array (
bool) – If set toTrue, then the antenna arrays are applied syntheticallypaths_buffer (
sionna.rt.path_solvers.paths_buffer.PathsBuffer) – Paths buffer storing the computed pathsrel_ant_positions_tx (
mitsuba.Point3f|None) – Positions of the array elements with respect to the center of the transmitters. Only required if synthetic arrays are used.rel_ant_positions_rx (
mitsuba.Point3f|None) – Positions of the array elements with respect to the center of the receivers. Only required if synthetic arrays are used.
- propertya
Real and imaginary components of the channel coefficients [unitless, linear scale]
- Type:
Tuple[mi.TensorXf[num_rx,num_rx_ant,num_tx,num_tx_ant,num_paths],mi.TensorXf[num_rx,num_rx_ant,num_tx,num_tx_ant,num_paths]]
- cfr(frequencies,sampling_frequency=1.0,num_time_steps=1,normalize_delays=True,normalize=False,reverse_direction=False,out_type='drjit')[source]
Compute the frequency response of the channel at
frequencies.Optionally, time evolution of the channel can be simulated basedon the Doppler shifts of all paths.Given a channel impulse response\((a_i^\text{b}(t), \tau_{i}), 0 \leq i \leq M-1\), as computedby
cir(),the channel frequency response for the frequency\(f\)is computed as follows:\[\widehat{h}(f, t) = \sum_{i=0}^{M-1}a_i^\text{b}(t) e^{-j2\pi f \tau_{i}}\]The time evolution of the channel is simulated as described inthe documentation of
cir().- Parameters:
frequencies (
drjit.cuda.ad.Float) – Frequencies [Hz] at which to compute thechannel responsesampling_frequency (
float) – Frequency [Hz] at which the channel impulseresponse is samplednum_time_steps (
int) – Number of time stepsnormalize_delays (
bool) – If set toTrue, path delays are normalizedsuch that the first path between any pair of antennas of atransmitter and receiver arrives at\(\tau = 0\).normalize (
bool) – If set toTrue, the channel is normalized acrosstime and frequencies to ensure unit average energy.reverse_direction (
bool) – If set to True, swaps receivers andtransmittersout_type (
typing.Literal['drjit','jax','numpy','tf','torch']) – Name of the desired output type.Currently supported areDr.Jit(“drjit),Numpy (“numpy”),Jax (“jax”),TensorFlow (“tf”),andPyTorch (“torch”).
- Returns:
Real and imaginary components of the baseband equivalent channelcoefficients\(a^{\text{b}}_{i}\)
- Return type:
Shape: [num_rx, num_rx_ant, num_tx, num_tx_ant,num_time_steps, num_frequencies],Type:
Tuple[mi.TensorXf|np.array|jax.array|tf.Tensor|torch.tensor
- cir(*,sampling_frequency=1.0,num_time_steps=1,normalize_delays=True,reverse_direction=False,out_type='drjit')[source]
Returns the baseband-equivalent channel impulse response(28)which can be used for link simulations by other Sionna components.Optionally, time evolution of the channel can be simulated basedon the Doppler shifts of all paths.
The baseband equivalent channel coefficient\(a^{\text{b}}_{i}(t)\)at time\(t\) is computed as :
\[a^{\text{b}}_{i}(t) = \underbrace{a_{i} e^{-j2 \pi f \tau_{i}}}_{a^{\text{b}}_{i} } \underbrace{e^{j 2\pi f_{\Delta, i} t}}_{\text{Doppler phase shift}}\]where\(i\) is the index of an arbitrary path,\(a_{i}\)is the passband path coefficient (
a),\(\tau_{i}\) is the path delay (tau),\(f\) is the carrier frequency, and\(f_{\Delta, i}\) is theDoppler shift of the\(i\text{th}\) path.- Parameters:
sampling_frequency (
float) – Frequency [Hz] at which the channel impulseresponse is samplednum_time_steps (
int) – Number of time stepsnormalize_delays (
bool) – If set toTrue, path delays are normalizedsuch that the first path between any pair of antennas of atransmitter and receiver arrives at\(\tau = 0\)reverse_direction (
bool) – If set to True, swaps receivers andtransmittersout_type (
typing.Literal['drjit','jax','numpy','tf','torch']) –Name of the desired output type.Currently supported areDr.Jit(“drjit),Numpy (“numpy”),Jax (“jax”),TensorFlow (“tf”),andPyTorch (“torch”).
- Returns:
Real and imaginary components of the baseband equivalent channelcoefficients\(a^{\text{b}}_{i}\)
- Return type:
Shape: [num_rx, num_rx_ant, num_tx,num_tx_ant, num_paths, num_time_steps],Type:
Tuple[mi.TensorXf,mi.TensorXf]|np.array|jax.array|tf.Tensor|torch.tensor- Returns:
Paths delays\(\tau_{i}\) [s]
- Return type:
Shape: [num_rx, num_rx_ant, num_tx,num_tx_ant, num_paths] or [num_rx, num_tx, num_paths],Type:
mi.TensorXf|np.array|jax.array|tf.Tensor|torch.tensor
- propertydoppler
Doppler shift for each path
To understand how Doppler shifts are computed, let us consider a single propagation path undergoing\(n\) scattering processes, e.g., reflection, diffuse scattering,refraction, as shown in the figure below.

The object on which lies the\(i\text{th}\) scattering point has the velocity vector\(\hat{\mathbf{v}}_i\) and the outgoing ray direction at this point isdenoted\(\hat{\mathbf{k}}_i\). The first and last point correspond to the transmitterand receiver, respectively. We therefore have
\[\begin{split}\hat{\mathbf{k}}_0 &= \hat{\mathbf{r}}(\theta_{\text{T}}, \varphi_{\text{T}})\\\hat{\mathbf{k}}_{n} &= -\hat{\mathbf{r}}(\theta_{\text{R}}, \varphi_{\text{R}})\end{split}\]where\((\theta_{\text{T}}, \varphi_{\text{T}})\) are the AoDs,\((\theta_{\text{R}}, \varphi_{\text{R}})\) are the AoAs, and\(\hat{\mathbf{r}}(\theta,\varphi)\) is defined in(1).
If the transmitter emits a signal with frequency\(f\), the receiverwill observe the signal at frequency\(f'=f + f_\Delta\), where\(f_\Delta\) is the Dopplershift, which can be computed as[Wiffen2018]
\[f' = f \prod_{i=0}^n \frac{1 - \frac{\mathbf{v}_{i+1}^\mathsf{T}\hat{\mathbf{k}}_i}{c}}{1 - \frac{\mathbf{v}_{i}^\mathsf{T}\hat{\mathbf{k}}_i}{c}}.\]Under the assumption that\(\lVert \mathbf{v}_i \rVert\ll c\), we can apply the Taylor expansion\((1-x)^{-1}\approx 1+x\), for\(x\ll 1\), to the previous equationto obtain
\[\begin{split}f' &\approx f \prod_{i=0}^n \left(1 - \frac{\mathbf{v}_{i+1}^\mathsf{T}\hat{\mathbf{k}}_i}{c}\right)\left(1 + \frac{\mathbf{v}_{i}^\mathsf{T}\hat{\mathbf{k}}_i}{c}\right)\\ &\approx f \left(1 + \sum_{i=0}^n \frac{\mathbf{v}_{i}^\mathsf{T}\hat{\mathbf{k}}_i -\mathbf{v}_{i+1}^\mathsf{T}\hat{\mathbf{k}}_i}{c} \right)\end{split}\]where the second line results from ignoring terms in\(c^{-2}\). Solving for\(f_\Delta\), grouping terms with the same\(\mathbf{v}_i\) together, and using\(f=c/\lambda\), we obtain
\[f_\Delta = \frac{1}{\lambda}\left(\mathbf{v}_{0}^\mathsf{T}\hat{\mathbf{k}}_0 - \mathbf{v}_{n+1}^\mathsf{T}\hat{\mathbf{k}}_n + \sum_{i=1}^n \mathbf{v}_{i}^\mathsf{T}\left(\hat{\mathbf{k}}_i-\hat{\mathbf{k}}_{i-1} \right) \right) \qquad \text{[Hz]}.\]- Type:
mi.TensorXf[num_rx,num_rx_ant,num_tx,num_tx_ant,num_paths]or[num_rx,num_tx,num_paths]:
- propertyinteractions
Interaction type represented using
InteractionType- Type:
mi.TensorXu[max_depth,num_rx,num_rx_ant,num_tx,num_tx_ant,num_paths]or[max_depth,num_rx,num_tx,num_paths]
- propertynum_rx
Number of receivers
- Type:
int
- propertynum_tx
Number of transmitters
- Type:
int
- propertyobjects
IDs of the intersected objects. Invalid objects are represented by
INVALID_SHAPE.- Type:
mi.TensorXu[max_depth,num_rx,num_rx_ant,num_tx,num_tx_ant,num_paths]or[max_depth,num_rx,num_tx,num_paths]
- propertyphi_r
Azimuth angles of arrival [rad]
- Type:
mi.TensorXf[num_rx,num_rx_ant,num_tx,num_tx_ant,num_paths]or[num_rx,num_tx,num_paths]
- propertyphi_t
Azimuth angles of departure [rad]
- Type:
mi.TensorXf[num_rx,num_rx_ant,num_tx,num_tx_ant,num_paths]or[num_rx,num_tx,num_paths]
- propertyprimitives
Indices of the intersected primitives. Invalid primitives arerepresented by
INVALID_PRIMITIVE.- Type:
mi.TensorXu[max_depth,num_rx,num_rx_ant,num_tx,num_tx_ant,num_paths]or[max_depth,num_rx,num_tx,num_paths]
- propertyrx_array
Antenna array used by receivers
- Type:
- propertysources
Positions of the paths sources. If syntheticarrays are not used (
synthetic_arrayisFalse),then every transmit antenna is modeled as a source of paths.Otherwise, transmitters are modelled as if they had a single antennalocated at theirposition. The channelresponses for each individual antenna of the arrays are then computed“synthetically” by applying appropriate phase shifts.- Type:
mi.Point3f
- propertysynthetic_array
Flag indicating if synthetic arrays were used to trace the paths
- Type:
bool
- taps(bandwidth,l_min,l_max,sampling_frequency=None,num_time_steps=1,normalize=False,normalize_delays=True,reverse_direction=False,out_type='drjit')[source]
Returns the channel taps forming the discrete complexbaseband-equivalent channel impulse response
This function assumes that a sinc filter is used for pulse shaping andreceive filtering. Therefore, given a channel impulse response\((a_{i}^\text{b}(t), \tau_{i}), 0 \leq i \leq M-1\) (which can becomputed by
cir()), the\(\ell\text{th}\) channel tap at sample instance\(n\)is computed as follows (see (Eq. 2.34)[Tse]):\[\bar{h}_{n, \ell}= \sum_{i=0}^{M-1} a_{i}^\text{b}\left(\frac{n}{W}\right) \text{sinc}\left( \ell - W\tau_{m} \right)\]for\(\ell\) ranging from
l_mintol_max, and where\(W\) isthebandwidth.This function allows for an arbitrary
sampling_frequencyat whichthe channel taps are sampled. By default, it is equal to thebandwidth.- Parameters:
bandwidth (
float) – Bandwidth [Hz] to which the channel impulse responsewill be limitedl_min (
int) – Smallest time-lag for the discrete complexbaseband-equivalent channel (\(L_{\text{min}}\))l_max (
int) – Largest time-lag for the discrete complexbaseband-equivalent channel (\(L_{\text{max}}\))sampling_frequency (
typing.Optional[float]) – Frequency [Hz] at which the channel impulseresponse is sampled. If set toNone, thebandwidthis usedinstead.num_time_steps (
int) – Number of time stepsnormalize (
bool) – If set toTrue, the channel is normalized such thatthe average total energy of the channel taps is equal to one.normalize_delays (
bool) – If set toTrue, path delays are normalizedsuch that the first path between any pair of antennas of atransmitter and receiver arrives at\(\tau = 0\).reverse_direction (
bool) – If set to True, swaps receivers andtransmittersout_type (
typing.Literal['drjit','jax','numpy','tf','torch']) –Name of the desired output type.Currently supported areDr.Jit(“drjit),Numpy (“numpy”),Jax (“jax”),TensorFlow (“tf”),andPyTorch (“torch”).
- Returns:
Channel tap coefficients
- Return type:
Shape: [num_rx, num_rx_ant, num_tx, num_tx_ant,num_time_steps, l_max - l_min + 1],Type:
Tuple[mi.TensorXf,mi.TensorXf]|np.array|jax.array|tf.Tensor|torch.tensor
- propertytargets
Positions of the paths targets. If syntheticarrays are not used (
synthetic_arrayisFalse),then every receiver antenna is modeled as a source of paths.Otherwise, receivers are modelled as if they had a single antennalocated at theirposition. The channelresponses for each individual antenna of the arrays are then computed“synthetically” by applying appropriate phase shifts.- Type:
mi.Point3f
- propertytau
Paths delays [s]
- Type:
mi.TensorXf[num_rx,num_rx_ant,num_tx,num_tx_ant,num_paths]or[num_rx,num_tx,num_paths]
- propertytheta_r
Zenith angles of arrival [rad]
- Type:
mi.TensorXf[num_rx,num_rx_ant,num_tx,num_tx_ant,num_paths]or[num_rx,num_tx,num_paths]
- propertytheta_t
Zenith angles of departure [rad]
- Type:
mi.TensorXf[num_rx,num_rx_ant,num_tx,num_tx_ant,num_paths]or[num_rx,num_tx,num_paths]
- propertytx_array
Antenna array used by transmitters
- Type:
- propertyvalid
Flags indicating valid paths
- Type:
mi.TensorXb[num_rx,num_rx_ant,num_tx,num_tx_ant,num_paths]
- propertyvertices
Paths’ vertices, i.e., the interaction points of the paths with thescene
- Type:
mi.TensorXf[max_depth,num_rx,num_rx_ant,num_tx,num_tx_ant,num_paths,3]or[max_depth,num_rx,num_tx,num_paths,3]
Constants
- classsionna.rt.constants.InteractionType[source]
Constants representing the type of interaction
- DIFFRACTION=8
Diffraction
- DIFFUSE=2
Diffuse reflection
- NONE=0
No interaction
- REFRACTION=4
Refraction
- SPECULAR=1
Specular reflection
- sionna.rt.constants.INVALID_SHAPE=np.uint32(4294967295)
Constant representing an invalid shape
- sionna.rt.constants.INVALID_PRIMITIVE=np.uint32(4294967295)
Constant representing an invalid primitive
- References:
- [Wiffen2018]
F. Wiffen et al., “Comparison of OTFS and OFDM in Ray Launched sub-6 GHz and mmWave Line-of-Sight Mobility Channels”, Proc. IEEE Int. Sym. Personal, Indoor and Mobile Radio Commun. (PIMRC), Bologna, Italy, Sep. 2018.