CDL#

class sionna.phy.channel.tr38901.CDL(model: str, delay_spread: float, carrier_frequency: float, ut_array=None, bs_array=None, direction: str = 'downlink', ut_orientation: torch.Tensor | None = None, bs_orientation: torch.Tensor | None = None, ut_velocity: torch.Tensor | None = None, min_speed: float = 0.0, max_speed: float = 0.0, normalize_delays: bool = True, precision: str | None = None, device: str | None = None)[source]#

Bases: sionna.phy.channel.channel_model.ChannelModel

Clustered delay line (CDL) channel model from the 3GPP [TR38901] specification

The power delay profiles (PDPs) are normalized to have a total energy of one.

If a minimum speed and a maximum speed are specified such that the maximum speed is greater than the minimum speed, then UTs speeds are randomly and uniformly sampled from the specified interval for each link and each batch example.

The CDL model only works for systems with a single transmitter and a single receiver. The transmitter and receiver can be equipped with multiple antennas.

The channel coefficient generation is done following the procedure described in sections 7.7.1 and 7.7.3.

Parameters:
  • model (str) – CDL model to use. Must be "A", "B", "C", "D", or "E".

  • delay_spread (float) – RMS delay spread [s]. Ignored if normalize_delays is set to False.

  • carrier_frequency (float) – Carrier frequency [Hz]

  • ut_array – Antenna array used by the UTs. All UTs share the same antenna array configuration.

  • bs_array – Antenna array used by the BSs. All BSs share the same antenna array configuration.

  • direction (str) – Link direction. Must be "uplink" or "downlink".

  • ut_orientation (torch.Tensor | None) – Orientation of the UT. If set to None, [\(\pi\), 0, 0] is used. Shape [3] or [batch size, 3].

  • bs_orientation (torch.Tensor | None) – Orientation of the BS. If set to None, [0, 0, 0] is used. Shape [3] or [batch size, 3].

  • ut_velocity (torch.Tensor | None) – UT velocity vector [m/s]. If set to None, velocities are randomly sampled using min_speed and max_speed. Shape [3] or [batch size, 3].

  • min_speed (float) – Minimum speed [m/s]. Ignored if ut_velocity is not None. Defaults to 0.

  • max_speed (float) – Maximum speed [m/s]. Ignored if ut_velocity is not None. Defaults to 0.

  • normalize_delays (bool) – If set to True, the path delays are normalized such that the delay of the first path is zero. Defaults to True.

  • precision (str | None) – Precision used for internal calculations and outputs. If set to None, precision is used.

  • device (str | None) – Device for computation (e.g., "cpu", "cuda:0"). If None, device is used.

Inputs:
  • batch_sizeint. Batch size.

  • num_time_stepsint. Number of time steps.

  • sampling_frequencyfloat. Sampling frequency [Hz].

Outputs:
  • a – [batch size, num_rx = 1, num_rx_ant, num_tx = 1, num_tx_ant, num_paths, num_time_steps], torch.complex. Path coefficients.

  • tau – [batch size, num_rx = 1, num_tx = 1, num_paths], torch.float. Path delays [s].

Examples

The following code snippet shows how to setup a CDL channel model assuming an OFDM waveform:

from sionna.phy.channel.tr38901 import Antenna, AntennaArray, CDL

# Antenna array configuration for the transmitter and receiver
bs_array = AntennaArray(
    antenna=Antenna(pattern="38.901", polarization="dual"),
    num_rows=4,
    num_cols=4,
)
ut_array = AntennaArray(
    antenna=Antenna(pattern="omni", polarization="single"),
    num_rows=1,
    num_cols=1,
)

# CDL channel model
cdl = CDL(
    model="A",
    delay_spread=300e-9,
    carrier_frequency=3.5e9,
    ut_array=ut_array,
    bs_array=bs_array,
    direction="uplink",
)

# Generate channel impulse response
a, tau = cdl(batch_size=64, num_time_steps=100, sampling_frequency=1e6)

Notes

The following tables from [TR38901] provide typical values for the delay spread.

Model

Delay spread [ns]

Very short delay spread

\(10\)

Short delay spread

\(30\)

Nominal delay spread

\(100\)

Long delay spread

\(300\)

Very long delay spread

\(1000\)

Delay spread [ns]

Frequency [GHz]

2

6

15

28

39

60

70

Indoor office

Short delay profile

20

16

16

16

16

16

16

Normal delay profile

39

30

24

20

18

16

16

Long delay profile

59

53

47

43

41

38

37

UMi Street-canyon

Short delay profile

65

45

37

32

30

27

26

Normal delay profile

129

93

76

66

61

55

53

Long delay profile

634

316

307

301

297

293

291

UMa

Short delay profile

93

93

85

80

78

75

74

Normal delay profile

363

363

302

266

249

228

221

Long delay profile

1148

1148

955

841

786

720

698

RMa / RMa O2I

Short delay profile

32

32

N/A

N/A

N/A

N/A

N/A

Normal delay profile

37

37

N/A

N/A

N/A

N/A

N/A

Long delay profile

153

153

N/A

N/A

N/A

N/A

N/A

UMi / UMa O2I

Normal delay profile

242

Long delay profile

616

Methods

allocate_for_batch_size(batch_size: int, num_time_steps: int = 100) None[source]#

Pre-allocate all tensors for CUDA graph compatibility.

Must be called before using with torch.compile(mode=”max-autotune”) or CUDA graphs.

Parameters:
  • batch_size (int) – Batch size to allocate for

  • num_time_steps (int) – Number of time steps to allocate for