From 6931fd7d3732596e98004e254be2332a18a33849 Mon Sep 17 00:00:00 2001
From: Florian Kaltenberger <florian.kaltenberger@eurecom.fr>
Date: Thu, 3 Sep 2020 14:33:19 +0200
Subject: [PATCH] moving the OFDM phase rotation from RU to DU

---
 executables/nr-gnb.c                      |  8 ++++++
 executables/nr-ru.c                       |  4 +--
 openair1/PHY/MODULATION/nr_modulation.h   |  6 +++++
 openair1/PHY/MODULATION/slot_fep_nr.c     | 32 ++++++++++++++++-------
 openair1/SCHED_NR/nr_ru_procedures.c      | 32 -----------------------
 openair1/SCHED_NR/phy_procedures_nr_gNB.c | 15 ++++++++++-
 openair1/SIMULATION/NR_PHY/dlsim.c        | 29 +-------------------
 7 files changed, 54 insertions(+), 72 deletions(-)

diff --git a/executables/nr-gnb.c b/executables/nr-gnb.c
index 27b0ed08ddb..bb2bfbb80e8 100644
--- a/executables/nr-gnb.c
+++ b/executables/nr-gnb.c
@@ -208,6 +208,14 @@ static inline int rxtx(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx, int frame_t
       L1_nr_prach_procedures(gNB,frame_rx,slot_rx,&gNB->prach_vars.list[prach_id].pdu);
       gNB->prach_vars.list[prach_id].frame=-1;
     }
+    //apply the rx signal rotation here
+    apply_nr_rotation_ul(&gNB->frame_parms,
+			 gNB->common_vars.rxdataF[0],
+			 slot_rx,
+			 0,
+			 gNB->frame_parms.Ncp==EXTENDED?12:14,
+			 gNB->frame_parms.ofdm_symbol_size);
+    
     phy_procedures_gNB_uespec_RX(gNB, frame_rx, slot_rx);
   }
 
