LSChannelEstimator#
- class sionna.phy.ofdm.LSChannelEstimator(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.ofdm.channel_estimation.BaseChannelEstimatorLeast-squares (LS) channel estimation for OFDM MIMO systems.
After LS channel estimation at the pilot positions, the channel estimates and error variances are interpolated across the entire resource grid using a specified interpolation function.
For simplicity, the underlying algorithm is described for a vectorized observation, where we have a nonzero pilot for all elements to be estimated. The actual implementation works on a full OFDM resource grid with sparse pilot patterns. The following model is assumed:
\[\mathbf{y} = \mathbf{h}\odot\mathbf{p} + \mathbf{n}\]where \(\mathbf{y}\in\mathbb{C}^{M}\) is the received signal vector, \(\mathbf{p}\in\mathbb{C}^M\) is the vector of pilot symbols, \(\mathbf{h}\in\mathbb{C}^{M}\) is the channel vector to be estimated, and \(\mathbf{n}\in\mathbb{C}^M\) is a zero-mean noise vector whose elements have variance \(N_0\). The operator \(\odot\) denotes element-wise multiplication.
The channel estimate \(\hat{\mathbf{h}}\) and error variances \(\sigma^2_i\), \(i=0,\dots,M-1\), are computed as
\[\begin{split}\hat{\mathbf{h}} &= \mathbf{y} \odot \frac{\mathbf{p}^\star}{\left|\mathbf{p}\right|^2} = \mathbf{h} + \tilde{\mathbf{h}}\\ \sigma^2_i &= \mathbb{E}\left[\tilde{h}_i \tilde{h}_i^\star \right] = \frac{N_0}{\left|p_i\right|^2}.\end{split}\]The channel estimates and error variances are then interpolated across the entire resource grid.
- 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_ls – [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_ls, torch.float. Channel estimation error variance across the entire resource grid for all transmitters and streams.
Methods
- 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.