TruncatedChannelEstimator#

Note

  • Estimator constructor defaults mirror the settings used during benchmarking.

  • estimate_covariance() defaults mirror the settings used to estimate the covariance.

class sionna.bench.mimo_ofdm_chest.papers.edfors1996.TruncatedChannelEstimator(resource_grid: sionna.phy.ofdm.resource_grid.ResourceGrid, time_covariance: numpy.ndarray | torch.Tensor, interpolation_type: str = 'lin_time_avg', interpolator: sionna.phy.ofdm.channel_estimation.BaseChannelInterpolator | None = None, *, method: str = 'LS', num_taps: int | None = 64, chest_err_const: float = 0.308, precision: Literal['single', 'double'] | None = None, device: str | None = None)[source]#

Bases: sionna.phy.ofdm.channel_estimation.BasePilotChannelEstimator, sionna.phy.ofdm.channel_estimation._PilotGroupMixin

Channel estimator that leverages sparsity in the delay domain through truncation.

This estimator implements the methods proposed in:

  • Ove Edfors, Magnus Sandell, Jan-Jaap Van De Beek, Sarah Kate Wilson, and Per Ola Börjesson. Analysis of DFT-based channel estimators for OFDM. Tech. Report, 1996.

TL;DR

For each transmit stream and pilot-bearing OFDM symbol, the estimator first computes LS channel estimates on the active pilot subcarriers. It maps this pilot-frequency vector to the delay domain with a unitary IDFT, retains the num_taps coefficients with the largest powers according to time_covariance, filters the retained coefficients according to method, and sets all remaining coefficients to zero. A unitary DFT maps the result back to the pilot subcarriers, after which the configured Sionna interpolator reconstructs the complete resource grid.

The following methods are supported:

  • "LMMSE" applies the full selected-tap LMMSE matrix \(\mathbf{R}_L(\mathbf{R}_L+\sigma^2\mathbf{I})^{-1}\), corresponding to the paper’s Estimator A.

  • "diagonal LMMSE" applies an independent scalar LMMSE weight to each retained tap, corresponding to the paper’s Estimator B.

  • "LS" retains the selected delay-domain LS coefficients without shrinkage, corresponding to the paper’s Estimator C.

Supported System Geometry

The estimator supports different FFT sizes, OFDM-symbol counts, pilot-bearing OFDM-symbol positions, transmit-stream counts, and receive-antenna counts, provided that the following hold:

  • At least one active pilot group exists.

  • Every transmit-stream and pilot-symbol group contains the same number of active pilot subcarriers.

  • num_taps is between one and this common pilot-group length.

  • time_covariance is a square matrix whose dimension equals the common pilot-group length.

Receive antennas are processed independently.

Deviations from the Paper

  • The paper assumes known transmitted symbols on every OFDM subcarrier. For sparse pilot patterns, this implementation applies the paper’s DFT-domain estimators to each compact pilot-subcarrier vector.

  • The paper does not specify reconstruction from sparse pilots to a complete resource grid. This implementation delegates that step to a configurable Sionna interpolator.

  • The supplied delay-domain covariance is estimated empirically from the active channel model instead of being derived from the analytical channel model used in the paper.

  • When num_taps is None, the cyclic-prefix length, capped at the pilot-group length, is used. An explicit value may instead be selected through validation or tuning.

  • The paper does not specify detector-facing error variances, so the implementation returns err_var_scale * no, where the default value of err_var_scale was selected using Optuna.

Parameters:
  • resource_grid (ResourceGrid) – Resource grid defining the OFDM dimensions and pilot pattern.

  • time_covariance (Union[np.ndarray, torch.Tensor]) – Delay-domain channel covariance with shape [num_pilot_subcarriers, num_pilot_subcarriers].

  • interpolation_type (str) – Sionna interpolation policy. Ignored when interpolator is provided.

  • interpolator (Optional[BaseChannelInterpolator]) – Custom Sionna channel interpolator. If None, the interpolator selected by interpolation_type is used.

  • method (str) – DFT-domain estimation method. Must be "LMMSE", "diagonal LMMSE", or "LS".

  • num_taps (Optional[int]) – Number of delay-domain coefficients to retain. If None, use the cyclic-prefix length capped at the pilot-group length.

  • chest_err_const (float) – Non-negative scale applied to the LS-derived detector-facing error variance.

  • precision (Optional[Precision]) – Precision used for internal calculations and outputs. If None, precision is used.

  • device (Optional[str]) – Device used for tensor operations. If None, device is used.

Methods

estimate_at_pilot_locations(y_pilots: torch.Tensor, no: torch.Tensor) → tuple[torch.Tensor, torch.Tensor][source]#

Estimate denoised channels at Sionna pilot locations.

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.

Covariance Estimation#

