cir_to_time_channel#

sionna.phy.channel.cir_to_time_channel(bandwidth: float, a: torch.Tensor, tau: torch.Tensor, l_min: int, l_max: int, normalize: bool = False) torch.Tensor[source]#

Compute the channel taps forming the discrete complex-baseband representation of the channel from the channel impulse response (a, tau)

This function assumes that a sinc filter is used for pulse shaping and receive filtering. Therefore, given a channel impulse response \((a_{m}(t), \tau_{m}), 0 \leq m \leq M-1\), the channel taps are computed as follows:

\[\bar{h}_{b, \ell} = \sum_{m=0}^{M-1} a_{m}\left(\frac{b}{W}\right) \text{sinc}\left( \ell - W\tau_{m} \right)\]

for \(\ell\) ranging from l_min to l_max, and where \(W\) is the bandwidth.

Parameters:
  • bandwidth (float) – Bandwidth [Hz]

  • a (torch.Tensor) – Path coefficients, shape [batch size, num_rx, num_rx_ant, num_tx, num_tx_ant, num_paths, num_time_steps]

  • tau (torch.Tensor) – Path delays [s], shape [batch size, num_rx, num_tx, num_paths] or [batch size, num_rx, num_rx_ant, num_tx, num_tx_ant, num_paths]

  • l_min (int) – Smallest time-lag for the discrete complex baseband channel (\(L_{\text{min}}\))

  • l_max (int) – Largest time-lag for the discrete complex baseband channel (\(L_{\text{max}}\))

  • normalize (bool) – If set to True, the channel is normalized over the block size to ensure unit average energy per time step

Outputs:

hm – [batch size, num_rx, num_rx_ant, num_tx, num_tx_ant, num_time_steps, l_max - l_min + 1], torch.complex. Channel taps coefficients.

Examples

import torch
from sionna.phy.channel import cir_to_time_channel

# Create dummy CIR
batch_size, num_paths, num_time_steps = 2, 4, 10
a = torch.randn(batch_size, 1, 1, 1, 1, num_paths, num_time_steps, dtype=torch.complex64)
tau = torch.rand(batch_size, 1, 1, num_paths) * 1e-6

# Compute time channel
h_t = cir_to_time_channel(20e6, a, tau, l_min=-6, l_max=20)
print(h_t.shape)
# torch.Size([2, 1, 1, 1, 1, 10, 27])