KroneckerPilotPattern#

class sionna.phy.ofdm.KroneckerPilotPattern(resource_grid: ResourceGrid, pilot_ofdm_symbol_indices: List[int], normalize: bool = True, seed: int = 0, precision: Literal['single', 'double'] | None = None, device: str | None = None)[source]#

Bases: sionna.phy.ofdm.pilot_pattern.PilotPattern

Simple orthogonal pilot pattern with Kronecker structure.

This function generates an instance of PilotPattern that allocates non-overlapping pilot sequences for all transmitters and streams on specified OFDM symbols. As the same pilot sequences are reused across those OFDM symbols, the resulting pilot pattern has a frequency-time Kronecker structure. This structure enables a very efficient implementation of the LMMSE channel estimator. Each pilot sequence is constructed from randomly drawn QPSK constellation points.

Parameters:
  • resource_grid (ResourceGrid) – Resource grid to be used

  • pilot_ofdm_symbol_indices (List[int]) – List of integers defining the OFDM symbol indices that are reserved for pilots

  • normalize (bool) – If True, the pilots are normalized to an average energy of one across the last dimension. Defaults to True.

  • seed (int) – Seed for the generation of the pilot sequence. Different seed values lead to different sequences. Defaults to 0.

  • precision (Literal['single', 'double'] | None) – Precision used for internal calculations and outputs. If set to None, precision is used.

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

Notes

It is required that the resource_grid’s property num_effective_subcarriers is an integer multiple of num_tx * num_streams_per_tx. This condition is required to ensure that all transmitters and streams get non-overlapping pilot sequences. For a large number of streams and/or transmitters, the pilot pattern becomes very sparse in the frequency domain.

Examples

from sionna.phy.ofdm import ResourceGrid

rg = ResourceGrid(num_ofdm_symbols=14,
                  fft_size=64,
                  subcarrier_spacing=30e3,
                  num_tx=4,
                  num_streams_per_tx=2,
                  pilot_pattern="kronecker",
                  pilot_ofdm_symbol_indices=[2, 11])
rg.pilot_pattern.show()