sionna.bench.mimo_ofdm_chest.papers.edfors1996.asset.estimate_covariance(resource_grid: sionna.phy.ofdm.resource_grid.ResourceGrid, cfg: sionna.bench.mimo_ofdm_chest.configs.system_config.SystemConfig, *, asset_root: str | pathlib.Path, cov_num_iters: int = 1000, cov_batch_size: int = 64, seed: int = 42, overwrite: bool = False) → Tuple[numpy.ndarray, pathlib.Path][source]#

Estimate and persist an IDFT-domain channel covariance.

The function samples noiseless channels from the configured UMi channel model and gathers the active pilot subcarriers for every transmit stream and pilot-bearing OFDM symbol. Each resulting frequency-domain vector is transformed with a unitary IDFT. Their empirical second moments are then pooled into one covariance matrix,

\[\mathbf{R}_{\tau} = \frac{1}{N} \sum_{n=1}^{N} \mathbf{h}_{\tau,n}\mathbf{h}_{\tau,n}^{\mathsf{H}}.\]

Every realization contributes all compatible transmit-stream, receive-antenna, and pilot-symbol observations to the covariance estimate.

The covariance, its diagonal tap powers, and a manifest describing the generation recipe and compatible pilot geometry are written atomically beneath the explicitly supplied external asset root. The completed asset is strictly reloaded and validated before being returned.

Deviations from the Paper

  • The paper derives the covariance from its analytical channel and power-delay-profile model. This function instead estimates it empirically from the configured Sionna UMi channel model.

  • The paper assumes observations on every OFDM subcarrier. This function estimates covariance from the active pilot-subcarrier vectors used by the implemented sparse-pilot adaptation.

  • One covariance is pooled over all compatible transmit streams, receive antennas, and pilot-bearing OFDM symbols rather than estimating a separate covariance for each group.

Parameters:
  • resource_grid (sionna.phy.ofdm.resource_grid.ResourceGrid) – Resource grid defining the OFDM dimensions, pilot pattern, and ordered pilot-subcarrier groups.

  • cfg (sionna.bench.mimo_ofdm_chest.configs.system_config.SystemConfig) – System configuration defining the UMi channel, topology, antenna geometry, precision, and device.

  • asset_root (str | pathlib.Path) – External writable root beneath which the generated asset is stored.

  • cov_num_iters (int) – Number of independently generated Monte Carlo channel batches.

  • cov_batch_size (int) – Number of complete channel realizations generated in each Monte Carlo batch.

  • seed (int) – Random seed controlling topology and channel generation.

  • overwrite (bool) – If True, atomically replace an existing artifact with the same identity. If False, raise FileExistsError.

Returns:

The validated IDFT-domain covariance matrix with shape [num_pilot_subcarriers, num_pilot_subcarriers] and the path to its manifest.json file.

Hyperparameter Tuning#

sionna.bench.mimo_ofdm_chest.papers.edfors1996.tuning.run_tuning(*, study: str = 'taps', n_trials: int | None = None, num_mc_batches: int | None = None, batch_size: int | None = None, output_dir: str | pathlib.Path | None = None, tap_output_dir: str | pathlib.Path | None = None, asset_root: str | pathlib.Path = 'assets')[source]#

Algorithmic Tuning

The "taps" stage minimizes weighted NMSE for the LS method at -10, -5, 0, 5, and 10 dB. It runs 50 seeded TPE trials. Every trial evaluates three batches of four channels at each SNR using the frozen delay-covariance asset.

Parameter

Search space

num_taps

integer from 1 through the number of frequency pilots in one pilot-bearing OFDM symbol; the canonical maximum is 156

Only the LS method determines num_taps. The selected value is then used unchanged by the LS, diagonal-LMMSE, and full-LMMSE methods.

The "taps-validation" stage compares the integer winner with the existing tap-count default using 63 batches of four channels per SNR.

Error-Variance Calibration

The "variance" stage tunes one shared chest_err_const logarithmically from 1e-3 through 1 using 10 TPE trials. Its objective is the equally weighted mean codeword BLER of the LS, diagonal-LMMSE, and full-LMMSE methods at 10 dB. Each method is evaluated over 63 batches of four channels using the selected common tap count.

The "variance-validation" stage compares the rounded winner with the existing shared scale using the same equal-method objective.

Parameters:
  • study (str) – Stage to execute: "taps", "taps-validation", "variance", or "variance-validation".

  • n_trials (int | None) – Trial-count override. If None, use 50 for tap tuning and 10 for variance calibration. Validation stages do not run Optuna trials.

  • num_mc_batches (int | None) – Monte Carlo budget override. If None, use three batches per SNR for tap tuning and 63 for validation and variance calibration.

  • batch_size (int | None) – Channels per batch. If None, use the canonical configuration value of four.

  • output_dir (str | pathlib.Path | None) – Output directory override for the selected stage.

  • tap_output_dir (str | pathlib.Path | None) – Directory containing the tap-tuning and paired-validation evidence required by variance calibration.

  • asset_root (str | pathlib.Path) – Root containing the frozen delay-covariance asset used by all tuning and validation stages.

Returns:

An Optuna study for tuning stages or a dictionary containing paired-validation results for validation stages.