diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml
index 0c31ba8ea6..e081a4186e 100644
--- a/cmake_targets/autotests/test_case_list.xml
+++ b/cmake_targets/autotests/test_case_list.xml
@@ -1098,7 +1098,9 @@
(Test13: HARQ test 50% TP (2 rounds),
(Test14: 3 PTRS, 8 Interpolated Symbols),
(Test15: 6 PTRS, 5 Interpolated Symbols),
- (Test16: 11 PTRS, 0 Interpolated Symbols)
+ (Test16: 11 PTRS, 0 Interpolated Symbols),
+ (Test17: 2 DMRS Symbols),
+ (Test18: 3 DMRS Symbols)
$OPENAIR_DIR/cmake_targets/build_oai
--phy_simulators -c
@@ -1120,8 +1122,10 @@
-n100 -s1 -t50
-n100 -s5 -T 2 2 2
-n100 -s5 -T 2 1 2
- -n100 -s5 -T 2 0 4
- nr_dlsim.test1 nr_dlsim.test2 nr_dlsim.test3 nr_dlsim.test4 nr_dlsim.test5 nr_dlsim.test6 nr_dlsim.test7 nr_dlsim.test8 nr_dlsim.test9 nr_dlsim.test10 nr_dlsim.test11 nr_dlsim.test12 nr_dlsim.test13 nr_dlsim.test14 nr_dlsim.test15 nr_dlsim.test16
+ -n100 -s5 -T 2 0 4
+ -n100 -s2 -U 2 0 1
+ -n100 -s2 -U 2 0 2
+ nr_dlsim.test1 nr_dlsim.test2 nr_dlsim.test3 nr_dlsim.test4 nr_dlsim.test5 nr_dlsim.test6 nr_dlsim.test7 nr_dlsim.test8 nr_dlsim.test9 nr_dlsim.test10 nr_dlsim.test11 nr_dlsim.test12 nr_dlsim.test13 nr_dlsim.test14 nr_dlsim.test15 nr_dlsim.test16 nr_dlsim.test17 nr_dlsim.test18
PDSCH test OK
segmentation fault|assertion|exiting|fatal
3
diff --git a/doc/BASIC_SIM.md b/doc/BASIC_SIM.md
index ab4c3489d9..1bfc6e76d2 100644
--- a/doc/BASIC_SIM.md
+++ b/doc/BASIC_SIM.md
@@ -27,7 +27,7 @@ $ cd cmake_targets
$ ./build_oai --eNB --UE
```
-Both eNB (lte-softmodem) and UE (lte-uesoftmodem) are present on `cmake_targets/lte_build_oai/build` folder.
+Both eNB (lte-softmodem) and UE (lte-uesoftmodem) are present on `cmake_targets/ran_build/build` folder.
More details are available on the [build page](BUILD.md).
@@ -50,7 +50,7 @@ Example 1: running in FDD mode with EPC.
```bash
$ source oaienv
-$ cd cmake_targets/lte_build_oai/build
+$ cd cmake_targets/ran_build/build
$ ENODEB=1 sudo -E ./lte-softmodem -O $OPENAIR_HOME/ci-scripts/conf_files/lte-fdd-basic-sim.conf --basicsim
```
@@ -64,7 +64,7 @@ Example 2: running in TDD mode without any EPC.
```bash
$ source oaienv
-$ cd cmake_targets/lte_build_oai/build
+$ cd cmake_targets/ran_build/build
$ ENODEB=1 sudo -E ./lte-softmodem -O $OPENAIR_HOME/ci-scripts/conf_files/lte-tdd-basic-sim.conf --basicsim --noS1
```
@@ -79,7 +79,7 @@ You need to set the correct OPC, USIM_API_K, MSIN (this is the end par of the IM
```bash
$ source oaienv
# Edit openair3/NAS/TOOLS/ue_eurecom_test_sfr.conf
-$ cd cmake_targets/lte_build_oai/build
+$ cd cmake_targets/ran_build/build
$ ../../nas_sim_tools/build/conf2uedata -c $OPENAIR_HOME/openair3/NAS/TOOLS/ue_eurecom_test_sfr.conf -o .
$ sudo -E ./lte-uesoftmodem -C 2625000000 -r 25 --ue-rxgain 140 --basicsim [--noS1]
```
diff --git a/executables/nr-ue.c b/executables/nr-ue.c
index 54f0906e1c..8192546eb7 100644
--- a/executables/nr-ue.c
+++ b/executables/nr-ue.c
@@ -460,32 +460,13 @@ void UE_processing(void *arg) {
processingData_t *rxtxD = (processingData_t *) arg;
UE_nr_rxtx_proc_t *proc = &rxtxD->proc;
PHY_VARS_NR_UE *UE = rxtxD->UE;
+ int slot_tx = proc->nr_slot_tx;
+ int frame_tx = proc->frame_tx;
processSlotRX(UE, proc);
processSlotTX(UE, proc);
+ ue_ta_procedures(UE, slot_tx, frame_tx);
- /* UL time alignment
- // If the current tx frame and slot match the TA configuration in ul_time_alignment
- // then timing advance is processed and set to be applied in the next UL transmission */
- if (UE->mac_enabled == 1) {
- uint8_t gNB_id = 0;
- NR_UL_TIME_ALIGNMENT_t *ul_time_alignment = &UE->ul_time_alignment[gNB_id];
- int slot_tx = proc->nr_slot_tx;
- int frame_tx = proc->frame_tx;
-
- if (frame_tx == ul_time_alignment->ta_frame && slot_tx == ul_time_alignment->ta_slot) {
- uint8_t numerology = UE->frame_parms.numerology_index;
- uint16_t bwp_ul_NB_RB = UE->frame_parms.N_RB_UL;
-
- LOG_D(PHY,"Applying timing advance -- frame %d -- slot %d\n", frame_tx, slot_tx);
-
- //if (nfapi_mode!=3){
- nr_process_timing_advance(UE->Mod_id, UE->CC_id, ul_time_alignment->ta_command, numerology, bwp_ul_NB_RB);
- ul_time_alignment->ta_frame = -1;
- ul_time_alignment->ta_slot = -1;
- //}
- }
- }
}
void dummyWrite(PHY_VARS_NR_UE *UE,openair0_timestamp timestamp, int writeBlockSize) {
@@ -597,7 +578,7 @@ void *UE_thread(void *arg) {
//this thread should be over the processing thread to keep in real time
PHY_VARS_NR_UE *UE = (PHY_VARS_NR_UE *) arg;
// int tx_enabled = 0;
- openair0_timestamp timestamp;
+ openair0_timestamp timestamp, writeTimestamp;
void *rxp[NB_ANTENNAS_RX], *txp[NB_ANTENNAS_TX];
int start_rx_stream = 0;
AssertFatal(0== openair0_device_load(&(UE->rfdevice), &openair0_cfg[0]), "");
@@ -728,11 +709,6 @@ void *UE_thread(void *arg) {
UE->rx_offset_diff;
}
- if (UE->timing_advance != timing_advance) {
- writeBlockSize -= UE->timing_advance - timing_advance;
- timing_advance = UE->timing_advance;
- }
-
AssertFatal(readBlockSize ==
UE->rfdevice.trx_read_func(&UE->rfdevice,
×tamp,
@@ -780,12 +756,19 @@ void *UE_thread(void *arg) {
LOG_E(PHY,"Decoded frame index (%d) is not compatible with current context (%d), UE should go back to synch mode\n",
decoded_frame_rx, curMsg->proc.frame_rx );
+ // use previous timing_advance value to compute writeTimestamp
+ writeTimestamp = timestamp + UE->frame_parms.get_samples_slot_timestamp(slot_nr, &UE->frame_parms,DURATION_RX_TO_TX - RX_NB_TH) -
+ firstSymSamp - openair0_cfg[0].tx_sample_advance - UE->N_TA_offset - timing_advance;
+
+ // but use current UE->timing_advance value to compute writeBlockSize
+ if (UE->timing_advance != timing_advance) {
+ writeBlockSize -= UE->timing_advance - timing_advance;
+ timing_advance = UE->timing_advance;
+ }
+
AssertFatal( writeBlockSize ==
UE->rfdevice.trx_write_func(&UE->rfdevice,
- timestamp+
- UE->frame_parms.get_samples_slot_timestamp(slot_nr,
- &UE->frame_parms,DURATION_RX_TO_TX - RX_NB_TH) - firstSymSamp -
- openair0_cfg[0].tx_sample_advance - UE->N_TA_offset - UE->timing_advance,
+ writeTimestamp,
txp,
writeBlockSize,
UE->frame_parms.nb_antennas_tx,
diff --git a/executables/nr-uesoftmodem.c b/executables/nr-uesoftmodem.c
index 08834ed740..1d3288862d 100644
--- a/executables/nr-uesoftmodem.c
+++ b/executables/nr-uesoftmodem.c
@@ -151,6 +151,7 @@ double cpuf;
runmode_t mode = normal_txrx;
int UE_scan = 0;
int chain_offset = 0;
+int card_offset = 0;
uint64_t num_missed_slots = 0; // counter for the number of missed slots
int transmission_mode = 1;
int numerology = 0;
@@ -306,6 +307,9 @@ void set_options(int CC_id, PHY_VARS_NR_UE *UE){
UE->rx_total_gain_dB = (int)rx_gain[CC_id][0] + rx_gain_off;
UE->tx_total_gain_dB = (int)tx_gain[CC_id][0];
UE->tx_power_max_dBm = tx_max_power[CC_id];
+ UE->rf_map.card = card_offset;
+ UE->rf_map.chain = CC_id + chain_offset;
+ UE->timing_advance = timing_advance;
LOG_I(PHY,"Set UE mode %d, UE_fo_compensation %d, UE_scan %d, UE_scan_carrier %d, UE_no_timing_correction %d \n", mode, UE_fo_compensation, UE_scan, UE_scan_carrier, UE_no_timing_correction);
@@ -575,12 +579,6 @@ int main( int argc, char **argv ) {
load_softscope("nr",PHY_vars_UE_g[0][0]);
}
- for(int CC_id=0; CC_idrf_map.card=0;
- PHY_vars_UE_g[0][CC_id]->rf_map.chain=CC_id+chain_offset;
- PHY_vars_UE_g[0][CC_id]->timing_advance = timing_advance;
- }
-
init_NR_UE_threads(1);
printf("UE threads created by %ld\n", gettid());
diff --git a/openair1/PHY/INIT/nr_init_ue.c b/openair1/PHY/INIT/nr_init_ue.c
index abc504d6e3..cf93c41ee0 100644
--- a/openair1/PHY/INIT/nr_init_ue.c
+++ b/openair1/PHY/INIT/nr_init_ue.c
@@ -474,6 +474,10 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue,
ue->total_TBS_last[eNB_id] = 0;
ue->bitrate[eNB_id] = 0;
ue->total_received_bits[eNB_id] = 0;
+
+ ue->ul_time_alignment[eNB_id].apply_ta = 0;
+ ue->ul_time_alignment[eNB_id].ta_frame = -1;
+ ue->ul_time_alignment[eNB_id].ta_slot = -1;
}
// init NR modulation lookup tables
nr_generate_modulation_table();
diff --git a/openair1/PHY/NR_REFSIG/nr_gold_ue.c b/openair1/PHY/NR_REFSIG/nr_gold_ue.c
index 414582a31d..09528d5dbd 100644
--- a/openair1/PHY/NR_REFSIG/nr_gold_ue.c
+++ b/openair1/PHY/NR_REFSIG/nr_gold_ue.c
@@ -107,9 +107,10 @@ void nr_gold_pdcch(PHY_VARS_NR_UE* ue,
}
void nr_gold_pdsch(PHY_VARS_NR_UE* ue,
+ unsigned char ns,
unsigned short *n_idDMRS)
{
- unsigned char ns,l;
+ unsigned char l;
unsigned int n,x1,x2,x2tmp0;
int nscid;
unsigned int nid;
@@ -122,40 +123,35 @@ void nr_gold_pdsch(PHY_VARS_NR_UE* ue,
nid = n_idDMRS[nscid];
else
nid = ue->frame_parms.Nid_cell;
-
- //printf("gold pdsch nid %d lbar %d\n",nid,lbar);
- for (ns=0; ns<20; ns++) {
+ //printf("gold pdsch nid %d lbar %d\n",nid,lbar);
- for (l=0; l<14; l++) {
+ for (l=0; l<14; l++) {
+ x2tmp0 = ((14*ns+l+1)*((nid<<1)+1))<<17;
+ x2 = (x2tmp0+(nid<<1)+nscid)%(1<<31); //cinit
+ LOG_D(PHY,"UE DMRS slot %d, symb %d, x2 %x, nscid %d\n",ns,l,x2,nscid);
+ //printf("ns %d gold pdsch x2 %d\n",ns,x2);
- x2tmp0 = ((14*ns+l+1)*((nid<<1)+1))<<17;
- x2 = (x2tmp0+(nid<<1)+nscid)%(1<<31); //cinit
- LOG_D(PHY,"UE DMRS slot %d, symb %d, x2 %x, nscid %d\n",ns,l,x2,nscid);
- //printf("ns %d gold pdsch x2 %d\n",ns,x2);
+ x1 = 1+ (1<<31);
+ x2=x2 ^ ((x2 ^ (x2>>1) ^ (x2>>2) ^ (x2>>3))<<31);
- x1 = 1+ (1<<31);
- x2=x2 ^ ((x2 ^ (x2>>1) ^ (x2>>2) ^ (x2>>3))<<31);
-
- // skip first 50 double words (1600 bits)
- for (n=1; n<50; n++) {
- x1 = (x1>>1) ^ (x1>>4);
- x1 = x1 ^ (x1<<31) ^ (x1<<28);
- x2 = (x2>>1) ^ (x2>>2) ^ (x2>>3) ^ (x2>>4);
- x2 = x2 ^ (x2<<31) ^ (x2<<30) ^ (x2<<29) ^ (x2<<28);
- //printf("x1 : %x, x2 : %x\n",x1,x2);
- }
-
- for (n=0; n>1) ^ (x1>>4);
- x1 = x1 ^ (x1<<31) ^ (x1<<28);
- x2 = (x2>>1) ^ (x2>>2) ^ (x2>>3) ^ (x2>>4);
- x2 = x2 ^ (x2<<31) ^ (x2<<30) ^ (x2<<29) ^ (x2<<28);
- ue->nr_gold_pdsch[nscid][ns][l][n] = x1^x2;
- // if ((ns==2)&&(l==0))
- //printf("n=%d : c %x\n",n,x1^x2);
- }
+ // skip first 50 double words (1600 bits)
+ for (n=1; n<50; n++) {
+ x1 = (x1>>1) ^ (x1>>4);
+ x1 = x1 ^ (x1<<31) ^ (x1<<28);
+ x2 = (x2>>1) ^ (x2>>2) ^ (x2>>3) ^ (x2>>4);
+ x2 = x2 ^ (x2<<31) ^ (x2<<30) ^ (x2<<29) ^ (x2<<28);
+ //printf("x1 : %x, x2 : %x\n",x1,x2);
+ }
+ for (n=0; n>1) ^ (x1>>4);
+ x1 = x1 ^ (x1<<31) ^ (x1<<28);
+ x2 = (x2>>1) ^ (x2>>2) ^ (x2>>3) ^ (x2>>4);
+ x2 = x2 ^ (x2<<31) ^ (x2<<30) ^ (x2<<29) ^ (x2<<28);
+ ue->nr_gold_pdsch[nscid][ns][l][n] = x1^x2;
+ // if ((ns==2)&&(l==0))
+ //printf("n=%d : c %x\n",n,x1^x2);
}
}
}
diff --git a/openair1/PHY/NR_REFSIG/refsig_defs_ue.h b/openair1/PHY/NR_REFSIG/refsig_defs_ue.h
index f349cfcd98..83b43c54a0 100644
--- a/openair1/PHY/NR_REFSIG/refsig_defs_ue.h
+++ b/openair1/PHY/NR_REFSIG/refsig_defs_ue.h
@@ -61,6 +61,7 @@ void nr_gold_pdcch(PHY_VARS_NR_UE* ue,
unsigned short length_dmrs);
void nr_gold_pdsch(PHY_VARS_NR_UE* ue,
+ unsigned char ns,
unsigned short *n_idDMRS);
void nr_init_pusch_dmrs(PHY_VARS_NR_UE* ue,
diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c
index a528eb734c..d990176d79 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c
@@ -292,7 +292,7 @@ void nr_processULSegment(void* arg) {
int no_iteration_ldpc;
int Kr;
int Kr_bytes;
- int K_bytes_F;
+ int K_bits_F;
uint8_t crc_type;
int i;
int j;
@@ -318,8 +318,7 @@ void nr_processULSegment(void* arg) {
Kr = ulsch_harq->K;
Kr_bytes = Kr>>3;
-
- K_bytes_F = Kr_bytes-(ulsch_harq->F>>3);
+ K_bits_F = Kr-ulsch_harq->F;
t_nrLDPC_time_stats procTime;
t_nrLDPC_time_stats* p_procTime = &procTime ;
@@ -402,23 +401,19 @@ void nr_processULSegment(void* arg) {
//start_meas(&phy_vars_gNB->ulsch_ldpc_decoding_stats);
- memset(pv,0,2*ulsch_harq->Z*sizeof(int16_t));
- memset((pv+K_bytes_F),127,ulsch_harq->F*sizeof(int16_t));
-
- for (i=((2*p_decoderParms->Z)>>3), j = 0; i < K_bytes_F; i++, j++) {
- pv[i]= _mm_loadu_si128((__m128i*)(&ulsch_harq->d[r][8*j]));
- }
-
- AssertFatal(kc!=255,"");
- j+=(ulsch_harq->F>>3);
- for (i=Kr_bytes; i < ((kc*p_decoderParms->Z)>>3); i++, j++) {
- pv[i]= _mm_loadu_si128((__m128i*)(&ulsch_harq->d[r][8*j]));
- }
-
- for (i=0, j=0; j < ((kc*p_decoderParms->Z)>>4); i+=2, j++) {
+ //set first 2*Z_c bits to zeros
+ memset(&z[0],0,2*ulsch_harq->Z*sizeof(int16_t));
+ //set Filler bits
+ memset((&z[0]+K_bits_F),127,ulsch_harq->F*sizeof(int16_t));
+ //Move coded bits before filler bits
+ memcpy((&z[0]+2*ulsch_harq->Z),ulsch_harq->d[r],(K_bits_F-2*ulsch_harq->Z)*sizeof(int16_t));
+ //skip filler bits
+ memcpy((&z[0]+Kr),ulsch_harq->d[r]+(Kr-2*ulsch_harq->Z),(kc*ulsch_harq->Z-Kr)*sizeof(int16_t));
+ //Saturate coded bits before decoding into 8 bits values
+ for (i=0, j=0; j < ((kc*ulsch_harq->Z)>>4)+1; i+=2, j++)
+ {
pl[j] = _mm_packs_epi16(pv[i],pv[i+1]);
}
-
//////////////////////////////////////////////////////////////////////////////////////////
@@ -523,31 +518,27 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
if ((A <=292) || ((A<=3824) && (Coderate <= 0.6667)) || Coderate <= 0.25){
p_decParams->BG = 2;
+ kc = 52;
if (Coderate < 0.3333) {
p_decParams->R = 15;
- kc = 52;
}
else if (Coderate <0.6667) {
p_decParams->R = 13;
- kc = 32;
}
else {
p_decParams->R = 23;
- kc = 17;
}
} else {
p_decParams->BG = 1;
+ kc = 68;
if (Coderate < 0.6667) {
p_decParams->R = 13;
- kc = 68;
}
else if (Coderate <0.8889) {
p_decParams->R = 23;
- kc = 35;
}
else {
p_decParams->R = 89;
- kc = 27;
}
}
diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_adjust_gain.c b/openair1/PHY/NR_UE_ESTIMATION/nr_adjust_gain.c
index 161408254f..4a884b964b 100644
--- a/openair1/PHY/NR_UE_ESTIMATION/nr_adjust_gain.c
+++ b/openair1/PHY/NR_UE_ESTIMATION/nr_adjust_gain.c
@@ -27,7 +27,7 @@ void
phy_adjust_gain_nr (PHY_VARS_NR_UE *ue, uint32_t rx_power_fil_dB, uint8_t eNB_id)
{
- LOG_I(PHY,"Gain control: rssi %d (%d,%d)\n",
+ LOG_D(PHY,"Gain control: rssi %d (%d,%d)\n",
rx_power_fil_dB,
ue->measurements.rssi,
ue->measurements.rx_power_avg_dB[eNB_id]
@@ -61,7 +61,7 @@ phy_adjust_gain_nr (PHY_VARS_NR_UE *ue, uint32_t rx_power_fil_dB, uint8_t eNB_id
ue->rx_total_gain_dB = MIN_RF_GAIN;
}
- LOG_I(PHY,"Gain control: rx_total_gain_dB = %d TARGET_RX_POWER %d (max %d,rxpf %d)\n",ue->rx_total_gain_dB,TARGET_RX_POWER,MAX_RF_GAIN,rx_power_fil_dB);
+ LOG_D(PHY,"Gain control: rx_total_gain_dB = %d TARGET_RX_POWER %d (max %d,rxpf %d)\n",ue->rx_total_gain_dB,TARGET_RX_POWER,MAX_RF_GAIN,rx_power_fil_dB);
#ifdef DEBUG_PHY
/* if ((ue->frame%100==0) || (ue->frame < 10))
diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h b/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h
index 419f84d418..b295c74099 100644
--- a/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h
+++ b/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h
@@ -86,17 +86,17 @@ void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms,
void nr_ue_measurements(PHY_VARS_NR_UE *ue,
UE_nr_rxtx_proc_t *proc,
- unsigned int subframe_offset,
- unsigned char N0_symbol,
- unsigned char abstraction_flag,
- unsigned char rank_adaptation,
- uint8_t subframe);
+ uint8_t slot);
void nr_ue_rsrp_measurements(PHY_VARS_NR_UE *ue,
UE_nr_rxtx_proc_t *proc,
uint8_t slot,
uint8_t abstraction_flag);
+void nr_ue_rrc_measurements(PHY_VARS_NR_UE *ue,
+ UE_nr_rxtx_proc_t *proc,
+ uint8_t slot);
+
void phy_adjust_gain_nr(PHY_VARS_NR_UE *ue,
uint32_t rx_power_fil_dB,
uint8_t eNB_id);
diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_ue_measurements.c b/openair1/PHY/NR_UE_ESTIMATION/nr_ue_measurements.c
index 971db724c6..eebce03d83 100644
--- a/openair1/PHY/NR_UE_ESTIMATION/nr_ue_measurements.c
+++ b/openair1/PHY/NR_UE_ESTIMATION/nr_ue_measurements.c
@@ -19,6 +19,18 @@
* contact@openairinterface.org
*/
+/*! \file nr_ue_measurements.c
+ * \brief UE measurements routines
+ * \author R. Knopp, G. Casati
+ * \date 2020
+ * \version 0.1
+ * \company Eurecom, Fraunhofer IIS
+ * \email: knopp@eurecom.fr, guido.casati@iis.fraunhofer.de
+ * \note
+ * \warning
+ */
+
+#include "nr-softmodem-common.h"
#include "PHY/defs_nr_UE.h"
#include "PHY/phy_extern_nr_ue.h"
#include "common/utils/LOG/log.h"
@@ -33,29 +45,6 @@
//#define DEBUG_MEAS_UE
//#define DEBUG_RANK_EST
-#if 0
-int16_t cond_num_threshold = 0;
-
-void print_shorts(char *s,short *x)
-{
-
-
- printf("%s : %d,%d,%d,%d,%d,%d,%d,%d\n",s,
- x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7]
- );
-
-}
-void print_ints(char *s,int *x)
-{
-
-
- printf("%s : %d,%d,%d,%d\n",s,
- x[0],x[1],x[2],x[3]
- );
-
-}
-#endif
-
int16_t get_nr_PL(uint8_t Mod_id, uint8_t CC_id, uint8_t gNB_index){
PHY_VARS_NR_UE *ue = PHY_vars_UE_g[Mod_id][CC_id];
@@ -105,117 +94,84 @@ float_t get_nr_RSRP(module_id_t Mod_id,uint8_t CC_id,uint8_t gNB_index)
return -140.0;
}
-
void nr_ue_measurements(PHY_VARS_NR_UE *ue,
UE_nr_rxtx_proc_t *proc,
- unsigned int subframe_offset,
- unsigned char N0_symbol,
- unsigned char abstraction_flag,
- unsigned char rank_adaptation,
- uint8_t subframe)
+ uint8_t slot)
{
- int aarx,aatx,eNB_id=0; //,gain_offset=0;
- //int rx_power[NUMBER_OF_CONNECTED_eNB_MAX];
-
-/*#if defined(__x86_64__) || defined(__i386__)
- __m128i *dl_ch0_128, *dl_ch1_128;
-#elif defined(__arm__)
- int16x8_t *dl_ch0_128, *dl_ch1_128get_PL;
-#endif*/
-
+ int aarx, aatx, gNB_id = 0;
NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
- //unsigned int limit, subband;
- //int nb_subbands, subband_size, last_subband_size, *dl_ch0, *dl_ch1, N_RB_DL = frame_parms->N_RB_DL;
-
- int ch_offset, rank_tm3_tm4 = 0;
+ int ch_offset = frame_parms->ofdm_symbol_size*2;
+ NR_UE_DLSCH_t *dlsch = ue->dlsch[proc->thread_id][gNB_id][0];
+ uint8_t harq_pid = dlsch->current_harq_pid;
+ int N_RB_DL = dlsch->harq_processes[harq_pid]->nb_rb;
ue->measurements.nb_antennas_rx = frame_parms->nb_antennas_rx;
-
- /*int16_t *dl_ch;
- dl_ch = (int16_t *)&ue->pdsch_vars[proc->thread_id][0]->dl_ch_estimates[eNB_id][ch_offset];*/
- ch_offset = ue->frame_parms.ofdm_symbol_size*2;
-
-//printf("testing measurements\n");
// signal measurements
+ for (gNB_id = 0; gNB_id < ue->n_connected_eNB; gNB_id++){
- for (eNB_id=0; eNB_idn_connected_eNB; eNB_id++) {
- for (aarx=0; aarxnb_antennas_rx; aarx++) {
- for (aatx=0; aatxnb_antenna_ports_gNB; aatx++) {
- ue->measurements.rx_spatial_power[eNB_id][aatx][aarx] =
- (signal_energy_nodc(&ue->pdsch_vars[proc->thread_id][0]->dl_ch_estimates[eNB_id][ch_offset],
- (50*12)));
- //- ue->measurements.n0_power[aarx];
+ ue->measurements.rx_power_tot[gNB_id] = 0;
- if (ue->measurements.rx_spatial_power[eNB_id][aatx][aarx]<0)
- ue->measurements.rx_spatial_power[eNB_id][aatx][aarx] = 0; //ue->measurements.n0_power[aarx];
+ for (aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++){
- ue->measurements.rx_spatial_power_dB[eNB_id][aatx][aarx] = (unsigned short) dB_fixed(ue->measurements.rx_spatial_power[eNB_id][aatx][aarx]);
+ ue->measurements.rx_power[gNB_id][aarx] = 0;
- if (aatx==0)
- ue->measurements.rx_power[eNB_id][aarx] = ue->measurements.rx_spatial_power[eNB_id][aatx][aarx];
- else
- ue->measurements.rx_power[eNB_id][aarx] += ue->measurements.rx_spatial_power[eNB_id][aatx][aarx];
- } //aatx
+ for (aatx = 0; aatx < frame_parms->nb_antenna_ports_gNB; aatx++){
- ue->measurements.rx_power_dB[eNB_id][aarx] = (unsigned short) dB_fixed(ue->measurements.rx_power[eNB_id][aarx]);
+ ue->measurements.rx_spatial_power[gNB_id][aatx][aarx] = (signal_energy_nodc(&ue->pdsch_vars[proc->thread_id][0]->dl_ch_estimates[gNB_id][ch_offset], N_RB_DL*NR_NB_SC_PER_RB));
- if (aarx==0)
- ue->measurements.rx_power_tot[eNB_id] = ue->measurements.rx_power[eNB_id][aarx];
- else
- ue->measurements.rx_power_tot[eNB_id] += ue->measurements.rx_power[eNB_id][aarx];
- } //aarx
+ if (ue->measurements.rx_spatial_power[gNB_id][aatx][aarx]<0)
+ ue->measurements.rx_spatial_power[gNB_id][aatx][aarx] = 0;
- ue->measurements.rx_power_tot_dB[eNB_id] = (unsigned short) dB_fixed(ue->measurements.rx_power_tot[eNB_id]);
+ ue->measurements.rx_spatial_power_dB[gNB_id][aatx][aarx] = (unsigned short) dB_fixed(ue->measurements.rx_spatial_power[gNB_id][aatx][aarx]);
+ ue->measurements.rx_power[gNB_id][aarx] += ue->measurements.rx_spatial_power[gNB_id][aatx][aarx];
- } //eNB_id
-
- //printf("ue measurement addr dlch %p\n", dl_ch);
+ }
- eNB_id=0;
+ ue->measurements.rx_power_dB[gNB_id][aarx] = (unsigned short) dB_fixed(ue->measurements.rx_power[gNB_id][aarx]);
+ ue->measurements.rx_power_tot[gNB_id] += ue->measurements.rx_power[gNB_id][aarx];
- if (ue->transmission_mode[eNB_id]!=4 && ue->transmission_mode[eNB_id]!=3)
- ue->measurements.rank[eNB_id] = 0;
- else
- ue->measurements.rank[eNB_id] = rank_tm3_tm4;
- // printf ("tx mode %d\n", ue->transmission_mode[eNB_id]);
- // printf ("rank %d\n", ue->PHY_measurements.rank[eNB_id]);
+ }
+
+ ue->measurements.rx_power_tot_dB[gNB_id] = (unsigned short) dB_fixed(ue->measurements.rx_power_tot[gNB_id]);
+
+ }
// filter to remove jitter
if (ue->init_averaging == 0) {
- for (eNB_id = 0; eNB_id < ue->n_connected_eNB; eNB_id++)
- ue->measurements.rx_power_avg[eNB_id] = (int)
- (((k1*((long long int)(ue->measurements.rx_power_avg[eNB_id]))) +
- (k2*((long long int)(ue->measurements.rx_power_tot[eNB_id]))))>>10);
- //LOG_I(PHY,"Noise Power Computation: k1 %d k2 %d n0 avg %d n0 tot %d\n", k1, k2, ue->measurements.n0_power_avg,
- // ue->measurements.n0_power_tot);
- ue->measurements.n0_power_avg = (int)
- (((k1*((long long int) (ue->measurements.n0_power_avg))) +
- (k2*((long long int) (ue->measurements.n0_power_tot))))>>10);
+ for (gNB_id = 0; gNB_id < ue->n_connected_eNB; gNB_id++)
+ ue->measurements.rx_power_avg[gNB_id] = (int)(((k1*((long long int)(ue->measurements.rx_power_avg[gNB_id]))) + (k2*((long long int)(ue->measurements.rx_power_tot[gNB_id])))) >> 10);
+
+ ue->measurements.n0_power_avg = (int)(((k1*((long long int) (ue->measurements.n0_power_avg))) + (k2*((long long int) (ue->measurements.n0_power_tot))))>>10);
+
+ LOG_D(PHY, "Noise Power Computation: k1 %lld k2 %lld n0 avg %u n0 tot %u\n", k1, k2, ue->measurements.n0_power_avg, ue->measurements.n0_power_tot);
+
} else {
- for (eNB_id = 0; eNB_id < ue->n_connected_eNB; eNB_id++)
- ue->measurements.rx_power_avg[eNB_id] = ue->measurements.rx_power_tot[eNB_id];
+
+ for (gNB_id = 0; gNB_id < ue->n_connected_eNB; gNB_id++)
+ ue->measurements.rx_power_avg[gNB_id] = ue->measurements.rx_power_tot[gNB_id];
ue->measurements.n0_power_avg = ue->measurements.n0_power_tot;
ue->init_averaging = 0;
+
}
- for (eNB_id = 0; eNB_id < ue->n_connected_eNB; eNB_id++) {
- ue->measurements.rx_power_avg_dB[eNB_id] = dB_fixed( ue->measurements.rx_power_avg[eNB_id]);
- ue->measurements.wideband_cqi_tot[eNB_id] = dB_fixed2(ue->measurements.rx_power_tot[eNB_id],ue->measurements.n0_power_tot);
- ue->measurements.wideband_cqi_avg[eNB_id] = dB_fixed2(ue->measurements.rx_power_avg[eNB_id],ue->measurements.n0_power_avg);
- ue->measurements.rx_rssi_dBm[eNB_id] = ue->measurements.rx_power_avg_dB[eNB_id] - ue->rx_total_gain_dB;
-//#ifdef DEBUG_MEAS_UE
- LOG_D(PHY,"[eNB %d] Subframe %d, RSSI %d dBm, RSSI (digital) %d dB, WBandCQI %d dB, rxPwrAvg %d, n0PwrAvg %d\n",
- eNB_id,
- subframe,
- ue->measurements.rx_rssi_dBm[eNB_id],
- ue->measurements.rx_power_avg_dB[eNB_id],
- ue->measurements.wideband_cqi_avg[eNB_id],
- ue->measurements.rx_power_avg[eNB_id],
- ue->measurements.n0_power_tot);
-//#endif
+ for (gNB_id = 0; gNB_id < ue->n_connected_eNB; gNB_id++) {
+
+ ue->measurements.rx_power_avg_dB[gNB_id] = dB_fixed( ue->measurements.rx_power_avg[gNB_id]);
+ ue->measurements.wideband_cqi_tot[gNB_id] = dB_fixed2(ue->measurements.rx_power_tot[gNB_id], ue->measurements.n0_power_tot);
+ ue->measurements.wideband_cqi_avg[gNB_id] = dB_fixed2(ue->measurements.rx_power_avg[gNB_id], ue->measurements.n0_power_avg);
+ ue->measurements.rx_rssi_dBm[gNB_id] = ue->measurements.rx_power_avg_dB[gNB_id] - ue->rx_total_gain_dB;
+
+ LOG_D(PHY, "[gNB %d] Slot %d, RSSI %d dBm, RSSI (digital) %d dB, WBandCQI %d dB, rxPwrAvg %d, n0PwrAvg %d\n",
+ gNB_id,
+ slot,
+ ue->measurements.rx_rssi_dBm[gNB_id],
+ ue->measurements.rx_power_avg_dB[gNB_id],
+ ue->measurements.wideband_cqi_avg[gNB_id],
+ ue->measurements.rx_power_avg[gNB_id],
+ ue->measurements.n0_power_tot);
}
#if defined(__x86_64__) || defined(__i386__)
@@ -286,7 +242,7 @@ void nr_ue_rsrp_measurements(PHY_VARS_NR_UE *ue,
if (eNB_offset == 0)
- LOG_I(PHY,"[UE %d] slot %d RRC Measurements (idx %d, Cell id %d) => rsrp: %3.1f dBm/RE (%d)\n",
+ LOG_D(PHY,"[UE %d] slot %d RSRP Measurements (idx %d, Cell id %d) => rsrp: %3.1f dBm/RE (%d)\n",
ue->Mod_id,
slot,eNB_offset,
(eNB_offset>0) ? ue->measurements.adj_cell_id[eNB_offset-1] : ue->frame_parms.Nid_cell,
@@ -294,3 +250,66 @@ void nr_ue_rsrp_measurements(PHY_VARS_NR_UE *ue,
ue->measurements.rsrp[eNB_offset]);
}
+
+void nr_ue_rrc_measurements(PHY_VARS_NR_UE *ue,
+ UE_nr_rxtx_proc_t *proc,
+ uint8_t slot){
+
+ uint8_t k;
+ int aarx, nb_nulls;
+ int16_t *rxF_sss;
+ uint8_t k_left = 48;
+ uint8_t k_right = 183;
+ uint8_t k_length = 8;
+ uint8_t l_sss = ue->symbol_offset + 2;
+ unsigned int ssb_offset = ue->frame_parms.first_carrier_offset + ue->frame_parms.ssb_start_subcarrier;
+ ue->measurements.n0_power_tot = 0;
+
+ LOG_D(PHY, "In %s doing measurements for ssb_offset %d l_sss %d \n", __FUNCTION__, ssb_offset, l_sss);
+
+ for (aarx = 0; aarxframe_parms.nb_antennas_rx; aarx++) {
+
+ nb_nulls = 0;
+ ue->measurements.n0_power[aarx] = 0;
+ rxF_sss = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aarx][(l_sss*ue->frame_parms.ofdm_symbol_size) + ssb_offset];
+
+ //-ve spectrum from SSS
+ for(k = k_left; k < k_left + k_length; k++){
+
+ #ifdef DEBUG_MEAS_RRC
+ LOG_I(PHY, "In %s -rxF_sss %d %d\n", __FUNCTION__, rxF_sss[k*2], rxF_sss[k*2 + 1]);
+ #endif
+
+ ue->measurements.n0_power[aarx] += (((int32_t)rxF_sss[k*2]*rxF_sss[k*2]) + ((int32_t)rxF_sss[k*2 + 1]*rxF_sss[k*2 + 1]));
+ nb_nulls++;
+
+ }
+
+ //+ve spectrum from SSS
+ for(k = k_right; k < k_right + k_length; k++){
+
+ #ifdef DEBUG_MEAS_RRC
+ LOG_I(PHY, "In %s +rxF_sss %d %d\n", __FUNCTION__, rxF_sss[k*2], rxF_sss[k*2 + 1]);
+ #endif
+
+ ue->measurements.n0_power[aarx] += (((int32_t)rxF_sss[k*2]*rxF_sss[k*2]) + ((int32_t)rxF_sss[k*2 + 1]*rxF_sss[k*2 + 1]));
+ nb_nulls++;
+
+ }
+
+ ue->measurements.n0_power[aarx] /= nb_nulls;
+ ue->measurements.n0_power_dB[aarx] = (unsigned short) dB_fixed(ue->measurements.n0_power[aarx]);
+ ue->measurements.n0_power_tot += ue->measurements.n0_power[aarx];
+
+ }
+
+ ue->measurements.n0_power_tot_dB = (unsigned short) dB_fixed(ue->measurements.n0_power_tot/aarx);
+
+ #ifdef DEBUG_MEAS_RRC
+ int nf_usrp = ue->measurements.n0_power_tot_dB + 30 - ((int)openair0_cfg[0].rx_gain[0] - (int)openair0_cfg[0].rx_gain_offset[0]) - 90 - (-174 + dB_fixed(30000/*scs*/) + dB_fixed(ue->frame_parms.ofdm_symbol_size));
+ LOG_D(PHY, "In %s slot %d NF USRP %d dBm\n", __FUNCTION__, nf_usrp);
+ #endif
+
+ LOG_D(PHY, "In %s slot %d Noise Level %d ue->measurements.n0_power_tot_dB %d \n", __FUNCTION__, slot, ue->measurements.n0_power_tot, ue->measurements.n0_power_tot_dB);
+
+}
diff --git a/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c b/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c
index 5e45b90536..169942825d 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c
@@ -154,9 +154,11 @@ void nr_pdcch_demapping_deinterleaving(uint32_t *llr,
for (int i=0; i<9; i++) {
z[index_z + i] = llr[index_llr + i];
+#ifdef NR_PDCCH_DCI_DEBUG
LOG_D(PHY,"[reg=%d,bundle_j=%d] z[%d]=(%d,%d) <-> \t[f_reg=%d,fbundle_j=%d] llr[%d]=(%d,%d) \n",
reg,bundle_j,(index_z + i),*(int16_t *) &z[index_z + i],*(1 + (int16_t *) &z[index_z + i]),
f_reg,f_bundle_j,(index_llr + i),*(int16_t *) &llr[index_llr + i], *(1 + (int16_t *) &llr[index_llr + i]));
+#endif
}
if ((reg%reg_bundle_size_L) == 0) r++;
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
index 75cb6ff91b..808b21b40a 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
@@ -241,7 +241,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
uint32_t G;
uint32_t ret,offset;
int32_t no_iteration_ldpc, length_dec;
- uint32_t r,r_offset=0,Kr=8424,Kr_bytes,K_bytes_F,err_flag=0;
+ uint32_t r,r_offset=0,Kr=8424,Kr_bytes,K_bits_F,err_flag=0;
uint8_t crc_type;
int8_t llrProcBuf[NR_LDPC_MAX_NUM_LLR] __attribute__ ((aligned(32)));
t_nrLDPC_dec_params decParams;
@@ -349,32 +349,28 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
if ((A <=292) || ((A<=3824) && (Coderate <= 0.6667)) || Coderate <= 0.25)
{
p_decParams->BG = 2;
+ kc = 52;
if (Coderate < 0.3333){
p_decParams->R = 15;
- kc = 52;
}
else if (Coderate <0.6667){
p_decParams->R = 13;
- kc = 32;
}
else {
p_decParams->R = 23;
- kc = 17;
}
}
else{
p_decParams->BG = 1;
+ kc = 68;
if (Coderate < 0.6667){
p_decParams->R = 13;
- kc = 68;
}
else if (Coderate <0.8889){
p_decParams->R = 23;
- kc = 35;
}
else {
p_decParams->R = 89;
- kc = 27;
}
}
@@ -434,8 +430,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
Kr = harq_process->K; // [hna] overwrites this line "Kr = p_decParams->Z*kb"
Kr_bytes = Kr>>3;
-
- K_bytes_F = Kr_bytes-(harq_process->F>>3);
+ K_bits_F = Kr-harq_process->F;
for (r=0; rC; r++) {
@@ -558,24 +553,16 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
//printf("harq process dr iteration %d\n", p_decParams->numMaxIter);
- memset(pv,0,2*harq_process->Z*sizeof(int16_t));
- //memset(pl,0,2*p_decParams->Z*sizeof(int8_t));
- memset((pv+K_bytes_F),127,harq_process->F*sizeof(int16_t));
-
-
- for (i=((2*p_decParams->Z)>>3), j = 0; i < K_bytes_F; i++, j++)
- {
- pv[i]= _mm_loadu_si128((__m128i*)(&harq_process->d[r][8*j]));
- }
- // Kbytes_F = Kr_bytes - F>>3
- j+=(harq_process->F>>3);
- // for (i=Kr_bytes,j=K_bytes_F-((2*p_decParams->Z)>>3); i < ((kc*p_decParams->Z)>>3); i++, j++)
- for (i=Kr_bytes; i < ((kc*p_decParams->Z)>>3); i++,j++)
- {
- pv[i]= _mm_loadu_si128((__m128i*)(&harq_process->d[r][8*j]));
- }
-
- for (i=0, j=0; j < ((kc*p_decParams->Z)>>4); i+=2, j++)
+ //set first 2*Z_c bits to zeros
+ memset(&z[0],0,2*harq_process->Z*sizeof(int16_t));
+ //set Filler bits
+ memset((&z[0]+K_bits_F),127,harq_process->F*sizeof(int16_t));
+ //Move coded bits before filler bits
+ memcpy((&z[0]+2*harq_process->Z),harq_process->d[r],(K_bits_F-2*harq_process->Z)*sizeof(int16_t));
+ //skip filler bits
+ memcpy((&z[0]+Kr),harq_process->d[r]+(Kr-2*harq_process->Z),(kc*harq_process->Z-Kr)*sizeof(int16_t));
+ //Saturate coded bits before decoding into 8 bits values
+ for (i=0, j=0; j < ((kc*harq_process->Z)>>4)+1; i+=2, j++)
{
pl[j] = _mm_packs_epi16(pv[i],pv[i+1]);
}
@@ -776,7 +763,7 @@ uint32_t nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
uint32_t A,E;
uint32_t G;
uint32_t ret,offset;
- uint32_t r,r_offset=0,Kr=8424,Kr_bytes,err_flag=0,K_bytes_F;
+ uint32_t r,r_offset=0,Kr=8424,Kr_bytes,err_flag=0,K_bits_F;
uint8_t crc_type;
//UE_rxtx_proc_t *proc = &phy_vars_ue->proc;
int32_t no_iteration_ldpc,length_dec;
@@ -895,32 +882,28 @@ uint32_t nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
if ((A <=292) || ((A<=3824) && (Coderate <= 0.6667)) || Coderate <= 0.25)
{
p_decParams->BG = 2;
+ kc = 52;
if (Coderate < 0.3333){
p_decParams->R = 15;
- kc = 52;
}
else if (Coderate <0.6667){
p_decParams->R = 13;
- kc = 32;
}
else {
p_decParams->R = 23;
- kc = 17;
}
}
else{
p_decParams->BG = 1;
+ kc = 68;
if (Coderate < 0.6667){
p_decParams->R = 13;
- kc = 68;
}
else if (Coderate <0.8889){
p_decParams->R = 23;
- kc = 35;
}
else {
p_decParams->R = 89;
- kc = 27;
}
}
@@ -1020,7 +1003,7 @@ uint32_t nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
Kr = harq_process->K;
Kr_bytes = Kr>>3;
- K_bytes_F = Kr_bytes-(harq_process->F>>3);
+ K_bits_F = Kr-harq_process->F;
E = nr_get_E(G, harq_process->C, harq_process->Qm, harq_process->Nl, r);
@@ -1152,24 +1135,16 @@ uint32_t nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
inv_d[cnt] = (1)*harq_process->d[r][cnt];
}*/
- memset(pv,0,2*p_decParams->Z*sizeof(int16_t));
- //memset(pl,0,2*p_decParams->Z*sizeof(int8_t));
- memset((pv+K_bytes_F),127,harq_process->F*sizeof(int16_t));
-
-
- for (i=((2*p_decParams->Z)>>3), j = 0; i < K_bytes_F; i++, j++)
- {
- pv[i]= _mm_loadu_si128((__m128i*)(&harq_process->d[r][8*j]));
- }
-
- j+=(harq_process->F>>3);
- // for (i=Kr_bytes,j=K_bytes_F-((2*p_decParams->Z)>>3); i < ((kc*p_decParams->Z)>>3); i++, j++)
- for (i=Kr_bytes; i < ((kc*p_decParams->Z)>>3); i++,j++)
- {
- pv[i]= _mm_loadu_si128((__m128i*)(&harq_process->d[r][8*j]));
- }
-
- for (i=0, j=0; j < ((kc*p_decParams->Z)>>4); i+=2, j++)
+ //set first 2*Z_c bits to zeros
+ memset(&z[0],0,2*harq_process->Z*sizeof(int16_t));
+ //set Filler bits
+ memset((&z[0]+K_bits_F),127,harq_process->F*sizeof(int16_t));
+ //Move coded bits before filler bits
+ memcpy((&z[0]+2*harq_process->Z),harq_process->d[r],(K_bits_F-2*harq_process->Z)*sizeof(int16_t));
+ //skip filler bits
+ memcpy((&z[0]+Kr),harq_process->d[r]+(Kr-2*harq_process->Z),(kc*harq_process->Z-Kr)*sizeof(int16_t));
+ //Saturate coded bits before decoding into 8 bits values
+ for (i=0, j=0; j < ((kc*harq_process->Z)>>4)+1; i+=2, j++)
{
pl[j] = _mm_packs_epi16(pv[i],pv[i+1]);
}
@@ -1395,7 +1370,7 @@ void nr_dlsch_decoding_process(void *arg)
uint32_t A,E;
uint32_t G;
uint32_t ret,offset;
- uint32_t r,r_offset=0,Kr,Kr_bytes,err_flag=0,K_bytes_F;
+ uint32_t r,r_offset=0,Kr,Kr_bytes,err_flag=0,K_bits_F;
uint8_t crc_type;
uint8_t C,Cprime;
uint8_t Qm;
@@ -1457,32 +1432,28 @@ void nr_dlsch_decoding_process(void *arg)
if ((A <=292) || ((A<=3824) && (Coderate <= 0.6667)) || Coderate <= 0.25)
{
p_decParams->BG = 2;
+ kc = 52;
if (Coderate < 0.3333){
p_decParams->R = 15;
- kc = 52;
}
else if (Coderate <0.6667){
p_decParams->R = 13;
- kc = 32;
}
else {
p_decParams->R = 23;
- kc = 17;
}
}
else{
p_decParams->BG = 1;
+ kc = 68;
if (Coderate < 0.6667){
p_decParams->R = 13;
- kc = 68;
}
else if (Coderate <0.8889){
p_decParams->R = 23;
- kc = 35;
}
else {
p_decParams->R = 89;
- kc = 27;
}
}
@@ -1561,7 +1532,7 @@ void nr_dlsch_decoding_process(void *arg)
Kr = harq_process->K;
Kr_bytes = Kr>>3;
- K_bytes_F = Kr_bytes-(harq_process->F>>3);
+ K_bits_F = Kr-harq_process->F;
E = nr_get_E(G, harq_process->C, harq_process->Qm, harq_process->Nl, r);
@@ -1681,23 +1652,16 @@ void nr_dlsch_decoding_process(void *arg)
}
*/
- memset(pv,0,2*p_decParams->Z*sizeof(int16_t));
- //memset(pl,0,2*p_decParams->Z*sizeof(int8_t));
- memset((pv+K_bytes_F),127,harq_process->F*sizeof(int16_t));
-
- for (i=((2*p_decParams->Z)>>3), j = 0; i < K_bytes_F; i++, j++)
- {
- pv[i]= _mm_loadu_si128((__m128i*)(&harq_process->d[r][8*j]));
- }
-
- j+=(harq_process->F>>3);
- // for (i=Kr_bytes,j=K_bytes_F-((2*p_decParams->Z)>>3); i < ((kc*p_decParams->Z)>>3); i++, j++)
- for (i=Kr_bytes; i < ((kc*p_decParams->Z)>>3); i++,j++)
- {
- pv[i]= _mm_loadu_si128((__m128i*)(&harq_process->d[r][8*j]));
- }
-
- for (i=0, j=0; j < ((kc*p_decParams->Z)>>4); i+=2, j++)
+ //set first 2*Z_c bits to zeros
+ memset(&z[0],0,2*harq_process->Z*sizeof(int16_t));
+ //set Filler bits
+ memset((&z[0]+K_bits_F),127,harq_process->F*sizeof(int16_t));
+ //Move coded bits before filler bits
+ memcpy((&z[0]+2*harq_process->Z),harq_process->d[r],(K_bits_F-2*harq_process->Z)*sizeof(int16_t));
+ //skip filler bits
+ memcpy((&z[0]+Kr),harq_process->d[r]+(Kr-2*harq_process->Z),(kc*harq_process->Z-Kr)*sizeof(int16_t));
+ //Saturate coded bits before decoding into 8 bits values
+ for (i=0, j=0; j < ((kc*harq_process->Z)>>4)+1; i+=2, j++)
{
pl[j] = _mm_packs_epi16(pv[i],pv[i+1]);
}
diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h
index cf5f74856e..7b33b2040f 100644
--- a/openair1/PHY/defs_gNB.h
+++ b/openair1/PHY/defs_gNB.h
@@ -626,32 +626,33 @@ typedef struct {
short n0_subband_power_tot_dB[275];
//! estimated avg noise power per RB (dBm)
short n0_subband_power_tot_dBm[275];
+
// gNB measurements (per user)
//! estimated received spatial signal power (linear)
- unsigned int rx_spatial_power[NUMBER_OF_NR_DLSCH_MAX][2][2];
+ unsigned int rx_spatial_power[NUMBER_OF_NR_ULSCH_MAX][NB_ANTENNAS_TX][NB_ANTENNAS_RX];
//! estimated received spatial signal power (dB)
- unsigned short rx_spatial_power_dB[NUMBER_OF_NR_DLSCH_MAX][2][2];
+ unsigned short rx_spatial_power_dB[NUMBER_OF_NR_ULSCH_MAX][NB_ANTENNAS_TX][NB_ANTENNAS_RX];
//! estimated rssi (dBm)
- short rx_rssi_dBm[NUMBER_OF_NR_DLSCH_MAX];
+ short rx_rssi_dBm[NUMBER_OF_NR_ULSCH_MAX];
//! estimated correlation (wideband linear) between spatial channels (computed in dlsch_demodulation)
- int rx_correlation[NUMBER_OF_NR_DLSCH_MAX][2];
+ int rx_correlation[NUMBER_OF_NR_ULSCH_MAX][2];
//! estimated correlation (wideband dB) between spatial channels (computed in dlsch_demodulation)
- int rx_correlation_dB[NUMBER_OF_NR_DLSCH_MAX][2];
+ int rx_correlation_dB[NUMBER_OF_NR_ULSCH_MAX][2];
/// Wideband CQI (= SINR)
- int wideband_cqi[NUMBER_OF_NR_DLSCH_MAX][MAX_NUM_RU_PER_gNB];
+ int wideband_cqi[NUMBER_OF_NR_ULSCH_MAX][MAX_NUM_RU_PER_gNB];
/// Wideband CQI in dB (= SINR dB)
- int wideband_cqi_dB[NUMBER_OF_NR_DLSCH_MAX][MAX_NUM_RU_PER_gNB];
+ int wideband_cqi_dB[NUMBER_OF_NR_ULSCH_MAX][MAX_NUM_RU_PER_gNB];
/// Wideband CQI (sum of all RX antennas, in dB)
- char wideband_cqi_tot[NUMBER_OF_NR_DLSCH_MAX];
+ char wideband_cqi_tot[NUMBER_OF_NR_ULSCH_MAX];
/// Subband CQI per RX antenna and RB (= SINR)
- int subband_cqi[NUMBER_OF_NR_DLSCH_MAX][MAX_NUM_RU_PER_gNB][275];
+ int subband_cqi[NUMBER_OF_NR_ULSCH_MAX][MAX_NUM_RU_PER_gNB][275];
/// Total Subband CQI and RB (= SINR)
- int subband_cqi_tot[NUMBER_OF_NR_DLSCH_MAX][275];
+ int subband_cqi_tot[NUMBER_OF_NR_ULSCH_MAX][275];
/// Subband CQI in dB and RB (= SINR dB)
- int subband_cqi_dB[NUMBER_OF_NR_DLSCH_MAX][MAX_NUM_RU_PER_gNB][275];
+ int subband_cqi_dB[NUMBER_OF_NR_ULSCH_MAX][MAX_NUM_RU_PER_gNB][275];
/// Total Subband CQI and RB
- int subband_cqi_tot_dB[NUMBER_OF_NR_DLSCH_MAX][275];
+ int subband_cqi_tot_dB[NUMBER_OF_NR_ULSCH_MAX][275];
/// PRACH background noise level
int prach_I0;
} PHY_MEASUREMENTS_gNB;
diff --git a/openair1/PHY/defs_nr_UE.h b/openair1/PHY/defs_nr_UE.h
index 942fd9496a..ce10d2d6b1 100644
--- a/openair1/PHY/defs_nr_UE.h
+++ b/openair1/PHY/defs_nr_UE.h
@@ -212,10 +212,8 @@ typedef struct {
unsigned short rx_spatial_power_dB[NUMBER_OF_CONNECTED_eNB_MAX][2][2];
/// estimated received signal power (sum over all TX antennas)
- //int wideband_cqi[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX];
int rx_power[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX];
/// estimated received signal power (sum over all TX antennas)
- //int wideband_cqi_dB[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX];
unsigned short rx_power_dB[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX];
/// estimated received signal power (sum over all TX/RX antennas)
diff --git a/openair1/SCHED_NR_UE/defs.h b/openair1/SCHED_NR_UE/defs.h
index b74494a404..6a3d2c02b3 100644
--- a/openair1/SCHED_NR_UE/defs.h
+++ b/openair1/SCHED_NR_UE/defs.h
@@ -296,6 +296,13 @@ uint16_t nr_get_Np(uint8_t N_RB_DL,uint8_t nCCE,uint8_t plus1);
int8_t nr_find_ue(uint16_t rnti, PHY_VARS_eNB *phy_vars_eNB);
+/*! \brief UL time alignment procedures for TA application
+ @param PHY_VARS_NR_UE ue
+ @param int slot_tx
+ @param int frame_tx
+*/
+void ue_ta_procedures(PHY_VARS_NR_UE *ue, int slot_tx, int frame_tx);
+
/*! \brief Compute the timing adjustment at UE side from the old TA offset and the new received TA command
@param Mod_id Local UE index on which to act
@param CC_id Component Carrier Index
diff --git a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c
index c600343ed0..662c9c0516 100644
--- a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c
+++ b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c
@@ -61,13 +61,14 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){
if(scheduled_response->dl_config != NULL){
fapi_nr_dl_config_request_t *dl_config = scheduled_response->dl_config;
- LOG_D(PHY,"Received %d DL pdus\n",dl_config->number_pdus);
+ LOG_D(PHY,"Received %d DL pdus:\n",dl_config->number_pdus);
pdcch_vars->nb_search_space = 0;
for (i = 0; i < dl_config->number_pdus; ++i){
if (dl_config->dl_config_list[i].pdu_type == FAPI_NR_DL_CONFIG_TYPE_DCI) {
+ LOG_D(PHY,"FAPI_NR_DL_CONFIG_TYPE_DCI\n");
fapi_nr_dl_config_dci_dl_pdu_rel15_t *pdcch_config = &dl_config->dl_config_list[i].dci_config_pdu.dci_config_rel15;
memcpy((void*)&pdcch_vars->pdcch_config[pdcch_vars->nb_search_space],(void*)pdcch_config,sizeof(*pdcch_config));
pdcch_vars->nb_search_space = pdcch_vars->nb_search_space + 1;
@@ -76,9 +77,11 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){
} else {
if (dl_config->dl_config_list[i].pdu_type == FAPI_NR_DL_CONFIG_TYPE_DLSCH){
+ LOG_D(PHY,"FAPI_NR_DL_CONFIG_TYPE_DLSCH\n");
dlsch0 = PHY_vars_UE_g[module_id][cc_id]->dlsch[thread_id][0][0];
}
else if (dl_config->dl_config_list[i].pdu_type == FAPI_NR_DL_CONFIG_TYPE_RA_DLSCH){
+ LOG_D(PHY,"FAPI_NR_DL_CONFIG_TYPE_RA_DLSCH\n");
dlsch0 = PHY_vars_UE_g[module_id][cc_id]->dlsch_ra[0];
}
@@ -91,6 +94,8 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){
dlsch0->rnti = dl_config->dl_config_list[i].dlsch_config_pdu.rnti;
dlsch0_harq = dlsch0->harq_processes[current_harq_pid];
+ LOG_D(PHY,"current_harq_pid = %d\n", current_harq_pid);
+
if (dlsch0_harq){
dlsch0_harq->BWPStart = dlsch_config_pdu->BWPStart;
@@ -118,8 +123,7 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){
dlsch0_harq->nEpreRatioOfPDSCHToPTRS = dlsch_config_pdu->nEpreRatioOfPDSCHToPTRS;
dlsch0_harq->PTRSReOffset = dlsch_config_pdu->PTRSReOffset;
dlsch0_harq->pduBitmap = dlsch_config_pdu->pduBitmap;
- LOG_D(MAC, ">>>> \tdlsch0->g_pucch = %d\tdlsch0_harq.mcs = %d\n", dlsch0->g_pucch, dlsch0_harq->mcs);
-
+ LOG_D(MAC, ">>>> \tdlsch0->g_pucch = %d\tdlsch0_harq.mcs = %d\tpdsch_to_harq_feedback_time_ind = %d\tslot_for_feedback_ack = %d\n", dlsch0->g_pucch, dlsch0_harq->mcs, dlsch_config_pdu->pdsch_to_harq_feedback_time_ind, dlsch0_harq->harq_ack.slot_for_feedback_ack);
}
}
}
diff --git a/openair1/SCHED_NR_UE/harq_nr.c b/openair1/SCHED_NR_UE/harq_nr.c
index bf17da9b8c..f3e5f91285 100644
--- a/openair1/SCHED_NR_UE/harq_nr.c
+++ b/openair1/SCHED_NR_UE/harq_nr.c
@@ -302,7 +302,7 @@ harq_result_t uplink_harq_process(NR_UE_ULSCH_t *ulsch, int harq_pid, int ndi, u
result_harq = NEW_TRANSMISSION_HARQ;
- NR_TST_PHY_PRINTF("[HARQ-UL-PUSCH harqId : %d] first new transmission \n", harq_pid);
+ LOG_D(PHY, "[HARQ-UL-PUSCH harqId : %d] first new transmission \n", harq_pid);
}
/* 38.321 5.4.2.1 2> if the received grant was not addressed to a Temporary C-RNTI on PDCCH, and the NDI provided in the associated HARQ */
/* information has been toggled compared to the value in the previous transmission of this TB of this HARQ process */
@@ -313,7 +313,7 @@ harq_result_t uplink_harq_process(NR_UE_ULSCH_t *ulsch, int harq_pid, int ndi, u
result_harq = NEW_TRANSMISSION_HARQ;
- NR_TST_PHY_PRINTF("[HARQ-UL-PUSCH harqId : %d] new transmission due to toogle of ndi \n", harq_pid);
+ LOG_D(PHY, "[HARQ-UL-PUSCH harqId : %d] new transmission due to toogle of ndi \n", harq_pid);
}
/* 38.321 5.4.2.1 2> else (i.e. retransmission): */
else {
@@ -322,7 +322,7 @@ harq_result_t uplink_harq_process(NR_UE_ULSCH_t *ulsch, int harq_pid, int ndi, u
result_harq = RETRANSMISSION_HARQ;
- NR_TST_PHY_PRINTF("[HARQ-UL-PUSCH harqId : %d] retransmission \n", harq_pid);
+ LOG_D(PHY, "[HARQ-UL-PUSCH harqId : %d] retransmission \n", harq_pid);
}
return (result_harq);
@@ -476,7 +476,7 @@ harq_result_t downlink_harq_process(NR_DL_UE_HARQ_t *dl_harq, int harq_pid, int
result_harq = NEW_TRANSMISSION_HARQ;
- NR_TST_PHY_PRINTF("[HARQ-DL-PDSCH harqId : %d] first new reception \n", harq_pid);
+ LOG_D(PHY, "[HARQ-DL-PDSCH harqId : %d] first new reception \n", harq_pid);
}
else if (dl_harq->DCINdi != ndi) {
dl_harq->round = 0;
@@ -485,7 +485,7 @@ harq_result_t downlink_harq_process(NR_DL_UE_HARQ_t *dl_harq, int harq_pid, int
result_harq = NEW_TRANSMISSION_HARQ;
- NR_TST_PHY_PRINTF("[HARQ-DL-PDSCH harqId : %d] new reception due to toogle of ndi \n", harq_pid);
+ LOG_D(PHY, "[HARQ-DL-PDSCH harqId : %d] new reception due to toogle of ndi \n", harq_pid);
}
else {
@@ -495,7 +495,7 @@ harq_result_t downlink_harq_process(NR_DL_UE_HARQ_t *dl_harq, int harq_pid, int
result_harq = RETRANSMISSION_HARQ;
- NR_TST_PHY_PRINTF("[HARQ-DL-PDSCH harqId : %d] reception of a retransmission \n", harq_pid);
+ LOG_D(PHY, "[HARQ-DL-PDSCH harqId : %d] reception of a retransmission \n", harq_pid);
}
return (result_harq);
diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
index ae85135ba0..1e588b1103 100644
--- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
+++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
@@ -134,10 +134,10 @@ UE_MODE_t get_nrUE_mode(uint8_t Mod_id,uint8_t CC_id,uint8_t gNB_id){
return(PHY_vars_UE_g[Mod_id][CC_id]->UE_mode[gNB_id]);
}
-uint16_t get_bw_scaling(uint16_t bwp_ul_NB_RB){
+// scale the 16 factor in N_TA calculation in 38.213 section 4.2 according to the used FFT size
+uint16_t get_bw_scaling(uint16_t nb_rb){
uint16_t bw_scaling;
- // scale the 16 factor in N_TA calculation in 38.213 section 4.2 according to the used FFT size
- switch (bwp_ul_NB_RB) {
+ switch (nb_rb) {
case 32: bw_scaling = 4; break;
case 66: bw_scaling = 8; break;
case 106: bw_scaling = 16; break;
@@ -149,6 +149,32 @@ uint16_t get_bw_scaling(uint16_t bwp_ul_NB_RB){
return bw_scaling;
}
+/* UL time alignment
+// If the current tx frame and slot match the TA configuration in ul_time_alignment
+// then timing advance is processed and set to be applied in the next UL transmission */
+void ue_ta_procedures(PHY_VARS_NR_UE *ue, int slot_tx, int frame_tx){
+
+ if (ue->mac_enabled == 1) {
+
+ uint8_t gNB_id = 0;
+ NR_UL_TIME_ALIGNMENT_t *ul_time_alignment = &ue->ul_time_alignment[gNB_id];
+
+ if (frame_tx == ul_time_alignment->ta_frame && slot_tx == ul_time_alignment->ta_slot) {
+
+ uint8_t numerology = ue->frame_parms.numerology_index;
+ uint16_t bwp_ul_NB_RB = ue->frame_parms.N_RB_UL;
+
+ LOG_D(PHY, "In %s: applying timing advance -- frame %d -- slot %d\n", __FUNCTION__, frame_tx, slot_tx);
+
+ nr_process_timing_advance(ue->Mod_id, ue->CC_id, ul_time_alignment->ta_command, numerology, bwp_ul_NB_RB);
+
+ ul_time_alignment->ta_frame = -1;
+ ul_time_alignment->ta_slot = -1;
+
+ }
+ }
+}
+
void nr_process_timing_advance(module_id_t Mod_id, uint8_t CC_id, uint8_t ta_command, uint8_t mu, uint16_t bwp_ul_NB_RB){
// 3GPP TS 38.213 p4.2
@@ -178,10 +204,8 @@ void nr_process_timing_advance_rar(PHY_VARS_NR_UE *ue, int frame_rx, int nr_slot
void phy_procedures_nrUE_TX(PHY_VARS_NR_UE *ue,
UE_nr_rxtx_proc_t *proc,
uint8_t gNB_id) {
- //int32_t ulsch_start=0;
int slot_tx = proc->nr_slot_tx;
int frame_tx = proc->frame_tx;
- uint8_t harq_pid = 0;
runmode_t mode = normal_txrx;
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX,VCD_FUNCTION_IN);
@@ -196,16 +220,18 @@ void phy_procedures_nrUE_TX(PHY_VARS_NR_UE *ue,
if (ue->UE_mode[gNB_id] <= PUSCH){
- if (ue->ulsch[proc->thread_id][gNB_id][0]->harq_processes[harq_pid]->status == ACTIVE)
- nr_ue_ulsch_procedures(ue, harq_pid, frame_tx, slot_tx, proc->thread_id, gNB_id);
+ for (uint8_t harq_pid = 0; harq_pid < ue->ulsch[proc->thread_id][gNB_id][0]->number_harq_processes_for_pusch; harq_pid++) {
+ if (ue->ulsch[proc->thread_id][gNB_id][0]->harq_processes[harq_pid]->status == ACTIVE)
+ nr_ue_ulsch_procedures(ue, harq_pid, frame_tx, slot_tx, proc->thread_id, gNB_id);
+ }
- if (get_softmodem_params()->usim_test==0) {
+ if (get_softmodem_params()->usim_test==0) {
LOG_D(PHY, "Generating PUCCH\n");
pucch_procedures_ue_nr(ue,
gNB_id,
proc,
FALSE);
- }
+ }
LOG_D(PHY, "Sending Uplink data \n");
nr_ue_pusch_common_procedures(ue,
@@ -230,14 +256,12 @@ void phy_procedures_nrUE_TX(PHY_VARS_NR_UE *ue,
}
-void nr_ue_measurement_procedures(uint16_t l, // symbol index of each slot [0..6]
- PHY_VARS_NR_UE *ue,
- UE_nr_rxtx_proc_t *proc,
- uint8_t eNB_id,
- uint16_t slot, // slot index of each radio frame [0..19]
- runmode_t mode)
-{
- LOG_D(PHY,"ue_measurement_procedures l %u Ncp %d\n",l,ue->frame_parms.Ncp);
+void nr_ue_measurement_procedures(uint16_t l,
+ PHY_VARS_NR_UE *ue,
+ UE_nr_rxtx_proc_t *proc,
+ uint8_t eNB_id,
+ uint16_t slot,
+ runmode_t mode){
NR_DL_FRAME_PARMS *frame_parms=&ue->frame_parms;
int frame_rx = proc->frame_rx;
@@ -245,18 +269,14 @@ void nr_ue_measurement_procedures(uint16_t l, // symbol index of each slot [0
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_MEASUREMENT_PROCEDURES, VCD_FUNCTION_IN);
if (l==2) {
- // UE measurements on symbol 0
- LOG_D(PHY,"Calling measurements nr_slot_rx %d, rxdata %p\n",nr_slot_rx,ue->common_vars.rxdata);
-/*
- nr_ue_measurements(ue,
- proc,
- 0,
- 0,
- 0,
- 0,
- nr_slot_rx);
-*/
- //(nr_slot_rx*frame_parms->samples_per_slot+ue->rx_offset) % frame_parms->samples_per_frame
+
+ LOG_D(PHY,"Doing UE measurement procedures in symbol l %u Ncp %d nr_slot_rx %d, rxdata %p\n",
+ l,
+ ue->frame_parms.Ncp,
+ nr_slot_rx,
+ ue->common_vars.rxdata);
+
+ nr_ue_measurements(ue, proc, nr_slot_rx);
#if T_TRACER
if(slot == 0)
@@ -270,21 +290,6 @@ void nr_ue_measurement_procedures(uint16_t l, // symbol index of each slot [0
T_INT((int)ue->common_vars.freq_offset));
#endif
}
-#if 0
- if (l==(6-ue->frame_parms.Ncp)) {
-
- // make sure we have signal from PSS/SSS for N0 measurement
- // LOG_I(PHY," l==(6-ue->frame_parms.Ncp) ue_rrc_measurements\n");
-
- VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_RRC_MEASUREMENTS, VCD_FUNCTION_IN);
- ue_rrc_measurements(ue,
- slot,
- abstraction_flag);
- VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_RRC_MEASUREMENTS, VCD_FUNCTION_OUT);
-
-
- }
-#endif
// accumulate and filter timing offset estimation every subframe (instead of every frame)
if (( slot == 2) && (l==(2-frame_parms->Ncp))) {
@@ -945,7 +950,7 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
uint16_t ofdm_symbol_size = ue->frame_parms.ofdm_symbol_size;
uint16_t nb_prefix_samples = ue->frame_parms.nb_prefix_samples;
uint32_t t_subframe = 1; // subframe duration of 1 msec
- uint16_t bw_scaling, start_symbol;
+ uint16_t start_symbol;
float tc_factor;
is_cw0_active = dlsch0->harq_processes[harq_pid]->status;
@@ -1256,16 +1261,7 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
if (ue->mac_enabled == 1) {
- // scale the 16 factor in N_TA calculation in 38.213 section 4.2 according to the used FFT size
- switch (ue->frame_parms.N_RB_DL) {
- case 32: bw_scaling = 4; break;
- case 66: bw_scaling = 8; break;
- case 106: bw_scaling = 16; break;
- case 217: bw_scaling = 32; break;
- case 245: bw_scaling = 32; break;
- case 273: bw_scaling = 32; break;
- default: abort();
- }
+ uint16_t bw_scaling = get_bw_scaling(ue->frame_parms.N_RB_DL);
/* Time Alignment procedure
// - UE processing capability 1
@@ -1716,8 +1712,6 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
uint8_t nb_symb_pdcch = pdcch_vars->nb_search_space > 0 ? pdcch_vars->pdcch_config[0].coreset.duration : 0;
uint8_t dci_cnt = 0;
NR_DL_FRAME_PARMS *fp = &ue->frame_parms;
-
- //NR_UE_MAC_INST_t *mac = get_mac_inst(0);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_IN);
@@ -1777,6 +1771,9 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
0,
16384);
}
+
+ LOG_D(PHY, "Doing N0 measurements in %s\n", __FUNCTION__);
+ nr_ue_rrc_measurements(ue, proc, nr_slot_rx);
}
}
@@ -1791,7 +1788,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
LOG_D(PHY," ------ --> PDCCH ChannelComp/LLR Frame.slot %d.%d ------ \n", frame_rx%1024, nr_slot_rx);
for (uint16_t l=0; lofdm_demod_stats);
#endif
@@ -1850,8 +1847,8 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
for (int i=0;i<4;i++) if (((1<dlDmrsSymbPos) > 0) {symb_dmrs=i;break;}
AssertFatal(symb_dmrs>=0,"no dmrs in 0..3\n");
- LOG_D(PHY,"Initializing dmrs for symb %d DMRS mask %x\n",symb_dmrs,dlsch0_harq->dlDmrsSymbPos);
- nr_gold_pdsch(ue,0);
+ LOG_D(PHY,"Initializing dmrs for slot %d DMRS mask %x\n", nr_slot_rx, dlsch0_harq->dlDmrsSymbPos);
+ nr_gold_pdsch(ue, nr_slot_rx, 0);
for (uint16_t m=start_symb_sch;m<(nb_symb_sch+start_symb_sch) ; m++){
nr_slot_fep(ue,
@@ -1882,19 +1879,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
ue->dlsch[proc->thread_id][gNB_id][0],
NULL);
- //printf("phy procedure pdsch start measurement\n");
- nr_ue_measurement_procedures(2,ue,proc,gNB_id,nr_slot_rx,mode);
-
- /*
- write_output("rxF.m","rxF",&ue->common_vars.common_vars_rx_data_per_thread[proc->thread_id].rxdataF[0][0],fp->ofdm_symbol_size*14,1,1);
- write_output("rxF_ch.m","rxFch",&ue->pdsch_vars[proc->thread_id][gNB_id]->dl_ch_estimates[0][0],fp->ofdm_symbol_size*14,1,1);
- write_output("rxF_ch_ext.m","rxFche",&ue->pdsch_vars[proc->thread_id][gNB_id]->dl_ch_estimates_ext[0][2*50*12],50*12,1,1);
- write_output("rxF_ext.m","rxFe",&ue->pdsch_vars[proc->thread_id][gNB_id]->rxdataF_ext[0][0],50*12*14,1,1);
- write_output("rxF_comp.m","rxFc",&ue->pdsch_vars[proc->thread_id][gNB_id]->rxdataF_comp0[0][0],fp->N_RB_DL*12*14,1,1);
- write_output("rxF_llr.m","rxFllr",ue->pdsch_vars[proc->thread_id][gNB_id]->llr[0],(nb_symb_sch-1)*50*12+50*6,1,0);
- */
-
- //VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC, VCD_FUNCTION_OUT);
+ nr_ue_measurement_procedures(2, ue, proc, gNB_id, nr_slot_rx, mode);
}
// do procedures for SI-RNTI
diff --git a/openair1/SCHED_NR_UE/pucch_power_control_ue_nr.c b/openair1/SCHED_NR_UE/pucch_power_control_ue_nr.c
index e2e2143287..f43f4d98c9 100644
--- a/openair1/SCHED_NR_UE/pucch_power_control_ue_nr.c
+++ b/openair1/SCHED_NR_UE/pucch_power_control_ue_nr.c
@@ -98,7 +98,7 @@ int16_t get_pucch_tx_power_ue(PHY_VARS_NR_UE *ue,
}
else {
G_b_f_c = ue->dlsch[proc->thread_id][gNB_id][0]->g_pucch;
- LOG_W(PHY,"PUCCH Transmit power control command not yet implemented for NR : at line %d in function %s of file %s \n", LINE_FILE , __func__, __FILE__);
+ LOG_D(PHY,"PUCCH Transmit power control command not yet implemented for NR : at line %d in function %s of file %s \n", LINE_FILE , __func__, __FILE__);
return (PUCCH_POWER_DEFAULT);
}
diff --git a/openair1/SCHED_NR_UE/pucch_uci_ue_nr.c b/openair1/SCHED_NR_UE/pucch_uci_ue_nr.c
index 1e5a51450d..2035564ad8 100644
--- a/openair1/SCHED_NR_UE/pucch_uci_ue_nr.c
+++ b/openair1/SCHED_NR_UE/pucch_uci_ue_nr.c
@@ -247,6 +247,8 @@ bool pucch_procedures_ue_nr(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_
pucch_resource_indicator = ue->dlsch[proc->thread_id][gNB_id][0]->harq_processes[dl_harq_pid]->harq_ack.pucch_resource_indicator;
}
+ LOG_D(PHY, "PUCCH: %d.%d dl_harq_pid = %d, pucch_resource_indicator = %d\n", frame_tx, nr_slot_tx, dl_harq_pid, pucch_resource_indicator);
+
/* Part - I
* Collect feedback that should be transmitted at this nr_slot_tx :
* - ACK/NACK, SR, CSI (CQI, RI, ...)
diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c
index 876fef9dbc..e7ae8b21fb 100644
--- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c
+++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c
@@ -2131,6 +2131,10 @@ int get_num_dmrs(uint16_t dmrs_mask ) {
for (int i=0;i<16;i++) num_dmrs+=((dmrs_mask>>i)&1);
return(num_dmrs);
}
+/* returns the total DMRS symbols in a slot*/
+uint8_t get_num_dmrs_symbols(NR_PDSCH_Config_t *pdsch_Config,int dmrs_TypeA_Position,int NrOfSymbols){
+ return get_num_dmrs(fill_dmrs_mask(pdsch_Config,dmrs_TypeA_Position,NrOfSymbols));
+}
// Table 5.1.2.2.1-1 38.214
uint8_t getRBGSize(uint16_t bwp_size, long rbg_size_config) {
diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h
index 2be97ba8f6..0111979351 100644
--- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h
+++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h
@@ -191,4 +191,7 @@ bool set_dl_ptrs_values(NR_PTRS_DownlinkConfig_t *ptrs_config,
uint8_t *K_ptrs, uint8_t *L_ptrs,uint8_t *portIndex,
uint8_t *nERatio,uint8_t *reOffset,
uint8_t NrOfSymbols);
+
+uint8_t get_num_dmrs_symbols(NR_PDSCH_Config_t *pdsch_Config,int dmrs_TypeA_Position,int NrOfSymbols);
+
#endif
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c
index 7acae47204..0e6b6afbe6 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c
@@ -171,8 +171,8 @@ void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t
rel15->BWPSize,
rel15->BWPStart,
rel15->SubcarrierSpacing,
- rel15->dci_format,
- rel15->dci_length,
+ rel15->dci_format_options[0],
+ rel15->dci_length_options[0],
sps,
monitoringSymbolsWithinSlot);
#endif
@@ -213,9 +213,9 @@ void ue_dci_configuration(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_request_t *dl
// check available SS IDs
if (pdcch_ConfigCommon->choice.setup->ra_SearchSpace){
if (ss->searchSpaceId == *pdcch_ConfigCommon->choice.setup->ra_SearchSpace){
- LOG_D(MAC, "[DCI_CONFIG] Configure monitoring of PDCCH candidates in Type1-PDCCH common random access search space\n");
switch(mac->ra_state){
case WAIT_RAR:
+ LOG_D(MAC, "[DCI_CONFIG] Configure monitoring of PDCCH candidates in Type1-PDCCH common random access search space\n");
rel15->num_dci_options = 1;
rel15->dci_format_options[0] = NR_DL_DCI_FORMAT_1_0;
config_dci_pdu(mac, rel15, dl_config, NR_RNTI_RA, ss_id);
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
index 9ccc65aca7..53bc5f31b9 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
@@ -1060,7 +1060,7 @@ int8_t nr_ue_decode_mib(module_id_t module_id,
num_rbs = table_38213_13_4_c2[index_4msb];
num_symbols = table_38213_13_4_c3[index_4msb];
rb_offset = table_38213_13_4_c4[index_4msb];
- LOG_I(MAC,"<<<<<<<<type0_pdcch_ss_mux_pattern = 1;
@@ -1420,6 +1420,7 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in
// check type0 from 38.213 13 if we have no CellGroupConfig
// TODO: implementation to be completed
if (mac->scg == NULL) {
+
if(dl_info->ssb_index != -1){
if(mac->type0_pdcch_ss_mux_pattern == 1){
@@ -5156,9 +5157,6 @@ nr_ue_get_sdu(module_id_t module_idP, int CC_id, frame_t frameP,
module_idP, frameP, subframe, buflen);
AssertFatal(CC_id == 0,
"Transmission on secondary CCs is not supported yet\n");
-#if UE_TIMING_TRACE
- start_meas(&UE_mac_inst[module_idP].tx_ulsch_sdu);
-#endif
// Check for DCCH first
// TO DO: Multiplex in the order defined by the logical channel prioritization
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
index 429d88734b..2b90551e78 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
@@ -505,6 +505,9 @@ void nr_simple_dlsch_preprocessor(module_id_t module_id,
getN_PRB_DMRS(sched_ctrl->active_bwp, sched_ctrl->numDmrsCdmGrpsNoData);
int nrOfSymbols = getNrOfSymbols(sched_ctrl->active_bwp,
sched_ctrl->time_domain_allocation);
+ uint8_t N_DMRS_SLOT = get_num_dmrs_symbols(sched_ctrl->active_bwp->bwp_Dedicated->pdsch_Config->choice.setup,
+ RC.nrmac[module_id]->common_channels->ServingCellConfigCommon->dmrs_TypeA_Position ,
+ nrOfSymbols);
int rbSize = 0;
const int oh = 2 + (sched_ctrl->num_total_bytes >= 256)
@@ -516,8 +519,7 @@ void nr_simple_dlsch_preprocessor(module_id_t module_id,
nr_get_code_rate_dl(sched_ctrl->mcs, sched_ctrl->mcsTableIdx),
rbSize,
nrOfSymbols,
- N_PRB_DMRS, // FIXME // This should be multiplied by the
- // number of dmrs symbols
+ N_PRB_DMRS * N_DMRS_SLOT,
0 /* N_PRB_oh, 0 for initialBWP */,
0 /* tb_scaling */,
1 /* nrOfLayers */)
@@ -577,13 +579,16 @@ void nr_schedule_ue_spec(module_id_t module_id,
uint8_t N_PRB_DMRS =
getN_PRB_DMRS(sched_ctrl->active_bwp, sched_ctrl->numDmrsCdmGrpsNoData);
+
+ uint8_t N_DMRS_SLOT = get_num_dmrs_symbols(sched_ctrl->active_bwp->bwp_Dedicated->pdsch_Config->choice.setup,
+ RC.nrmac[module_id]->common_channels->ServingCellConfigCommon->dmrs_TypeA_Position ,
+ nrOfSymbols);
const uint32_t TBS =
nr_compute_tbs(nr_get_Qm_dl(sched_ctrl->mcs, sched_ctrl->mcsTableIdx),
nr_get_code_rate_dl(sched_ctrl->mcs, sched_ctrl->mcsTableIdx),
sched_ctrl->rbSize,
nrOfSymbols,
- N_PRB_DMRS, // FIXME // This should be multiplied by the
- // number of dmrs symbols
+ N_PRB_DMRS * N_DMRS_SLOT,
0 /* N_PRB_oh, 0 for initialBWP */,
0 /* tb_scaling */,
1 /* nrOfLayers */)
diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c
index 12ad6bf6a2..9b6de7c168 100644
--- a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c
+++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c
@@ -358,16 +358,7 @@ boolean_t pdcp_data_req(
LOG_D(PDCP, "pdcp data req on drb %ld, size %d, rnti %x, node_type %d \n",
rb_idP, pdcp_pdu_size, ctxt_pP->rnti, RC.rrc ? RC.rrc[ctxt_pP->module_id]->node_type: -1);
- // The check on nos1 is done only for the use case of LTE stack running over 5g-nr PHY. This should be changed
- // before future merge of develop with develop-nr and instead of a check of IS_SOFTMODEM_NOS1, we should use a check
- // with a new execution option capturing the nr-ip-over-LTE-stack use case.
- ngran_node_t node_type;
- if (IS_SOFTMODEM_NOS1)
- node_type = ngran_gNB;
- else
- node_type = RC.rrc[ctxt_pP->module_id]->node_type;
-
- if (ctxt_pP->enb_flag == ENB_FLAG_YES && NODE_IS_DU(node_type)) { //RC.rrc[ctxt_pP->module_id]->node_type
+ if (ctxt_pP->enb_flag == ENB_FLAG_YES && NODE_IS_DU(RC.rrc[ctxt_pP->module_id]->node_type)) {
LOG_E(PDCP, "Can't be DU, bad node type %d \n", RC.rrc[ctxt_pP->module_id]->node_type);
ret=FALSE;
} else {
diff --git a/openair2/RRC/NR/rrc_gNB_internode.c b/openair2/RRC/NR/rrc_gNB_internode.c
index 3c8d75edfa..346b0ec800 100644
--- a/openair2/RRC/NR/rrc_gNB_internode.c
+++ b/openair2/RRC/NR/rrc_gNB_internode.c
@@ -108,8 +108,8 @@ int generate_CG_Config(gNB_RRC_INST *rrc,
fd = fopen("reconfig.raw","w");
if (fd != NULL) {
fwrite((void *)buffer,1,(size_t)((enc_rval.encoded+7)>>3),fd);
+ fclose(fd);
}
- fclose(fd);
}
enc_rval = uper_encode_to_buffer(&asn_DEF_NR_RadioBearerConfig, NULL, (void *)rbconfig, buffer, 1024);
@@ -134,8 +134,8 @@ int generate_CG_Config(gNB_RRC_INST *rrc,
fd = fopen("rbconfig.raw","w");
if (fd != NULL) {
fwrite((void *)buffer,1,(size_t)((enc_rval.encoded+7)>>3),fd);
+ fclose(fd);
}
- fclose(fd);
}
total_size = total_size + ((enc_rval.encoded+7)>>3);
diff --git a/targets/ARCH/rfsimulator/README.md b/targets/ARCH/rfsimulator/README.md
index 9ec0ae5065..4a8d5ff79a 100644
--- a/targets/ARCH/rfsimulator/README.md
+++ b/targets/ARCH/rfsimulator/README.md
@@ -59,6 +59,29 @@ The RF simulator is using the configuration module, and its parameters are defin
Setting the env variable RFSIMULATOR can be used instead of using the serveraddr parameter; it is to preserve compatibility with previous version.
+## How to use the RF simulator options
+
+Add the following options to the command line to enable the channel model and the IQ samples saving for future replay:
+```bash
+--rfsimulator.options chanmod,saviq
+```
+or just:
+```bash
+--rfsimulator.options chanmod
+```
+to enable the channel model.
+
+set the model with:
+```bash
+--rfsimulator.modelname AWGN
+```
+
+Example run:
+
+```bash
+sudo RFSIMULATOR=server ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf --parallel-config PARALLEL_SINGLE_THREAD --rfsim --phy-test --rfsimulator.options chanmod --rfsimulator.modelname AWGN
+```
+
## 4G case
For the UE, it should be set to the IP address of the eNB. For example:
@@ -165,5 +188,50 @@ Only the input noise can be changed on command line with the `-s` parameter.
With path loss = 0 set `-s 5` to see a little noise. `-s` is a shortcut to `channelmod.s`. It is expected to enhance the channel modelization flexibility by the addition of more parameters in the channelmod section.
+Example to add a very small noise:
+```bash
+-s 30
+```
+to add a lot of noise:
+```bash
+-s 5
+```
+
+Example run commands:
+```bash
+sudo RFSIMULATOR=server ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf --parallel-config PARALLEL_SINGLE_THREAD --rfsim --phy-test --rfsimulator.options chanmod --rfsimulator.modelname AWGN
+
+```
+# Real time control and monitoring
+
+Add the `--telnetsrv` option to the command line. Then in a new shell, connect to the telnet server, example:
+```bash
+telnet 127.0.0.1 9090
+```
+once connected it is possible to monitor the current status:
+```bash
+channelmod show current
+```
+
+see the available channel models:
+```bash
+channelmod show predef
+```
+
+or modify the channel model, for example setting a new model:
+```bash
+rfsimu setmodel AWGN
+```
+setting the pathloss, etc...:
+```bash
+channelmod modify
+channelmod modify 0 ploss 15
+```
+where:
+```bash
+ can be one of "riceanf", "aoa", "randaoa", "ploss", "offset", "forgetf"
+```
+
# Caveats
Still issues in power control: txgain, rxgain are not used.
+
diff --git a/targets/ARCH/rfsimulator/simulator.c b/targets/ARCH/rfsimulator/simulator.c
index c4760d8aee..20fe6a7828 100644
--- a/targets/ARCH/rfsimulator/simulator.c
+++ b/targets/ARCH/rfsimulator/simulator.c
@@ -555,7 +555,7 @@ static bool flushInput(rfsimulator_state_t *t, int timeout, int nsamps_for_initi
memset(b->circularBuf, 0, sampleToByte(CirSize,1));
}
- if (b->lastReceivedTS != 0 && b->th.timestamp-b->lastReceivedTS > 50 )
+ if (b->lastReceivedTS != 0 && b->th.timestamp-b->lastReceivedTS < 1000)
LOG_W(HW,"UEsock: %d gap of: %ld in reception\n", fd, b->th.timestamp-b->lastReceivedTS );
b->lastReceivedTS=b->th.timestamp;
@@ -628,7 +628,7 @@ int rfsimulator_read(openair0_device *device, openair0_timestamp *ptimestamp, vo
t->nextTimestamp+=nsamps;
if ( ((t->nextTimestamp/nsamps)%100) == 0)
- LOG_W(HW,"No UE, Generated void samples for Rx: %ld\n", t->nextTimestamp);
+ LOG_D(HW,"No UE, Generated void samples for Rx: %ld\n", t->nextTimestamp);
*ptimestamp = t->nextTimestamp-nsamps;
return nsamps;