From 90f82d19da89892c447fb27e7725a887fe68b74d Mon Sep 17 00:00:00 2001 From: francescomani Date: Mon, 29 Apr 2024 12:39:44 +0200 Subject: [PATCH 1/2] remove false DCI reception indication --- .../CODING/nrPolar_tools/nr_polar_encoder.c | 12 +-- openair1/PHY/NR_UE_TRANSPORT/dci_nr.c | 76 +++++-------------- 2 files changed, 23 insertions(+), 65 deletions(-) diff --git a/openair1/PHY/CODING/nrPolar_tools/nr_polar_encoder.c b/openair1/PHY/CODING/nrPolar_tools/nr_polar_encoder.c index f411e0c6be..1668631029 100644 --- a/openair1/PHY/CODING/nrPolar_tools/nr_polar_encoder.c +++ b/openair1/PHY/CODING/nrPolar_tools/nr_polar_encoder.c @@ -488,12 +488,12 @@ void build_polar_tables(t_nrPolar_params *polarParams) { void polar_encoder_fast(uint64_t *A, void *out, - int32_t crcmask, - uint8_t ones_flag, - int8_t messageType, - uint16_t messageLength, - uint8_t aggregation_level) { - + int32_t crcmask, + uint8_t ones_flag, + int8_t messageType, + uint16_t messageLength, + uint8_t aggregation_level) +{ t_nrPolar_params *polarParams=nr_polar_params(messageType, messageLength, aggregation_level, false); #ifdef POLAR_CODING_DEBUG diff --git a/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c b/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c index 8392988aaa..e6d5baf753 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c +++ b/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c @@ -680,36 +680,6 @@ static void nr_pdcch_unscrambling(c16_t *e_rx, } } - -/* This function compares the received DCI bits with - * re-encoded DCI bits and returns the number of mismatched bits - */ -static uint16_t nr_dci_false_detection(uint64_t *dci, - int16_t *soft_in, - int encoded_length, - int rnti, - int8_t messageType, - uint16_t messageLength, - uint8_t aggregation_level) -{ - uint32_t encoder_output[NR_MAX_DCI_SIZE_DWORD]; - polar_encoder_fast(dci, (void *)encoder_output, rnti, 1, messageType, messageLength, aggregation_level); - uint8_t *enout_p = (uint8_t*)encoder_output; - uint16_t x = 0; - - for (int i=0; i> 15) & 1); - x += ((enout_p[i] >> 1) & 1) ^ ((soft_in[i * 8 + 1] >> 15) & 1); - x += ((enout_p[i] >> 2) & 1) ^ ((soft_in[i * 8 + 2] >> 15) & 1); - x += ((enout_p[i] >> 3) & 1) ^ ((soft_in[i * 8 + 3] >> 15) & 1); - x += ((enout_p[i] >> 4) & 1) ^ ((soft_in[i * 8 + 4] >> 15) & 1); - x += ((enout_p[i] >> 5) & 1) ^ ((soft_in[i * 8 + 5] >> 15) & 1); - x += ((enout_p[i] >> 6) & 1) ^ ((soft_in[i * 8 + 6] >> 15) & 1); - x += ((enout_p[i] >> 7) & 1) ^ ((soft_in[i * 8 + 7] >> 15) & 1); - } - return x; -} - void nr_dci_decoding_procedure(PHY_VARS_NR_UE *ue, const UE_nr_rxtx_proc_t *proc, c16_t *pdcch_e_rx, @@ -771,35 +741,23 @@ void nr_dci_decoding_procedure(PHY_VARS_NR_UE *ue, CCEind, dci_length, *(unsigned long long *)dci_estimation); - uint16_t mb = nr_dci_false_detection(dci_estimation, tmp_e, L * 108, n_rnti, NR_POLAR_DCI_MESSAGE_TYPE, dci_length, L); - ue->dci_thres = (ue->dci_thres + mb) / 2; - if (mb > (ue->dci_thres + 30)) { - LOG_W(NR_PHY_DCI, - "DCI false positive. Dropping DCI index %d. Mismatched bits: %d/%d. Current DCI threshold: %d\n", - j, - mb, - L * 108, - ue->dci_thres); - continue; - } else { - AssertFatal(dci_ind->number_of_dcis < sizeofArray(dci_ind->dci_list), "Fix allocation\n"); - fapi_nr_dci_indication_pdu_t *dci = dci_ind->dci_list + dci_ind->number_of_dcis; - *dci = (fapi_nr_dci_indication_pdu_t){ - .rnti = n_rnti, - .n_CCE = CCEind, - .N_CCE = L, - .dci_format = rel15->dci_format_options[k], - .ss_type = rel15->ss_type_options[k], - .coreset_type = rel15->coreset.CoreSetType, - }; - int n_rb, rb_offset; - get_coreset_rballoc(rel15->coreset.frequency_domain_resource, &n_rb, &rb_offset); - dci->cset_start = rel15->BWPStart + rb_offset; - dci->payloadSize = dci_length; - memcpy(dci->payloadBits, dci_estimation, (dci_length + 7) / 8); - dci_ind->number_of_dcis++; - break; // If DCI is found, no need to check for remaining DCI lengths - } + AssertFatal(dci_ind->number_of_dcis < sizeofArray(dci_ind->dci_list), "Fix allocation\n"); + fapi_nr_dci_indication_pdu_t *dci = dci_ind->dci_list + dci_ind->number_of_dcis; + *dci = (fapi_nr_dci_indication_pdu_t){ + .rnti = n_rnti, + .n_CCE = CCEind, + .N_CCE = L, + .dci_format = rel15->dci_format_options[k], + .ss_type = rel15->ss_type_options[k], + .coreset_type = rel15->coreset.CoreSetType, + }; + int n_rb, rb_offset; + get_coreset_rballoc(rel15->coreset.frequency_domain_resource, &n_rb, &rb_offset); + dci->cset_start = rel15->BWPStart + rb_offset; + dci->payloadSize = dci_length; + memcpy(dci->payloadBits, dci_estimation, (dci_length + 7) / 8); + dci_ind->number_of_dcis++; + break; // If DCI is found, no need to check for remaining DCI lengths } else { LOG_D(NR_PHY_DCI, "(%i.%i) Decoded crc %x does not match rnti %x for DCI format %d\n", From 114fb5dbca855585be0ba7581728751fbdd7eab4 Mon Sep 17 00:00:00 2001 From: francescomani Date: Mon, 29 Apr 2024 14:30:50 +0200 Subject: [PATCH 2/2] bugfix in dci reception, CRC is 24 bits but uint16 was used --- .../CODING/nrPolar_tools/nr_polar_decoder.c | 27 ++++++++++++++----- openair1/PHY/NR_UE_TRANSPORT/dci_nr.c | 2 +- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/openair1/PHY/CODING/nrPolar_tools/nr_polar_decoder.c b/openair1/PHY/CODING/nrPolar_tools/nr_polar_decoder.c index 61525c6905..4d4970774e 100644 --- a/openair1/PHY/CODING/nrPolar_tools/nr_polar_decoder.c +++ b/openair1/PHY/CODING/nrPolar_tools/nr_polar_decoder.c @@ -621,7 +621,7 @@ uint32_t polar_decoder_int16(int16_t *input, uint8_t ones_flag, int8_t messageType, uint16_t messageLength, - uint8_t aggregation_level ) + uint8_t aggregation_level) { t_nrPolar_params *polarParams=nr_polar_params(messageType, messageLength, aggregation_level, true); @@ -638,7 +638,13 @@ uint32_t polar_decoder_int16(int16_t *input, #endif int16_t d_tilde[polarParams->N]; - nr_polar_rate_matching_int16(input, d_tilde, polarParams->rate_matching_pattern, polarParams->K, polarParams->N, polarParams->encoderLength, polarParams->i_bil); + nr_polar_rate_matching_int16(input, + d_tilde, + polarParams->rate_matching_pattern, + polarParams->K, + polarParams->N, + polarParams->encoderLength, + polarParams->i_bil); for (int i=0; iN; i++) { if (d_tilde[i]<-128) d_tilde[i]=-128; @@ -792,13 +798,20 @@ uint32_t polar_decoder_int16(int16_t *input, printf("\n\n"); #endif -#if 0 - printf("A %llx B %llx|%llx Cprime %llx|%llx (crc %x,rxcrc %llx %d)\n", +#ifdef POLAR_CODING_DEBUG + printf("A %lx B %lx|%lx Cprime %lx|%lx (crc %x,rxcrc %lx, XOR %lx, bits%d)\n", Ar, - B[1],B[0],Cprime[1],Cprime[0],crc, - rxcrc,polarParams->payloadBits); + B[1], + B[0], + Cprime[1], + Cprime[0], + crc, + rxcrc, + crc^rxcrc, + polarParams->payloadBits); #endif - out[0]=Ar; + + out[0] = Ar; polarReturn crc^rxcrc; } diff --git a/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c b/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c index e6d5baf753..47be51813f 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c +++ b/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c @@ -728,7 +728,7 @@ void nr_dci_decoding_procedure(PHY_VARS_NR_UE *ue, rel15->coreset.pdcch_dmrs_scrambling_id, tmp_e); - uint16_t crc = polar_decoder_int16(tmp_e, dci_estimation, 1, NR_POLAR_DCI_MESSAGE_TYPE, dci_length, L); + const uint32_t crc = polar_decoder_int16(tmp_e, dci_estimation, 1, NR_POLAR_DCI_MESSAGE_TYPE, dci_length, L); rnti_t n_rnti = rel15->rnti; if (crc == n_rnti) {