At early stage of LTE deployment and for several years since then, I didn't care much of figuring out the number of antenna (Downlink Antenna) because all of the deployment (as far as I know) was 2 antenna system (2x2 MIMO or 2 x 1 Diversity). But recently I have been more and more curious of this since I am hearing various different antenna configurations lately (as of Feb 2017) like 4x2, 4x4 and even 8x2.
A question came to me : How a UE can figure out what kind of antenna (e.g, how many eNB antenna) configuration the eNB is using.
There are several different ways for eNB to tell UE of how many antenna it is using at a specific stage of communication. This page will list up those method of informing UE of antenna configuration. I don't think I need to put a lot of comments here. Just showing a specific part of RRC message would be enough.
Followings are the topics :
- Information on PBCH
- Information on RRC Connection Reconfiguration / RRC Connection Setup - PCC
- Information on RRC Connection Reconfiguration - SCC
- Where does the antenna port count actually come from?
- How does the UE learn about 8 antenna ports?
- Reference
Information on PBCH
Strictly speaking, this is not really at RRC Stage. This is lower than RRC layer. eNB can inform UE of how many antenna it is using by masking PBCH data (MIB data) based on following table. Refer to How to specify Antenna configuration in PBCH for the details.
< 36.212 Table 5.3.1.1-1 : CRC mask for PBCH >

