From 14096886e89ee04b45727e5cff50dcda070cba13 Mon Sep 17 00:00:00 2001 From: Parminder Singh Date: Mon, 31 Aug 2020 13:02:01 +0200 Subject: [PATCH] Enable PTRS with command line in ULSIM - To enable PTRS use -T flag followed by 3 integers - Example: ./nr_ulsim -T 2 0 2 - 1st Value is the list of arguments -> e.g. 2 - 2nd Value is for L_PTRS{0,1,2} -> e.g. 0 - 3rd Value is for K_PTRS{2,4} -> e.g. 2 --- .../NR_ESTIMATION/nr_ul_channel_estimation.c | 6 ++-- openair1/PHY/NR_REFSIG/nr_dmrs_rx.c | 5 +-- openair1/PHY/NR_REFSIG/nr_refsig.h | 2 +- openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c | 2 +- openair1/SIMULATION/NR_PHY/ulsim.c | 32 +++++++++++++++++-- openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c | 4 +-- 6 files changed, 37 insertions(+), 14 deletions(-) diff --git a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c index aac3119a01..b854ee8dcf 100644 --- a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c +++ b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c @@ -672,8 +672,8 @@ void nr_pusch_phase_estimation(NR_DL_FRAME_PARMS *frame_parms, uint16_t re_cnt = 0; uint16_t cnt = 0; unsigned short nb_re_pusch = NR_NB_SC_PER_RB * rel15_ul->rb_size; - uint8_t K_ptrs = (rel15_ul->pusch_ptrs.ptrs_freq_density)?4:2; - uint16_t sc_per_symbol = rel15_ul->rb_size/K_ptrs; + uint8_t K_ptrs = rel15_ul->pusch_ptrs.ptrs_freq_density; + uint16_t sc_per_symbol = (rel15_ul->rb_size + K_ptrs - 1)/K_ptrs; int16_t *ptrs_p = (int16_t *)malloc(sizeof(int32_t)*(sc_per_symbol)); int16_t *dmrs_comp_p = (int16_t *)malloc(sizeof(int32_t)*(sc_per_symbol)); double abs = 0.0; @@ -683,7 +683,7 @@ void nr_pusch_phase_estimation(NR_DL_FRAME_PARMS *frame_parms, double alpha = 0; #endif /* generate PTRS RE for the symbol */ - nr_ptrs_rx_gen(ptrs_gold_seq[Ns][symbol],rel15_ul->rb_size,ptrs_p); + nr_gen_ref_conj_symbols(ptrs_gold_seq[Ns][symbol],sc_per_symbol*2,ptrs_p, NR_MOD_TABLE_QPSK_OFFSET,2);// 2 for QPSK /* loop over all sub carriers to get compensated RE on ptrs symbols*/ for (int re = 0; re < nb_re_pusch; re++) diff --git a/openair1/PHY/NR_REFSIG/nr_dmrs_rx.c b/openair1/PHY/NR_REFSIG/nr_dmrs_rx.c index ac97ee3993..3e758c4fa5 100644 --- a/openair1/PHY/NR_REFSIG/nr_dmrs_rx.c +++ b/openair1/PHY/NR_REFSIG/nr_dmrs_rx.c @@ -230,12 +230,9 @@ int nr_pbch_dmrs_rx(int symbol, \param length is number of RE in a OFDM symbol \param *output pointer to all ptrs RE in a OFDM symbol */ -void nr_ptrs_rx_gen(uint32_t *in, uint32_t length, int16_t *output) +void nr_gen_ref_conj_symbols(uint32_t *in, uint32_t length, int16_t *output, uint16_t offset, int mod_order) { - uint16_t offset; uint8_t idx, b_idx; - int mod_order = 2; - offset = NR_MOD_TABLE_QPSK_OFFSET; for (int i=0; ipusch_pdu.pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_PTRS) { - K_ptrs = (harq_process_ul_ue->pusch_pdu.pusch_ptrs.ptrs_freq_density)?4:2; + K_ptrs = harq_process_ul_ue->pusch_pdu.pusch_ptrs.ptrs_freq_density; L_ptrs = 1<pusch_pdu.pusch_ptrs.ptrs_time_density; beta_ptrs = 1; // temp value until power control is implemented diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c index e27b87f2da..3aa7cb9daf 100644 --- a/openair1/SIMULATION/NR_PHY/ulsim.c +++ b/openair1/SIMULATION/NR_PHY/ulsim.c @@ -149,7 +149,8 @@ int main(int argc, char **argv) UE_nr_rxtx_proc_t UE_proc; FILE *scg_fd=NULL; - + int enable_ptrs = 0; + int ptrs_arg[2] = {-1,-1}; int ibwps=24; int ibwp_rboffset=41; if ( load_configmodule(argc,argv,CONFIG_ENABLECMDLINEONLY) == 0 ) { @@ -159,7 +160,7 @@ int main(int argc, char **argv) //logInit(); randominit(0); - while ((c = getopt(argc, argv, "a:b:c:d:ef:g:h:i:j:kl:m:n:p:r:s:y:z:F:M:N:PR:S:L:")) != -1) { + while ((c = getopt(argc, argv, "a:b:c:d:ef:g:h:i:j:kl:m:n:p:r:s:y:z:F:M:N:PR:S:T:L:")) != -1) { printf("handling optarg %c\n",c); switch (c) { @@ -345,6 +346,15 @@ int main(int argc, char **argv) case 'L': loglvl = atoi(optarg); break; + + case 'T': + enable_ptrs=1; + int i = 0; + for(; optind < argc; optind++){ + ptrs_arg[i] = atoi(argv[optind]); + i++; + } + break; default: case 'h': @@ -374,6 +384,7 @@ int main(int argc, char **argv) printf("-R N_RB_DL\n"); printf("-S Ending SNR, runs from SNR0 to SNR1\n"); printf("-P Print ULSCH performances\n"); + printf("-T Enable PTRS, arguments list L_PTRS{0,1,2} K_PTRS{2,4}, e.g. -T 2 0 2 \n"); exit(-1); break; @@ -565,6 +576,21 @@ int main(int argc, char **argv) double ts = 1.0/(frame_parms->subcarrier_spacing * frame_parms->ofdm_symbol_size); number_dmrs_symbols = get_dmrs_symbols_in_slot(l_prime_mask, nb_symb_sch); + /* -T option enable PTRS */ + if(enable_ptrs) + { + /* validate parameters othwerwise default values are used */ + if(ptrs_arg[0] == 0 || ptrs_arg[0] == 1 || ptrs_arg[0] == 2 ) + { + ptrs_time_density = ptrs_arg[0]; + } + if(ptrs_arg[1] == 2 || ptrs_arg[1] == 4 ) + { + ptrs_freq_density = ptrs_arg[1]; + } + pdu_bit_map |= PUSCH_PDU_BITMAP_PUSCH_PTRS; + printf("PTRS Enabled with L %d, K %d \n",ptrs_time_density, ptrs_freq_density ); + } if(1<= nb_symb_sch) pdu_bit_map &= ~PUSCH_PDU_BITMAP_PUSCH_PTRS; // disable PUSCH PTRS @@ -849,7 +875,7 @@ int main(int argc, char **argv) ptrs_symbols += ((gNB->pusch_vars[UE_id]->ptrs_symbols) >> i) & 1; } /* 2*5*(50/2), for RB = 50,K = 2 for 5 OFDM PTRS symbols */ - available_bits = available_bits - (2 * ptrs_symbols * (nb_rb/((ptrs_freq_density)?4:2))); + available_bits -= 2 * ptrs_symbols * ((pusch_pdu->rb_size + ptrs_freq_density - 1) /ptrs_freq_density); printf("After PTRS subtraction available_bits are : %d \n", available_bits); } diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c index f40d822b6b..5d2d1e1f29 100644 --- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c +++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c @@ -1875,9 +1875,9 @@ uint8_t get_K_ptrs(uint16_t nrb0, uint16_t nrb1, uint16_t N_RB) { LOG_I(PHY,"PUSH PT-RS is not present.\n"); return -1; } else if (N_RB >= nrb0 && N_RB < nrb1) - return 0; + return 2; else - return 1; + return 4; } uint16_t nr_dci_size(NR_ServingCellConfigCommon_t *scc,