Channel Estimation and Equalization for PDCCH

This module provides the channel estimator and equalizer for physical downlink control channel (PDCCH). The implementation consists of 3 parts:

  1. Channel estimation

  2. Channel interpolation

  3. Symbol Equalization

The channel estimator supports zero-forcing (ZF) and minimum mean square error (MMSE) estimator. The channel estimation is followed by interpolating the channel at time-frequency locations where information symbols are transmitted. Currently, only nearest neighbour interpolator is supported but it will soon be extended to linear and 2D spline interpolator as well. Finally once the channel is estimated at the symbol location, the equalization is performed to offset the phase and scaling effect of the wireless channels.

Note

Channel estimator supports zero-forcing (ZF) and minimum mean square error (MMSE) estimation methods.

Note

Currently, only nearest neighbour interpolator is supported but it will soon be extended to linear and 2D spline interpolator as well.

Note

For symbol Equalization, Least square method is used.


When Channel estimates are not available

AL            = 2
interleaverType = "interleaved"
L             = 2
R             = 2
nshift        = 204

channelEst    = ChannelEstimationAndEqualizationPDCCH(AL, interleaverType, L, R, nshift)

rxGrid        = np.random.randn(3, 4096) + 1j*np.random.randn(3, 4096) # SSB grid of size (4, 240)
fdra          = np.array([0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
                          0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0,
                          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0])
duration      = 1
slotNumber    = 1
scramblingID  = 1
Hp            = np.random.randn(3, 4096) + 1j*np.random.randn(3, 4096)
equalized_Sym = channelEst(rxGrid, fdra,
                           duration, slotNumber, scramblingID, Hf = Hp)

print(equalized_Sym.shape)
(108,)

When Channel estimates are available

AL            = 2
interleaverType = "non-interleaved"
L             = 2
R             = 2
nshift        = 204

channelEst    = ChannelEstimationAndEqualizationPDCCH(AL, interleaverType, L, R, nshift)

rxGrid        = np.random.randn(10, 3, 4096) + 1j*np.random.randn(10, 3, 4096) # SSB grid of size (4, 240)
fdra          = np.array([0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
                          0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0,
                          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0])
duration      = 1
slotNumber    = 1
scramblingID  = 1
Hp            = None
equalized_Sym = channelEst(rxGrid, fdra,
                           duration, slotNumber, scramblingID, Hf = Hp)

print(equalized_Sym.shape)
(10,216)

Tip

The values for the above scripts are generated using PDCCH test bench. You can access it from the tutorials.

API Documentation

The details about the input-output interface of the ReceiveCombining modules is provided below.

class toolkit5G.ReceiverAlgorithms.ChannelEstimationAndEqualizationPDCCH(aggregationLevel, cce_REG_MappingType, reg_BundleSize, interleaverSize, shiftIndex)[source]

This module provides the class for channel estimation and equalization for physical downlink control chanel (PDCCH). The implementation uses least Square estimator with nearest neighbour interpolator to estimate the channel and zero forcing (least squares) to equalize the received grid.

Note

  • Current implementation uses least Square estimator with nearest neighbour interpolator to estimate the channel.

  • The resource Grid equalization, currently, is based on zero forcing (least squares) method.

Parameters:
  • aggregationLevel (int) – Specifies the aggregation level. The aggregation level corresponds to number of Control Channel Elements (CCEs) per PDCCH. Higher level means lower coding rate, and is suitable for UEs with poor channel conditions. Must be a positive int. Aggregation level from 3GPP TS 38.211 Section 7.3.2. Supported PDCCH aggregation levels are {1,2,4,8,16}.

  • cce_REG_MappingType (str) – Specifies the type of REG to CCE mapping type. i.e, how Resource Element Groups (REGs) are being mapped to CCEs. cce_REG_MappingType from 3GPP TS 38.211 Section 7.3.2 Must be a string. Supported mapping types are {“non-interleaved”, “interleaved”}. Defaults to “interleaved”. For “interleaved” mapping, interleaverSize, reg_BundleSize and shiftIndex parameters are expected. For “non-interleaved”, no additional parameter is expected.

  • reg_BundleSize (int) – Specifies reg_BundleSize or ‘L’ from 3GPP TS 38.211 Section 7.3.2. This parameter indicates the number of REGs bundled together to form an REG bundle for “interleaving” type. Supported reg_BundleSize are {2,3,6}. It can take a value from the set {2,6} for duration = 1 and 2 and {3,6} for duration = 3. Must be a positive int and defaults to 6.

  • interleaverSize (int or None) – Specifies interleaverSize or ‘R’ from 3GPP TS 38.211 Section 7.3.2. This parameters indicates the size of interleaver. THe CORESET interleaver divides the available frequency resources into R parts. Each part has C RBs. Interleaver reads the RBs along columns or ‘C’ first and rows or ‘R’ second. It can take a value from the set {2,3,6}. But the configured value should be chosen such that ‘C’ must in an integer or in other words R*C = NumberOfRBs configured for CORESET. Must be a positive int and defaults to None. In the default case it takes value of 6.

  • shiftIndex (int) – Specifies shiftIndex or ‘nshift’ from 3GPP TS 38.211 Section 7.3.2. Indicates the circular shift value while interleaving. It can take any integer value from the interval [0, 274]. Must be a positive int and defaults to 0.

Input:
  • resourceGrid ((…,numSymbols, numSubcarriers), np.complex) – Defines the received resource grid.

  • frequencyDomainResources ((45,1), int) – Defines frequency domain resources which must be a 45 length array whose each bit allocates 6 contiguous RBs, with grouping starting from PRB 0, to CORESET within the bandwidth part within which the CORESET is configured. The 0th entry points to the lowest RB in the configured BWP. The number of RBs allocated to CORESET/PDCCH is given by \(\text{N}_\text{RB}\) = 6*np.sum(frequencyDomainResources)

  • duration (int) – Defines the contiguous number of OFDM symbols allocated to CORESET.

  • slotNumber (int) – Defines the slot number within a frame where PDCCH is loadedS \(n_{s,f}^{\mu} \in \{0,1,2,\) \(\dots,10*2^{\mu}-1\}\) where \({\mu = \frac{\Delta f}{15 kHz}}\).

  • scramblingID (int) – Defines the scramblingID \(\in \{0,1,\dots,4095\}\).

  • Hf ((…, numSymbols, numSubcarriers), np.complex) – Defines the channel Estimates corresponding to the received grid. Default value is None. * If Hf is None: Channel is internally estimated to equalize the received grid. * If Hf of consistent size is passed, his channel is used for received grid equalization and PDCCH decoding. It is useful speially perfect Channel estimates are assumed.

Output:

(…, \(\text{E}\) ), np.complex – Returns the equalized symbols for Upper Physical layer processing where E is the number of PDCCH symbols given by \(\text{E}=54 \times\) duration \(\times \sum_{i=0}^{45}\) frequencyDomainResources \([i]\).

Note

Size of resourceGrid and Hf must be consistent.

Note

Both resourceGrid and Hf must have atleast 2 dimensions.

Raises:
  • ValueError – [Error-resourceMappingPDCCH]: ‘resourceGrid’ must be NumPy array of numbers!

  • ValueError – [Error-resourceMappingPDCCH]: The number of dimensions of ‘resourceGrid’ should be more than 0!

  • ValueError – [Error-resourceMappingPDCCH]: Invalid shape of ‘resourceGrid’!