BaseChannelEstimator#
- class sionna.phy.ofdm.BaseChannelEstimator(resource_grid: sionna.phy.ofdm.resource_grid.ResourceGrid, interpolation_type: str = 'nn', interpolator: sionna.phy.ofdm.channel_estimation.BaseChannelInterpolator | None = None, precision: Literal['single', 'double'] | None = None, device: str | None = None, **kwargs)[source]#
Bases:
sionna.phy.block.BlockAbstract block for implementing an OFDM channel estimator.
Any block that implements an OFDM channel estimator must implement this class and its
estimate_at_pilot_locations()abstract method.This class extracts the pilots from the received resource grid
y, calls theestimate_at_pilot_locations()method to estimate the channel for the pilot-carrying resource elements, and then interpolates the channel to compute channel estimates for the data-carrying resource elements using the interpolation method specified byinterpolation_typeor theinterpolatorobject.- Parameters:
resource_grid (sionna.phy.ofdm.resource_grid.ResourceGrid) – Resource grid
interpolation_type (str) – The interpolation method to be used. It is ignored if
interpolatoris not None. Available options areNearestNeighborInterpolator("nn"),LinearInterpolatorwithout ("lin") or with averaging across OFDM symbols ("lin_time_avg").interpolator (BaseChannelInterpolator | None) – An instance of
BaseChannelInterpolator, such asLMMSEInterpolator, or None. In the latter case, the interpolator specified byinterpolation_typeis used. Otherwise, theinterpolatoris used andinterpolation_typeis ignored.precision (Literal['single', 'double'] | None) – Precision used for internal calculations and outputs. If set to None,
precisionis used.device (str | None) – Device for tensor operations. If None,
deviceis used.
- Inputs:
y – [batch_size, num_rx, num_rx_ant, num_ofdm_symbols, fft_size], torch.complex. Observed resource grid.
no – [batch_size, num_rx, num_rx_ant] or only the first n>=0 dims, torch.float. Variance of the AWGN.
- Outputs:
h_hat – [batch_size, num_rx, num_rx_ant, num_tx, num_streams_per_tx, num_ofdm_symbols, fft_size], torch.complex. Channel estimates across the entire resource grid for all transmitters and streams.
err_var – Same shape as
h_hat, torch.float. Channel estimation error variance across the entire resource grid for all transmitters and streams.
Examples
import torch from sionna.phy.ofdm import ResourceGrid, LSChannelEstimator rg = ResourceGrid(num_ofdm_symbols=14, fft_size=64, subcarrier_spacing=30e3, num_tx=2, num_streams_per_tx=2, pilot_pattern="kronecker", pilot_ofdm_symbol_indices=[2, 11]) estimator = LSChannelEstimator(rg, interpolation_type="lin") batch_size = 16 y = torch.randn(batch_size, 1, 4, 14, 64, dtype=torch.complex64) no = torch.ones(1) * 0.1 h_hat, err_var = estimator(y, no) print(h_hat.shape) # torch.Size([16, 1, 4, 2, 2, 14, 60])
Methods
- abstractmethod estimate_at_pilot_locations(y_pilots: torch.Tensor, no: torch.Tensor) Tuple[torch.Tensor, torch.Tensor][source]#
Estimate the channel for the pilot-carrying resource elements.
This is an abstract method that must be implemented by a concrete OFDM channel estimator that implements this class.
- Parameters:
y_pilots (torch.Tensor) – [batch_size, num_rx, num_rx_ant, num_tx, num_streams, num_pilot_symbols], torch.complex. Observed signals for the pilot-carrying resource elements.
no (torch.Tensor) – [batch_size, num_rx, num_rx_ant] or only the first n>=0 dims, torch.float. Variance of the AWGN.
- Outputs:
h_hat – [batch_size, num_rx, num_rx_ant, num_tx, num_streams, num_pilot_symbols], torch.complex. Channel estimates for the pilot-carrying resource elements.
err_var – Same shape as
h_hat, torch.float. Channel estimation error variance for the pilot-carrying resource elements.