diff --git a/executables/nr-ru.c b/executables/nr-ru.c
index a0f5710128d..a093952dd01 100644
--- a/executables/nr-ru.c
+++ b/executables/nr-ru.c
@@ -861,9 +861,9 @@ void *ru_thread_prach( void *param ) {
 
     if (wait_on_condition(&proc->mutex_prach,&proc->cond_prach,&proc->instance_cnt_prach,"ru_prach_thread") < 0) break;
 
-    VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_RU_PRACH_RX, 1 );
+    /*VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_RU_PRACH_RX, 1 );
 
-    /*if (ru->gNB_list[0]){
+    if (ru->gNB_list[0]){
       prach_procedures(
         ru->gNB_list[0],0
         );
diff --git a/openair1/PHY/MODULATION/nr_modulation.h b/openair1/PHY/MODULATION/nr_modulation.h
index 31d87547685..3d2be905ac4 100644
--- a/openair1/PHY/MODULATION/nr_modulation.h
+++ b/openair1/PHY/MODULATION/nr_modulation.h
@@ -112,4 +112,10 @@ void apply_nr_rotation(NR_DL_FRAME_PARMS *fp,
 
 void init_symbol_rotation(NR_DL_FRAME_PARMS *fp,uint64_t CarrierFreq);
 
+void apply_nr_rotation_ul(NR_DL_FRAME_PARMS *frame_parms,
+			  int32_t *rxdataF,
+			  int slot,
+			  int first_symbol,
+			  int nsymb,
+			  int length);
 #endif
diff --git a/openair1/PHY/MODULATION/slot_fep_nr.c b/openair1/PHY/MODULATION/slot_fep_nr.c
index 2ffdb013a50..c5363246f69 100644
--- a/openair1/PHY/MODULATION/slot_fep_nr.c
+++ b/openair1/PHY/MODULATION/slot_fep_nr.c
@@ -490,14 +490,28 @@ int nr_slot_fep_ul(NR_DL_FRAME_PARMS *frame_parms,
   // clear DC carrier from OFDM symbols
   rxdataF[symbol * frame_parms->ofdm_symbol_size] = 0;
 
-  int symb_offset = (Ns%frame_parms->slots_per_subframe)*frame_parms->symbols_per_slot;
-  uint32_t rot2 = ((uint32_t*)frame_parms->symbol_rotation)[symbol+symb_offset];
-  ((int16_t*)&rot2)[1]=-((int16_t*)&rot2)[1];
-  LOG_D(PHY,"slot %d, symb_offset %d rotating by %d.%d\n",Ns,symb_offset,((int16_t*)&rot2)[0],((int16_t*)&rot2)[1]);
-  rotate_cpx_vector((int16_t *)&rxdataF[frame_parms->ofdm_symbol_size*symbol],
-		    (int16_t*)&rot2,
-		    (int16_t *)&rxdataF[frame_parms->ofdm_symbol_size*symbol],
-		    frame_parms->ofdm_symbol_size,
-		    15);
   return(0);
 }
+
+void apply_nr_rotation_ul(NR_DL_FRAME_PARMS *frame_parms,
+			  int32_t *rxdataF,
+			  int slot,
+			  int first_symbol,
+			  int nsymb,
+			  int length) {
+
+			  
+  int symb_offset = (slot%frame_parms->slots_per_subframe)*frame_parms->symbols_per_slot;
+
+  for (int symbol=0;symbol<nsymb;symbol++) {
+    
+    uint32_t rot2 = ((uint32_t*)frame_parms->symbol_rotation)[symbol+symb_offset];
+    ((int16_t*)&rot2)[1]=-((int16_t*)&rot2)[1];
+    LOG_D(PHY,"slot %d, symb_offset %d rotating by %d.%d\n",slot,symb_offset,((int16_t*)&rot2)[0],((int16_t*)&rot2)[1]);
+    rotate_cpx_vector((int16_t *)&rxdataF[frame_parms->ofdm_symbol_size*symbol],
+		      (int16_t*)&rot2,
+		      (int16_t *)&rxdataF[frame_parms->ofdm_symbol_size*symbol],
+		      length,
+		      15);
+  }
+}
diff --git a/openair1/SCHED_NR/nr_ru_procedures.c b/openair1/SCHED_NR/nr_ru_procedures.c
index 9723b2f99e1..a78b1f48056 100644
--- a/openair1/SCHED_NR/nr_ru_procedures.c
+++ b/openair1/SCHED_NR/nr_ru_procedures.c
@@ -89,13 +89,6 @@ void nr_feptx0(RU_t *ru,int tti_tx,int first_symbol, int num_symbols, int aa) {
     if (fp->numerology_index != 0) {
       
       if (!(slot%(fp->slots_per_subframe/2))&&(first_symbol==0)) { // case where first symbol in slot has longer prefix
-	apply_nr_rotation(fp,
-			  (int16_t*)&ru->common.txdataF_BF[aa][slot_offsetF],
-			  slot,
-			  0,
-			  1,
-			  fp->ofdm_symbol_size);
-
         PHY_ofdm_mod(&ru->common.txdataF_BF[aa][slot_offsetF],
                      (int*)&ru->common.txdata[aa][slot_offset],
                      fp->ofdm_symbol_size,
@@ -103,13 +96,6 @@ void nr_feptx0(RU_t *ru,int tti_tx,int first_symbol, int num_symbols, int aa) {
                      fp->nb_prefix_samples0,
                      CYCLIC_PREFIX);
 
-	apply_nr_rotation(fp,
-			  (int16_t*)&ru->common.txdataF_BF[aa][slot_offsetF+fp->ofdm_symbol_size],
-			  slot,
-			  1,
-			  num_symbols-1,
-			  fp->ofdm_symbol_size);
-
         PHY_ofdm_mod(&ru->common.txdataF_BF[aa][slot_offsetF+fp->ofdm_symbol_size],
                      (int*)&ru->common.txdata[aa][slot_offset+fp->nb_prefix_samples0+fp->ofdm_symbol_size],
                      fp->ofdm_symbol_size,
@@ -118,12 +104,6 @@ void nr_feptx0(RU_t *ru,int tti_tx,int first_symbol, int num_symbols, int aa) {
                      CYCLIC_PREFIX);
       }
       else { // all symbols in slot have shorter prefix
-	apply_nr_rotation(fp,
-			  (int16_t*)&ru->common.txdataF_BF[aa][slot_offsetF],
-			  slot,
-			  first_symbol,
-			  num_symbols,
-			  fp->ofdm_symbol_size);
         PHY_ofdm_mod(&ru->common.txdataF_BF[aa][slot_offsetF],
                      (int*)&ru->common.txdata[aa][slot_offset],
                      fp->ofdm_symbol_size,
@@ -141,12 +121,6 @@ void nr_feptx0(RU_t *ru,int tti_tx,int first_symbol, int num_symbols, int aa) {
                        1,
                        fp->nb_prefix_samples,
                        CYCLIC_PREFIX);
-	  apply_nr_rotation(fp,
-			    (int16_t*)&ru->common.txdata[aa][slot_offset],
-			    slot,
-			    idx_sym,
-			    1,
-			    fp->ofdm_symbol_size+fp->nb_prefix_samples);
           slot_offset += fp->nb_prefix_samples+fp->ofdm_symbol_size;
         }
         else {
@@ -156,12 +130,6 @@ void nr_feptx0(RU_t *ru,int tti_tx,int first_symbol, int num_symbols, int aa) {
                        1,
                        fp->nb_prefix_samples0,
                        CYCLIC_PREFIX);
-	  apply_nr_rotation(fp,
-			    (int16_t*)&ru->common.txdata[aa][slot_offset],
-			    slot,
-			    0,
-			    1,
-			    fp->ofdm_symbol_size+fp->nb_prefix_samples0);
           slot_offset += fp->nb_prefix_samples0+fp->ofdm_symbol_size;
         }
       }
diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c
index 6dfe967edc0..269b9f7b1e8 100644
--- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c
+++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c
@@ -199,6 +199,10 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB,
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_GENERATE_DLSCH,0);
   }
 
+
+  //apply the OFDM symbol rotation here
+  apply_nr_rotation(fp,(int16_t*) &gNB->common_vars.txdataF[0][txdataF_offset],slot,0,fp->Ncp==EXTENDED?12:14,fp->ofdm_symbol_size);
+  
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_gNB_TX+offset,0);
 }
 
@@ -446,7 +450,7 @@ void phy_procedures_gNB_common_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx)
   uint8_t symbol;
   unsigned char aa;
 
-  for(symbol = 0; symbol < NR_SYMBOLS_PER_SLOT; symbol++) {
+  for(symbol = 0; symbol < (gNB->frame_parms.Ncp==EXTENDED?12:14); symbol++) {
     // nr_slot_fep_ul(gNB, symbol, proc->slot_rx, 0, 0);
 
     for (aa = 0; aa < gNB->frame_parms.nb_antennas_rx; aa++) {
@@ -460,6 +464,15 @@ void phy_procedures_gNB_common_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx)
     }
   }
 
+  for (aa = 0; aa < gNB->frame_parms.nb_antennas_rx; aa++) {
+    apply_nr_rotation_ul(&gNB->frame_parms,
+			 gNB->common_vars.rxdataF[aa],
+			 slot_rx,
+			 0,
+			 gNB->frame_parms.Ncp==EXTENDED?12:14,
+			 gNB->frame_parms.ofdm_symbol_size);
+  }
+
 }
 
 void phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) {
diff --git a/openair1/SIMULATION/NR_PHY/dlsim.c b/openair1/SIMULATION/NR_PHY/dlsim.c
index 38400cab51a..584e9ac328f 100644
--- a/openair1/SIMULATION/NR_PHY/dlsim.c
+++ b/openair1/SIMULATION/NR_PHY/dlsim.c
@@ -803,38 +803,11 @@ int main(int argc, char **argv)
                          12,
                          frame_parms->nb_prefix_samples,
                          CYCLIC_PREFIX);
-          } else {/*
+          } else {
             nr_normal_prefix_mod(&gNB->common_vars.txdataF[aa][txdataF_offset],
                                  &txdata[aa][tx_offset],
                                  14,
                                  frame_parms);
-		  */
-	    PHY_ofdm_mod(&gNB->common_vars.txdataF[aa][txdataF_offset],
-			 (int*)&txdata[aa][tx_offset],
-			 frame_parms->ofdm_symbol_size,
-			 1,
-			 frame_parms->nb_prefix_samples0,
-			 CYCLIC_PREFIX);
-	    	    
-	    apply_nr_rotation(frame_parms,
-			      (int16_t*)&txdata[aa][tx_offset],
-			      slot,
-			      0,
-			      1,
-			      frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples0);
-	    PHY_ofdm_mod(&gNB->common_vars.txdataF[aa][txdataF_offset+frame_parms->ofdm_symbol_size],
-			 (int*)&txdata[aa][tx_offset+frame_parms->nb_prefix_samples0+frame_parms->ofdm_symbol_size],
-			 frame_parms->ofdm_symbol_size,
-			 13,
-			 frame_parms->nb_prefix_samples,
-			 CYCLIC_PREFIX);
-	    apply_nr_rotation(frame_parms,
-			      (int16_t*)&txdata[aa][tx_offset+frame_parms->nb_prefix_samples0+frame_parms->ofdm_symbol_size],
-			      slot,
-			      1,
-			      13,
-			      frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples);
-	    
           }
         }
        
-- 
GitLab