PHY Test Mode – Every second packet is skipped and CRC is OK (BLER 50%) at low SNRs instead of 100% BLER
System Configuration:
- PHY Test mode: UL slot = 8 of every radio frame
Goal:
- Have our own UL BLER calculations and be able to monitor the CRC per each UL slot.
- The existing UL BLER calculations is not 100% precise, since it considers only the first HARQ proc, which has been already reported here: #748
Implementation: To get CRC fails counter, we did the following modifications:
- Add crc_fail_cnt to the NR_mac_stats
- File: /openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
typedef struct NR_mac_stats {
NR_mac_dir_stats_t dl;
NR_mac_dir_stats_t ul;
uint32_t ulsch_DTX;
uint32_t ulsch_crc_fail_cnt;
uint64_t ulsch_total_bytes_scheduled;
uint32_t pucch0_DTX;
int cumul_rsrp;
uint8_t num_rsrp_meas;
char srs_stats[50]; // Statistics may differ depending on SRS usage
} NR_mac_stats_t;
- Get crc_fail_count:
- File: openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
void handle_nr_ul_harq()
line 553:
if (!crc_pdu->tb_crc_status) {
...
} else if (harq->round >= RC.nrmac[mod_id]->ul_bler.harq_round_max - 1) {
...
UE->mac_stats.ulsch_crc_fail_cnt++;
} else {
...UE->mac_stats.ulsch_crc_fail_cnt++;
}
- It is worth mentioning that the overall ul packet count = SUM of all ul harq process counters:
" numAllUlPackets " << std::accumulate(std::begin(macUeStatsDstBuffer[i].ul_harq), std::next(std::end(macUeStatsDstBuffer[i].ul_harq), -1), 0)
Observation:
- At low SNRs, we observe that every second CRC is OK. It seems every second packet is skipped. In the attached figure, for MCS 14 and SNR 10 dB, the BLER reported by OAI (blue curve) is 100% while the BLER calculated based on CRC status (orange curve) is 50%. We observed one UL slot with CRC 0 and the next UL Slot with CRC 1 and so on.