time_to_doppler_channel#

sionna.phy.channel.time_to_doppler_channel(h_t: torch.Tensor) → torch.Tensor[source]#

Compute the delay-Doppler channel from a uniformly sampled time-delay channel

Given channel taps \(\bar{h}_{b,\ell}\), the delay-Doppler channel is computed as

\[\tilde{h}_{q,\ell} = \frac{1}{S}\sum_{b=0}^{S-1}\bar{h}_{b,\ell} e^{-j\frac{2\pi bq}{S}},\]

where \(S\) is num_time_steps, \(b\) is the time-step index, \(q\) is the Doppler-bin index, and \(\ell\) is the time-lag index.

Parameters:

h_t (torch.Tensor) – Uniformly sampled time-delay channel, shape […, num_time_steps, num_time_lags]

Outputs:

h_dd – […, num_doppler_bins, num_time_lags], torch.complex. Delay-Doppler channel with centered Doppler-bin ordering, where num_doppler_bins = num_time_steps.

Notes

The zero-Doppler bin is shifted to the center of the Doppler dimension. The output stores the bin for Doppler index \(q\), ranging from \(-\lfloor S/2\rfloor\) to \(S-\lfloor S/2\rfloor-1\), at index \(q+\lfloor S/2\rfloor\). A positive Doppler shift, i.e., a path coefficient varying as \(e^{j2\pi\nu t}\) with \(\nu>0\), appears at a positive Doppler index.

Due to the \(1/S\) normalization, a tap with a Doppler shift on the frequency grid appears in a single bin equal to its coefficient, and the channel energy is preserved, \(\sum_{q}|\tilde{h}_{q,\ell}|^2 = \frac{1}{S}\sum_{b=0}^{S-1}|\bar{h}_{b,\ell}|^2\), i.e., the energy summed over the Doppler bins equals the energy averaged over the time steps.

This function does not compute physical Doppler frequencies. The frequency of each output bin is obtained from time_frequency_vector(), called with the time spacing between consecutive channel observations, whose frequency vector uses the same centered ordering.

See also ofdm_to_time_channel() and ofdm_to_delay_doppler_channel().

Examples

import torch
from sionna.phy.channel import time_to_doppler_channel

h_t = torch.ones(2, 8, 5, dtype=torch.complex64)
h_dd = time_to_doppler_channel(h_t)
print(h_dd.shape)
# torch.Size([2, 8, 5])