The mask is the whole message. Three code points exist, so PBCH can tell the UE that the cell has 1, 2 or 4 transmit antenna ports and nothing else.
The UE does not decode a field here : it applies each mask to the PBCH CRC in turn, and the one that makes the check pass identifies the port count.One port is all zeros : the mask leaves the CRC untouched, so the single port case is the one that costs nothing.Two ports is all ones : every bit of the CRC is inverted.Four ports alternates : the pattern runs 0, 1, 0, 1 from x_ant,0 through to x_ant,15.There is no row for eight : the table stops at four, and that is the first sign that an 8 antenna cell has to say so somewhere else.
That last point is worth remembering, because the question at the top of this page was about 4x4 and 8x2 systems. PBCH cannot express eight. Neither can the RRC field that carries the same count, and the section on where the count comes from returns to that.
One more thing is easy to miss. The number in this table is a count of cell specific reference signal ports, not a count of the physical antennas on the mast. A cell can have far more radiating elements than it has CRS ports, and the UE never learns that number at all.
PBCH carries the count before any RRC exists : the UE needs the port count to demodulate PDCCH, so it cannot wait for a dedicated message to tell it.The count is CRS ports, not antennas : it says how many cell specific reference signal ports the cell transmits.Three values, and that is the whole range : 1, 2 and 4.
Information on RRC Connection Reconfiguration / RRC Connection Setup - PCC
The first section covers what the cell broadcasts to everybody. This one covers what the eNB tells one UE once it is in connected mode. The capture in this section is a real RRCConnectionReconfiguration, and the red lines are the only part of it that concerns antennas.
Decoded
+-c1 ::= CHOICE [rrcConnectionReconfiguration-r8]
+-rrcConnectionReconfiguration-r8 ::= SEQUENCE [001101]
+-measConfig ::= SEQUENCE OPTIONAL:Omit
+-mobilityControlInfo ::= SEQUENCE OPTIONAL:Omit
+-dedicatedInfoNASList ::= SEQUENCE OF SIZE(1..maxDRB[11]) [1] OPTIONAL:Exist
+-radioResourceConfigDedicated ::= SEQUENCE [110101] OPTIONAL:Exist
| +-srb-ToAddModList ::= SEQUENCE OF SIZE(1..2) [1] OPTIONAL:Exist
| +-drb-ToAddModList ::= SEQUENCE OF SIZE(1..maxDRB[11]) [1] OPTIONAL:Exist
| +-drb-ToReleaseList ::= SEQUENCE OF OPTIONAL:Omit
| +-mac-MainConfig ::= CHOICE [explicitValue] OPTIONAL:Exist
| +-sps-Config ::= SEQUENCE OPTIONAL:Omit
| +-physicalConfigDedicated ::= SEQUENCE [0100110010] OPTIONAL:Exist
| | +-pdsch-ConfigDedicated ::= SEQUENCE OPTIONAL:Omit
| | +-pucch-ConfigDedicated ::= SEQUENCE [0] OPTIONAL:Exist
| | +-pusch-ConfigDedicated ::= SEQUENCE OPTIONAL:Omit
| | +-uplinkPowerControlDedicated ::= SEQUENCE OPTIONAL:Omit
| | +-tpc-PDCCH-ConfigPUCCH ::= CHOICE [setup] OPTIONAL:Exist
| | +-tpc-PDCCH-ConfigPUSCH ::= CHOICE [setup] OPTIONAL:Exist
| | +-cqi-ReportConfig ::= SEQUENCE OPTIONAL:Omit
| | +-soundingRS-UL-ConfigDedicated ::= CHOICE OPTIONAL:Omit
| | +-antennaInfo ::= CHOICE [explicitValue] OPTIONAL:Exist
| | | +-explicitValue ::= SEQUENCE [1]
| | | +-transmissionMode ::= ENUMERATED [tm3]
| | | +-codebookSubsetRestriction ::= CHOICE [n4TxAntenna-tm3] OPTIONAL:Exist
| | | | +-n4TxAntenna-tm3 ::= BIT STRING SIZE(4) [1111]
| | | +-ue-TransmitAntennaSelection ::= CHOICE [release]
| | +-schedulingRequestConfig ::= CHOICE OPTIONAL:Omit
| | +-EXTENSION ::= SEQUENCE [0000100]
| | +-VERSION-BRACKETS1 ::= SEQUENCE OPTIONAL:Omit
| | +-VERSION-BRACKETS2 ::= SEQUENCE OPTIONAL:Omit
| | +-VERSION-BRACKETS3 ::= SEQUENCE OPTIONAL:Omit
| | +-VERSION-BRACKETS4 ::= SEQUENCE OPTIONAL:Omit
| | +-VERSION-BRACKETS5 ::= SEQUENCE [00001000] OPTIONAL:Exist
| | +-VERSION-BRACKETS6 ::= SEQUENCE OPTIONAL:Omit
| | +-VERSION-BRACKETS7 ::= SEQUENCE OPTIONAL:Omit
| +-EXTENSION ::= SEQUENCE [00000]
| +-VERSION-BRACKETS1 ::= SEQUENCE OPTIONAL:Omit
| +-VERSION-BRACKETS2 ::= SEQUENCE OPTIONAL:Omit
| +-VERSION-BRACKETS3 ::= SEQUENCE OPTIONAL:Omit
| +-VERSION-BRACKETS4 ::= SEQUENCE OPTIONAL:Omit
| +-VERSION-BRACKETS5 ::= SEQUENCE OPTIONAL:Omit
+-securityConfigHO ::= SEQUENCE OPTIONAL:Omit
+-nonCriticalExtension ::= SEQUENCE [10] OPTIONAL:Exist
+-lateNonCriticalExtension ::= OCTET STRING CONSTRAINTED [0000000101101010] OPTIONAL:Exist
| +-RRCConnectionReconfiguration-v8m0-IEs ::= SEQUENCE [01]
| +-lateNonCriticalExtension ::= OCTET STRING OPTIONAL:Omit
| +-nonCriticalExtension ::= SEQUENCE [10] OPTIONAL:Exist
| +-antennaInfoDedicatedPCell-v10i0 ::= SEQUENCE [1] OPTIONAL:Exist
| | +-maxLayersMIMO-r10 ::= ENUMERATED [fourLayers] OPTIONAL:Exist
| +-nonCriticalExtension ::= SEQUENCE OPTIONAL:Omit
+-nonCriticalExtension ::= SEQUENCE OPTIONAL:Omit
Information on RRC Connection Reconfiguration - SCC
An SCell has no PBCH that the UE reads for this purpose, so the mechanism from the first section is not available. The count has to arrive inside the RRC message that adds the cell, and this capture shows it doing exactly that, in two different places.
Decoded
+-c1 ::= CHOICE [rrcConnectionReconfiguration-r8]
+-rrcConnectionReconfiguration-r8 ::= SEQUENCE [000101]
+-measConfig ::= SEQUENCE OPTIONAL:Omit
+-mobilityControlInfo ::= SEQUENCE OPTIONAL:Omit
+-dedicatedInfoNASList ::= SEQUENCE OF OPTIONAL:Omit
+-radioResourceConfigDedicated ::= SEQUENCE [000001] OPTIONAL:Exist
| +-srb-ToAddModList ::= SEQUENCE OF OPTIONAL:Omit
| +-drb-ToAddModList ::= SEQUENCE OF OPTIONAL:Omit
| +-drb-ToReleaseList ::= SEQUENCE OF OPTIONAL:Omit
| +-mac-MainConfig ::= CHOICE OPTIONAL:Omit
| +-sps-Config ::= SEQUENCE OPTIONAL:Omit
| +-physicalConfigDedicated ::= SEQUENCE [0000000000] OPTIONAL:Exist
| | +-pdsch-ConfigDedicated ::= SEQUENCE OPTIONAL:Omit
| | +-pucch-ConfigDedicated ::= SEQUENCE OPTIONAL:Omit
| | +-pusch-ConfigDedicated ::= SEQUENCE OPTIONAL:Omit
| | +-uplinkPowerControlDedicated ::= SEQUENCE OPTIONAL:Omit
| | +-tpc-PDCCH-ConfigPUCCH ::= CHOICE OPTIONAL:Omit
| | +-tpc-PDCCH-ConfigPUSCH ::= CHOICE OPTIONAL:Omit
| | +-cqi-ReportConfig ::= SEQUENCE OPTIONAL:Omit
| | +-soundingRS-UL-ConfigDedicated ::= CHOICE OPTIONAL:Omit
| | +-antennaInfo ::= CHOICE OPTIONAL:Omit
| | +-schedulingRequestConfig ::= CHOICE OPTIONAL:Omit
| | +-EXTENSION ::= SEQUENCE [0100000]
| | +-VERSION-BRACKETS3 ::= SEQUENCE OPTIONAL:Omit
| | +-VERSION-BRACKETS4 ::= SEQUENCE OPTIONAL:Omit
| | +-VERSION-BRACKETS5 ::= SEQUENCE OPTIONAL:Omit
| | +-VERSION-BRACKETS6 ::= SEQUENCE OPTIONAL:Omit
| | +-VERSION-BRACKETS7 ::= SEQUENCE OPTIONAL:Omit
| +-EXTENSION ::= SEQUENCE [00000]
| +-VERSION-BRACKETS1 ::= SEQUENCE OPTIONAL:Omit
| +-VERSION-BRACKETS2 ::= SEQUENCE OPTIONAL:Omit
| +-VERSION-BRACKETS3 ::= SEQUENCE OPTIONAL:Omit
| +-VERSION-BRACKETS4 ::= SEQUENCE OPTIONAL:Omit
| +-VERSION-BRACKETS5 ::= SEQUENCE OPTIONAL:Omit
+-securityConfigHO ::= SEQUENCE OPTIONAL:Omit
+-nonCriticalExtension ::= SEQUENCE [01] OPTIONAL:Exist
+-lateNonCriticalExtension ::= OCTET STRING OPTIONAL:Omit
+-nonCriticalExtension ::= SEQUENCE [001] OPTIONAL:Exist
+-otherConfig-r9 ::= SEQUENCE OPTIONAL:Omit
+-fullConfig-r9 ::= ENUMERATED OPTIONAL:Omit
+-nonCriticalExtension ::= SEQUENCE [010] OPTIONAL:Exist
+-sCellToReleaseList-r10 ::= SEQUENCE OF OPTIONAL:Omit
+-sCellToAddModList-r10 ::= SEQUENCE OF SIZE(1..maxSCell-r10[4]) [1] OPTIONAL:Exist
| +-SCellToAddMod-r10 ::= SEQUENCE [111]
| +-sCellIndex-r10 ::= INTEGER (1..7) [1]
| +-cellIdentification-r10 ::= SEQUENCE OPTIONAL:Exist
| | +-physCellId-r10 ::= INTEGER (0..503) [1]
| | +-dl-CarrierFreq-r10 ::= INTEGER (0..maxEARFCN[65535]) [1498]
| +-radioResourceConfigCommonSCell-r10 ::= SEQUENCE [0] OPTIONAL:Exist
| | +-nonUL-Configuration-r10 ::= SEQUENCE [00]
| | | +-dl-Bandwidth-r10 ::= ENUMERATED [n100]
| | | +-antennaInfoCommon-r10 ::= SEQUENCE
| | | | +-antennaPortsCount ::= ENUMERATED [an4]
| | | +-mbsfn-SubframeConfigList-r10 ::= SEQUENCE OF OPTIONAL:Omit
| | | +-phich-Config-r10 ::= SEQUENCE
| | | +-pdsch-ConfigCommon-r10 ::= SEQUENCE
| | | +-tdd-Config-r10 ::= SEQUENCE OPTIONAL:Omit
| | +-ul-Configuration-r10 ::= SEQUENCE OPTIONAL:Omit
| | +-EXTENSION ::= SEQUENCE [0000]
| | +-VERSION-BRACKETS1 ::= SEQUENCE OPTIONAL:Omit
| | +-VERSION-BRACKETS2 ::= SEQUENCE OPTIONAL:Omit
| | +-VERSION-BRACKETS3 ::= SEQUENCE OPTIONAL:Omit
| | +-VERSION-BRACKETS4 ::= SEQUENCE OPTIONAL:Omit
| +-radioResourceConfigDedicatedSCell-r10 ::= SEQUENCE [1] OPTIONAL:Exist
| | +-physicalConfigDedicatedSCell-r10 ::= SEQUENCE [10] OPTIONAL:Exist
| | | +-nonUL-Configuration-r10 ::= SEQUENCE [1001] OPTIONAL:Exist
| | | | +-antennaInfo-r10 ::= SEQUENCE [1] OPTIONAL:Exist
| | | | | +-transmissionMode-r10 ::= ENUMERATED [tm3]
| | | | | +-codebookSubsetRestriction-r10 ::= BIT STRING SIZE(ALIGNED) [1111]
| | | | | +-ue-TransmitAntennaSelection ::= CHOICE [release]
| | | | | +-release ::= NULL
| | | | +-crossCarrierSchedulingConfig-r10 ::= SEQUENCE OPTIONAL:Omit
| | | | +-csi-RS-Config-r10 ::= SEQUENCE OPTIONAL:Omit
| | | | +-pdsch-ConfigDedicated-r10 ::= SEQUENCE OPTIONAL:Exist
| | | | +-p-a ::= ENUMERATED [dB-6]
| | | +-ul-Configuration-r10 ::= SEQUENCE OPTIONAL:Omit
| | | +-EXTENSION ::= SEQUENCE [0100]
| | | +-VERSION-BRACKETS1 ::= SEQUENCE OPTIONAL:Omit
| | | +-VERSION-BRACKETS2 ::= SEQUENCE [00100] OPTIONAL:Exist
| | | +-VERSION-BRACKETS3 ::= SEQUENCE OPTIONAL:Omit
| | | +-VERSION-BRACKETS4 ::= SEQUENCE OPTIONAL:Omit
| | +-EXTENSION ::= SEQUENCE [000]
| | +-VERSION-BRACKETS1 ::= SEQUENCE OPTIONAL:Omit
| | +-VERSION-BRACKETS2 ::= SEQUENCE OPTIONAL:Omit
| | +-VERSION-BRACKETS3 ::= SEQUENCE OPTIONAL:Omit
| +-EXTENSION ::= SEQUENCE [01]
| +-VERSION-BRACKETS1 ::= SEQUENCE OPTIONAL:Omit
| +-VERSION-BRACKETS2 ::= SEQUENCE [1] OPTIONAL:Exist
| +-antennaInfoDedicatedSCell-v10i0 ::= SEQUENCE [1] OPTIONAL:Exist
| +-maxLayersMIMO-r10 ::= ENUMERATED [fourLayers] OPTIONAL:Exist
+-nonCriticalExtension ::= SEQUENCE OPTIONAL:Omit
The SCell capture states the count twice over, and the two statements are worth separating.
The common part is radioResourceConfigCommonSCell-r10. Inside it, antennaInfoCommon-r10 carries antennaPortsCount set to an4. This is the direct statement. Nothing has to be inferred from a branch name, and it is the closest thing in LTE to a field that simply says how many antenna ports the cell has.
The dedicated part is physicalConfigDedicatedSCell-r10. Inside it, antennaInfo-r10 carries transmissionMode-r10 set to tm3 again. Now look at codebookSubsetRestriction-r10. It is a plain BIT STRING of 1111 with no branch name at all. The Release 10 form dropped the CHOICE, so on an SCell that field no longer reveals the port count, and the common part has to supply it.
maxLayersMIMO-r10 is set to fourLayers in the same capture, and it appears in the PCC capture too. That is a limit on spatial layers rather than a count of antenna ports. Four ports make four layers possible, and they do not make them mandatory.
antennaPortsCount is the explicit answer : an4 on this SCell, with nothing to infer.The r10 restriction lost its branch names : codebookSubsetRestriction-r10 is a bare BIT STRING, so it no longer carries the count.The PCell takes its count from PBCH and the SCell from RRC : that is the reason the SCell message needs a common part at all.Layers are not ports : maxLayersMIMO-r10 of fourLayers bounds the rank, not the antenna count.
Where does the antenna port count actually come from?
Three mechanisms have appeared so far, and they overlap enough to be confusing. Putting the specification definitions beside the captures settles it, because the ASN.1 shows the limit of each mechanism in a way the captures never do.
Following is based on
AntennaInfoCommon ::= SEQUENCE { antennaPortsCount ENUMERATED {an1, an2, an4, spare1} } AntennaInfoDedicated ::= SEQUENCE { transmissionMode ENUMERATED { tm1, tm2, tm3, tm4, tm5, tm6, tm7, tm8-v920}, codebookSubsetRestriction CHOICE { n2TxAntenna-tm3 BIT STRING (SIZE (2)), n4TxAntenna-tm3 BIT STRING (SIZE (4)), n2TxAntenna-tm4 BIT STRING (SIZE (6)), n4TxAntenna-tm4 BIT STRING (SIZE (64)), n2TxAntenna-tm5 BIT STRING (SIZE (4)), n4TxAntenna-tm5 BIT STRING (SIZE (16)), n2TxAntenna-tm6 BIT STRING (SIZE (4)), n4TxAntenna-tm6 BIT STRING (SIZE (16)) } OPTIONAL, -- Cond TM ue-TransmitAntennaSelection CHOICE{ release NULL, setup ENUMERATED {closedLoop, openLoop} } }
AntennaInfoCommon is one field long, and its range is the same set of values the PBCH table allows : an1, an2, an4, then spare1, which is unused. So the common RRC statement stops at four, in exactly the place PBCH stops.
Where that field sits is worth checking, because it differs between the two cases this page shows. Inside RadioResourceConfigCommon it is marked OPTIONAL with -- Need ON. Inside RadioResourceConfigCommonSCell-r10 it is mandatory. The field is optional where PBCH already carries the count, and required where it does not.
AntennaInfoDedicated is the Release 8 dedicated form. Its codebookSubsetRestriction is a CHOICE, and every branch name begins with n2TxAntenna or n4TxAntenna. That is why the PCC capture reveals the count. The branch also fixes the bit string length, and the lengths vary widely, from SIZE(2) for n2TxAntenna-tm3 to SIZE(64) for n4TxAntenna-tm4.
Following is based on
AntennaInfoDedicated-r10 ::= SEQUENCE { transmissionMode-r10 ENUMERATED { tm1, tm2, tm3, tm4, tm5, tm6, tm7, tm8-v920, tm9-v1020, tm10-v1130, spare6, spare5, spare4, spare3, spare2, spare1}, codebookSubsetRestriction-r10 BIT STRING OPTIONAL, -- Cond TMX ue-TransmitAntennaSelection CHOICE{ release NULL, setup ENUMERATED {closedLoop, openLoop} } }
The Release 10 form replaced that CHOICE with a bare BIT STRING and extended transmissionMode-r10 as far as tm9-v1020 and tm10-v1130. The length of the bit string is no longer fixed by the type, so a decoder can print the value without ever naming a port count.
The table below puts the five mechanisms side by side.
|
Mechanism |
Values it can express |
What it counts, and where it lives |
|
PBCH CRC mask |
1, 2, 4 |
CRS antenna ports. It is in the MIB, so the UE has it before any RRC message arrives. |
|
antennaInfoCommon |
an1, an2, an4 |
CRS antenna ports. Optional inside RadioResourceConfigCommon, and mandatory inside RadioResourceConfigCommonSCell-r10. |
|
codebookSubsetRestriction |
n2TxAntenna or n4TxAntenna, as a branch name |
The port count the codebook assumes. Release 8 AntennaInfoDedicated only. |
|
codebookSubsetRestriction-r10 |
nothing |
A bare BIT STRING with no branch name, so on its own it says nothing about the count. |
|
antennaPortsCount-r10 |
an1, an2, an4, an8 |
CSI-RS antenna ports. It sits in CSI-RS-Config-r10, inside the dedicated configuration. |
Figure 1. The four places the count can come from. Three of them agree with each other and stop at four, and only the last one can say eight.
Two of the five count the same thing : the PBCH mask and antennaInfoCommon both report CRS ports, so they never disagree.One of the five says nothing on its own : codebookSubsetRestriction-r10 dropped the branch names that used to carry the count.The optional and mandatory split is deliberate : antennaInfoCommon is optional where PBCH covers the count and mandatory where it does not.
How does the UE learn about 8 antenna ports?
The opening of this page asked about 8x2 configurations. Everything so far stops at four, so the eight has to arrive from somewhere else. It does, and it is not an antenna port count in quite the same sense as the others.
Following is based on
CSI-RS-Config-r10 ::= SEQUENCE { csi-RS-r10 CHOICE { release NULL, setup SEQUENCE { antennaPortsCount-r10 ENUMERATED {an1, an2, an4, an8}, resourceConfig-r10 INTEGER (0..31), subframeConfig-r10 INTEGER (0..154), p-C-r10 INTEGER (-8..15) } } OPTIONAL, -- Need ON zeroTxPowerCSI-RS-r10 ZeroTxPowerCSI-RS-Conf-r12 OPTIONAL -- Need ON }
antennaPortsCount-r10, inside csi-RS-r10, is the only place in this chain where an8 appears. It counts CSI-RS antenna ports rather than CRS antenna ports, and that distinction is what makes eight possible at all.
The two reference signals are used differently, and the ASN.1 shows it. CRS has to be measurable by every UE in the cell, so its port count is broadcast and it stays small. CSI-RS is configured per UE, because CSI-RS-Config-r10 sits inside the dedicated configuration, and subframeConfig-r10 controls how often it is sent. A sparse, dedicated reference signal can describe a larger array without costing every UE in the cell.
So an 8 antenna cell still reports 1, 2 or 4 on PBCH, and that is not a contradiction. The PBCH figure counts CRS ports, and the CSI-RS ports are counted separately in a message only the connected UE receives.
an8 exists in exactly one place : antennaPortsCount-r10 inside CSI-RS-Config-r10, and nowhere else in this chain.CRS ports and CSI-RS ports are different counts : a cell can broadcast four CRS ports and configure eight CSI-RS ports at the same time.The eight port picture is per UE : CSI-RS-Config-r10 is dedicated configuration, so it is never broadcast.tm9-v1020 is the transmission mode that uses it : it arrived in the same release as the r10 antenna fields and the an8 code point.
Reference
Two specifications carry everything on this page. One defines the RRC fields quoted above, and the other defines the PBCH mask in the table at the top.
- 36.331 - E-UTRA; Radio Resource Control (RRC) protocol specification, v19.3.0. AntennaInfoCommon, AntennaInfoDedicated, AntennaInfoDedicated-r10 and CSI-RS-Config-r10 are quoted from the IE definitions, and RadioResourceConfigCommon and RadioResourceConfigCommonSCell-r10 are where the optional and mandatory difference shows up.
- 36.212 - E-UTRA; Multiplexing and channel coding. Table 5.3.1.1-1 is the PBCH CRC mask reproduced at the top of this page.