4G/LTE - PHY Channel

 

 

 

 

PBCH (Physical Broadcast Channel)

 

PBCH is a special channel to carry MIB and has following characteristics :

  • It carries only the MIB.
  • It is using QPSK.
  • Mapped to 6 Resource Blocks (72 subcarriers), centered around DC subcarrier in sub frame 0.
  • Mapped to Resource Elements which is not reserved for transmission of reference signals, PDCCH or PHICH

 

Followings are the topics that will be described in this page.

 

 

 

BCH Physical Layer Processing

 

In terms of data processing, it goes through the following steps. If you are seriously intersted in physical layer channel processing but PDSCH is too complicated for you to start, try following through each and every steps of PBCH processing as shown below and refer to 3GPP specification over and over whenever you have time.

Refer to Precoding page for step (6). If you are also interested more in Step (6) in terms of Antenna Configuration, Refer to PHY Processing page.

 

If you want to have more concrete implementation of this process, you may refer to Matlab :ToolBox : LTE : Downlink : PBCH

 

 

< CRC Attachement : 36.212-5.3.1 >

 

 

< Channel Coding : 36.212-5.3.1>

 

The size of array c[] is 24 (K = 24) and output of channel coding is 72 in total(each of three d[] array is 24 bits). The coding method is based on 36.212-5.1.3.1 Tail biting convolutional coding as brielfy illustrated below.  

 

Example >

 

If you really understand the details and try manually or with your own program. Please try following example.

    c[] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0 }

    d1[] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,1,1,0,0,0,0 }

    d2[] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,1,0,0,0,0 }

    d3[] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,0,1,0,0,0,0 }

 

< Rate Matching : 36.212-5.3.1 >

 

 

< Scrambling : 36.211-6.6.1>

 

 

< Modulation : 36.211-6.6.2>

 

 

< Resource Element Mapping : 36.211-6.6.4 >

 

 

 

 

PBCH Resource Element Allocation with different Antenna Configuration

 

Followings are an example of PBCH Resource Element mapping for each of Antenna of 1 Antenna Configuration. (eNB physical cell ID is set to be 0 and System Bandwidth is set to be 20 Mhz).

 

 

Followings are an example of PBCH Resource Element mapping for each of Antenna of 4 Antenna Configuration. (eNB physical cell ID is set to be 0 and System Bandwidth is set to be 20 Mhz). At a glance, you would notice a little bit different patters of resource allocation at each antenna. At first, I thought there might be different RE mapping rule for each antenna. However, I don't find any of those differences in 36.211 6.6.4 and then I learned that these different pattern comes from the allocation of null symbol (zero powered symbol) inserted during layer mapping and precoding process.

 

 

 

 

How to specify Antenna configuration in PBCH

 

PBCH carry the information about the antenna configuration (the number of Antenna ports being used for a cell). But if you look at the MIB message itself you wouldn't see any information elements about the number of antenna ports. Then how the PBCH can carry the antenna configuration in it ?

It is done by using special CRC mask (the number of bit stream being masked(XORed) over the CRC bits. Number of CRC bits for PBCH is 16 bits, so the length of the CRC mask is 16 bit as well. Following tables shows the types of CRC mask representing each of the antenna configurations.

 

< 36.212 Table 5.3.1.1-1 : CRC mask for PBCH >

 

 

 

PBCH Eoncoding in srsRAN

 

If you are interested in this process at the source code level of the protocol stack, I would suggest you to look into the openSource srsRAN. Following APIs can be good places for you to start. This list is from the master-branch of the code that was downloaded on Oct 8,2021

  • srsran_crc_attach() -> \lib\src\phy\fec\crc.c

  • srsran_crc_set_mask() -> \lib\src\phy\phch\pbch.c

  • srsran_convcoder_encode() -> \lib\src\phy\fec\convolutional\convcoder.c

  • srsran_rm_conv_tx() -> \lib\src\phy\fec\turbo\rm_conv.c

  • srsran_scrambling_b_offset() -> \lib\src\phy\scrambling\scrambling.c

  • srsran_mod_modulate() -> \lib\src\phy\modem\mod.c

  • srsran_layermap_diversity() -> \lib\src\phy\mimo\layermap.c

  • srsran_precoding_diversity() -> \lib\src\phy\mimo\precoding.c

  • srsran_pbch_put() -> \lib\src\phy\phch\pbch.c

  • srsran_pbch_encode() -> \lib\src\phy\phch\pbch.c

  • srsran_pbch_mib_pack() -> \lib\src\phy\phch\pbch.c

 

 

 

PBCH Decoding in srsRAN

 

If you are interested in this process at the source code level of the protocol stack, I would suggest you to look into the openSource srsRAN. Following APIs can be good places for you to start. This list is from the master-branch of the code that was downloaded on Oct 8,2021

  • prb_cp_ref() -> \lib\src\phy\phch\prb_dl.c
  • prb_cp() -> \lib\src\phy\phch\prb_dl.c
  • srsran_pbch_crc_check() -> \lib\src\phy\phch\pbch.c
  • srsran_rm_conv_rx() -> \lib\src\phy\fec\turbo\rm_conv.c
  • srsran_vec_sc_prod_fff() -> \lib\src\phy\utils\vector.c
  • srsran_viterbi_decode_f() -> \src\phy\fec\convolutional\viterbi.c
  • decode_frame() -> \lib\src\phy\phch\pbch.c
  • srsran_pbch_cp() -> \lib\src\phy\phch\pbch.c
  • srsran_pbch_get() -> \lib\src\phy\phch\pbch.c
  • srsran_pbch_decode() -> \lib\src\phy\phch\pbch.c

  • srsran_bit_pack() -> \lib\src\phy\utils\bit.c
  • srsran_pbch_mib_unpack()  -> \lib\src\phy\phch\pbch.c