From d2bf4ddcd48848c6d0141404e948039f2c909dce Mon Sep 17 00:00:00 2001
From: Raymond Knopp <raymond.knopp@eurecom.fr>
Date: Thu, 21 Aug 2014 11:51:01 +0000
Subject: [PATCH] git-svn-id: http://svn.eurecom.fr/openair4G/trunk@5739
 818b1a75-f10b-46b9-bf7c-635c3b92a50f

---
 openair1/PHY/INIT/lte_init.c                  |   5 +-
 openair1/PHY/LTE_ESTIMATION/adjust_gain.c     |   7 +-
 .../PHY/LTE_ESTIMATION/lte_ue_measurements.c  | 100 +++++-------------
 openair1/PHY/LTE_TRANSPORT/dci.c              |   8 +-
 openair1/PHY/LTE_TRANSPORT/dci_tools.c        |   7 +-
 openair1/PHY/LTE_TRANSPORT/initial_sync.c     |   2 +
 openair1/PHY/LTE_TRANSPORT/pbch.c             |   2 +-
 openair1/PHY/LTE_TRANSPORT/pcfich.c           |  77 +-------------
 openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c   |   9 +-
 .../PHY/LTE_TRANSPORT/ulsch_demodulation.c    |   4 +-
 openair1/PHY/MODULATION/defs.h                |   2 +
 openair1/PHY/MODULATION/ofdm_mod.c            |  62 ++++++++++-
 openair1/PHY/MODULATION/slot_fep.c            |  45 --------
 openair1/PHY/defs.h                           |   1 +
 openair1/PHY/impl_defs_top.h                  |   2 +-
 openair1/SCHED/defs.h                         |   2 +-
 openair1/SCHED/phy_procedures_lte_eNb.c       |  32 ++++--
 openair1/SCHED/phy_procedures_lte_ue.c        |  25 +++--
 openair1/SIMULATION/RF/dac.c                  |  10 +-
 openair1/SIMULATION/RF/defs.h                 |   3 +-
 openair1/SIMULATION/RF/rf.c                   |   2 +-
 21 files changed, 168 insertions(+), 239 deletions(-)

diff --git a/openair1/PHY/INIT/lte_init.c b/openair1/PHY/INIT/lte_init.c
index fa5949cc52..f74f0b8562 100644
--- a/openair1/PHY/INIT/lte_init.c
+++ b/openair1/PHY/INIT/lte_init.c
@@ -837,11 +837,8 @@ void phy_init_lte_top(LTE_DL_FRAME_PARMS *lte_frame_parms) {
   init_td8();
   init_td16();
 
-#ifdef USER_MODE
+
   lte_sync_time_init(lte_frame_parms);
-#else
-  // lte_sync_time_init(lte_frame_parms) has to be called from the real-time thread, since it uses SSE instructions.
-#endif
 
   generate_ul_ref_sigs();
   generate_ul_ref_sigs_rx();
diff --git a/openair1/PHY/LTE_ESTIMATION/adjust_gain.c b/openair1/PHY/LTE_ESTIMATION/adjust_gain.c
index 089c4bb801..c71de7ef06 100644
--- a/openair1/PHY/LTE_ESTIMATION/adjust_gain.c
+++ b/openair1/PHY/LTE_ESTIMATION/adjust_gain.c
@@ -45,9 +45,11 @@ phy_adjust_gain (PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id) {
   exmimo_config_t *p_exmimo_config = openair0_exmimo_pci[card].exmimo_config_ptr;
   uint16_t i;
 #endif
+  int rssi;
 
-  //rx_power_fil_dB = dB_fixed(phy_vars_ue->PHY_measurements.rssi);
-  rx_power_fil_dB = phy_vars_ue->PHY_measurements.rx_power_avg_dB[eNB_id];
+  rssi = dB_fixed(phy_vars_ue->PHY_measurements.rssi);
+  if (rssi>0) rx_power_fil_dB = dB_fixed(phy_vars_ue->PHY_measurements.rssi);
+  else rx_power_fil_dB = phy_vars_ue->PHY_measurements.rx_power_avg_dB[eNB_id];
 
   // Gain control with hysterisis
   // Adjust gain in phy_vars_ue->rx_vars[0].rx_total_gain_dB
@@ -78,6 +80,7 @@ phy_adjust_gain (PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id) {
     phy_vars_ue->rx_total_gain_dB = MIN_RF_GAIN;
   }
 
+  printf("Gain control: rx_total_gain_dB = %d (max %d,rxpf %d)\n",phy_vars_ue->rx_total_gain_dB,MAX_RF_GAIN,rx_power_fil_dB);
 
 #ifdef EXMIMO
 
diff --git a/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c b/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c
index b5351ef86d..e1c42872fe 100644
--- a/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c
+++ b/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c
@@ -49,7 +49,7 @@ __m128i zeroPMI;
 #define k1 ((long long int) 1000)
 #define k2 ((long long int) (1024-k1))
 
-//#define DEBUG_MEAS
+#define DEBUG_MEAS
 
 #ifdef USER_MODE
 void print_shorts(char *s,__m128i *x) {
@@ -84,17 +84,21 @@ int16_t get_PL(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index) {
   PHY_VARS_UE *phy_vars_ue = PHY_vars_UE_g[Mod_id][CC_id];
   int RSoffset;
     
-  LOG_D(PHY,"get_PL : Frame %d : rssi %d, eNB power %d\n", phy_vars_ue->frame,
-	dB_fixed(phy_vars_ue->PHY_measurements.rssi)-phy_vars_ue->rx_total_gain_dB,
-    phy_vars_ue->lte_frame_parms.pdsch_config_common.referenceSignalPower);
   
   if (phy_vars_ue->lte_frame_parms.mode1_flag == 1)
     RSoffset = 6;
   else
     RSoffset = 3;
+  
 
-  return((int16_t)(phy_vars_ue->rx_total_gain_dB-dB_fixed(phy_vars_ue->PHY_measurements.rssi/RSoffset) + 
-  	       phy_vars_ue->lte_frame_parms.pdsch_config_common.referenceSignalPower));
+  LOG_D(PHY,"get_PL : Frame %d : rssi %f dBm, eNB power %d dBm/RE\n", phy_vars_ue->frame,
+	(1.0*dB_fixed_times10(phy_vars_ue->PHY_measurements.rssi/RSoffset)-(10.0*phy_vars_ue->rx_total_gain_dB))/10.0,
+	phy_vars_ue->lte_frame_parms.pdsch_config_common.referenceSignalPower);
+  	
+  return((int16_t)(((10*phy_vars_ue->rx_total_gain_dB) - 
+		    dB_fixed_times10(phy_vars_ue->PHY_measurements.rssi)+
+		    dB_fixed_times10(RSoffset*12*PHY_vars_UE_g[Mod_id][CC_id]->lte_frame_parms.N_RB_DL) + 
+		    (phy_vars_ue->lte_frame_parms.pdsch_config_common.referenceSignalPower*10))/10));
 }
 
 
@@ -170,24 +174,7 @@ void ue_rrc_measurements(PHY_VARS_UE *phy_vars_ue,
   uint16_t Nid_cell = phy_vars_ue->lte_frame_parms.Nid_cell;
   uint8_t eNB_offset,nu,l,nushift,k;
   uint16_t off;
-  int16_t rx_power_correction;
-
 
-  // if the fft size an odd power of 2, the output of the fft is shifted one too much, so we need to compensate for that
-  if  (abstraction_flag==0) {
-    rx_power_correction = 1;
-  }
-  else {
-#ifndef NEW_FFT
-    if ((phy_vars_ue->lte_frame_parms.ofdm_symbol_size == 128) ||
-	(phy_vars_ue->lte_frame_parms.ofdm_symbol_size == 512)) 
-      rx_power_correction = 2;
-    else
-      rx_power_correction = 1;
-#else
-    rx_power_correction=1;
-#endif
-  }
 
   for (eNB_offset = 0;eNB_offset<1+phy_vars_ue->PHY_measurements.n_adj_cells;eNB_offset++) {
 
@@ -220,39 +207,22 @@ void ue_rrc_measurements(PHY_VARS_UE *phy_vars_ue,
 	LOG_D(PHY,"[UE %d] Frame %d slot %d Doing ue_rrc_measurements rsrp/rssi (Nid_cell %d, nushift %d, eNB_offset %d, k %d)\n",phy_vars_ue->Mod_id,phy_vars_ue->frame,slot,Nid_cell,nushift,eNB_offset,k);
 #endif
 	for (aarx=0;aarx<phy_vars_ue->lte_frame_parms.nb_antennas_rx;aarx++) {
-#ifndef NEW_FFT
-	  rxF = (int16_t *)&phy_vars_ue->lte_ue_common_vars.rxdataF[aarx][(l*phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1];
-	  off  = (phy_vars_ue->lte_frame_parms.first_carrier_offset+k)<<2;
-#else
 	  rxF = (int16_t *)&phy_vars_ue->lte_ue_common_vars.rxdataF[aarx][(l*phy_vars_ue->lte_frame_parms.ofdm_symbol_size)];
 	  off  = (phy_vars_ue->lte_frame_parms.first_carrier_offset+k)<<1;
-#endif
 
-      if (l==(4-phy_vars_ue->lte_frame_parms.Ncp)) {
+	  if (l==(4-phy_vars_ue->lte_frame_parms.Ncp)) {
 	    for (rb=0;rb<phy_vars_ue->lte_frame_parms.N_RB_DL;rb++) {
 		
 		//	  printf("rb %d, off %d, off2 %d\n",rb,off,off2);
 		
 		phy_vars_ue->PHY_measurements.rsrp[eNB_offset] += ((rxF[off]*rxF[off])+(rxF[off+1]*rxF[off+1]));
-#ifndef NEW_FFT
-		off+=24;
-		if (off>=(phy_vars_ue->lte_frame_parms.ofdm_symbol_size<<2))
-		  off = (1+k)<<2;
-#else
 		off+=12;
 		if (off>=(phy_vars_ue->lte_frame_parms.ofdm_symbol_size<<1))
 		  off = (1+k)<<1;
-#endif
 		phy_vars_ue->PHY_measurements.rsrp[eNB_offset] += ((rxF[off]*rxF[off])+(rxF[off+1]*rxF[off+1]));
-#ifndef NEW_FFT
-		off+=24;
-		if (off>=(phy_vars_ue->lte_frame_parms.ofdm_symbol_size<<2))
-		  off = (1+k)<<2;
-#else
 		off+=12;
 		if (off>=(phy_vars_ue->lte_frame_parms.ofdm_symbol_size<<1))
 		  off = (1+k)<<1;
-#endif
 	      }
 	  
 	      /*
@@ -273,9 +243,9 @@ void ue_rrc_measurements(PHY_VARS_UE *phy_vars_ue,
 
       // 2 RE per PRB
       phy_vars_ue->PHY_measurements.rsrp[eNB_offset]/=(24*phy_vars_ue->lte_frame_parms.N_RB_DL);
-      phy_vars_ue->PHY_measurements.rsrp[eNB_offset]*=rx_power_correction;
+     
 
-      //      phy_vars_ue->PHY_measurements.rsrp[eNB_offset] = phy_vars_ue->PHY_measurements.rx_spatial_power[eNB_offset][0][0]/(2*phy_vars_ue->lte_frame_parms.N_RB_DL);
+ 
       if (eNB_offset == 0) {
 	//	phy_vars_ue->PHY_measurements.rssi/=(24*phy_vars_ue->lte_frame_parms.N_RB_DL);
 	//	phy_vars_ue->PHY_measurements.rssi*=rx_power_correction;
@@ -295,12 +265,13 @@ void ue_rrc_measurements(PHY_VARS_UE *phy_vars_ue,
       phy_vars_ue->PHY_measurements.rsrq[eNB_offset] = 3;
 
     }
-    if (((phy_vars_ue->frame %10) == 0) && (slot == 1)) {
+    if (((phy_vars_ue->frame %10) == 0) && (slot == 0)) {
 #ifdef DEBUG_MEAS
     if (eNB_offset == 0)
-	LOG_D(PHY,"[UE %d] Frame %d, slot %d RRC Measurements => rssi %3.1f dBm (digital: %3.1f dB)\n",phy_vars_ue->Mod_id,
+	LOG_D(PHY,"[UE %d] Frame %d, slot %d RRC Measurements => rssi %3.1f dBm (digital: %3.1f dB, gain %d)\n",phy_vars_ue->Mod_id,
 	      phy_vars_ue->frame,slot,10*log10(phy_vars_ue->PHY_measurements.rssi)-phy_vars_ue->rx_total_gain_dB,
-	      10*log10(phy_vars_ue->PHY_measurements.rssi));
+	      10*log10(phy_vars_ue->PHY_measurements.rssi),
+	      phy_vars_ue->rx_total_gain_dB);
 	LOG_D(PHY,"[UE %d] Frame %d, slot %d RRC Measurements (idx %d, Cell id %d) => rsrp: %3.1f (%3.1f) dBm, rsrq: %3.1f dB\n",
 	      phy_vars_ue->Mod_id,
 	      phy_vars_ue->frame,slot,eNB_offset,
@@ -324,7 +295,7 @@ void lte_ue_measurements(PHY_VARS_UE *phy_vars_ue,
 			   unsigned char abstraction_flag){
 
 
-    int aarx,aatx,eNB_id=0,rx_power_correction=1,gain_offset=0;
+    int aarx,aatx,eNB_id=0,gain_offset=0;
     //int rx_power[NUMBER_OF_CONNECTED_eNB_MAX];
     int i;
     unsigned int limit,subband;
@@ -334,12 +305,7 @@ void lte_ue_measurements(PHY_VARS_UE *phy_vars_ue,
 
     phy_vars_ue->PHY_measurements.nb_antennas_rx = frame_parms->nb_antennas_rx;
 
-#ifdef CBMIMO1
-  if (openair_daq_vars.rx_rf_mode == 0)
-    gain_offset = 25;
-  else
     gain_offset = 0;
-#endif
 
 #ifndef __SSE3__
     zeroPMI = _mm_xor_si128(zeroPMI,zeroPMI);
@@ -361,21 +327,6 @@ void lte_ue_measurements(PHY_VARS_UE *phy_vars_ue,
       phy_vars_ue->PHY_measurements.n0_power_avg_dB = 0;
     }
 
-    // if the fft size an odd power of 2, the output of the fft is shifted one too much, so we need to compensate for that
-    if (abstraction_flag==0) {
-      rx_power_correction = 1;
-    }
-    else {
-#ifndef NEW_FFT
-      if ((frame_parms->ofdm_symbol_size == 128) || (frame_parms->ofdm_symbol_size == 512)) 
-	rx_power_correction = 2;
-      else
-	rx_power_correction = 1;
-#else
-      rx_power_correction=1;
-#endif 
-    } 
-  
     // noise measurements
     // for abstraction we do noise measurements based on the precalculated phy_vars_ue->N0
     // otherwise if there is a symbol where we can take noise measurements on, we measure there
@@ -417,7 +368,7 @@ void lte_ue_measurements(PHY_VARS_UE *phy_vars_ue,
 	for (aatx=0; aatx<frame_parms->nb_antennas_tx_eNB; aatx++) {
 	  phy_vars_ue->PHY_measurements.rx_spatial_power[eNB_id][aatx][aarx] = 
 	    (signal_energy_nodc(&phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_id][(aatx<<1) + aarx][0],
-				(frame_parms->N_RB_DL*12))*rx_power_correction);
+				(frame_parms->N_RB_DL*12)));
 	    //- phy_vars_ue->PHY_measurements.n0_power[aarx];
 	
 	  if (phy_vars_ue->PHY_measurements.rx_spatial_power[eNB_id][aatx][aarx]<0)
@@ -465,6 +416,11 @@ void lte_ue_measurements(PHY_VARS_UE *phy_vars_ue,
       phy_vars_ue->PHY_measurements.wideband_cqi_tot[eNB_id] = dB_fixed2(phy_vars_ue->PHY_measurements.rx_power_tot[eNB_id],phy_vars_ue->PHY_measurements.n0_power_tot);
       phy_vars_ue->PHY_measurements.wideband_cqi_avg[eNB_id] = dB_fixed2(phy_vars_ue->PHY_measurements.rx_power_avg[eNB_id],phy_vars_ue->PHY_measurements.n0_power_avg);
       phy_vars_ue->PHY_measurements.rx_rssi_dBm[eNB_id] = phy_vars_ue->PHY_measurements.rx_power_avg_dB[eNB_id] - phy_vars_ue->rx_total_gain_dB + gain_offset;
+#ifdef DEBUG_MEAS
+      printf("[PHY][eNB %d] lte_ue_measurements: RSSI %d dBm, RSSI (digital) %d dB\n",
+	     eNB_id,phy_vars_ue->PHY_measurements.rx_rssi_dBm[eNB_id],
+	     phy_vars_ue->PHY_measurements.rx_power_avg_dB[eNB_id]);
+#endif
     }
     phy_vars_ue->PHY_measurements.n0_power_avg_dB = dB_fixed( phy_vars_ue->PHY_measurements.n0_power_avg);
 
@@ -488,7 +444,7 @@ void lte_ue_measurements(PHY_VARS_UE *phy_vars_ue,
 		msg("subband %d (%d) : %d,%d\n",subband,i,((short *)dl_ch0)[2*i],((short *)dl_ch0)[1+(2*i)]);
 	      */
 	      phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband] = 
-		(signal_energy_nodc(dl_ch0,48) + signal_energy_nodc(dl_ch1,48))*rx_power_correction;
+		(signal_energy_nodc(dl_ch0,48) + signal_energy_nodc(dl_ch1,48));
 	      if ( phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband] < 0)
 		phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband]=0;
 	      /*
@@ -503,7 +459,7 @@ void lte_ue_measurements(PHY_VARS_UE *phy_vars_ue,
 	    else {
 	      //	    for (i=0;i<12;i++)
 	      //	      printf("subband %d (%d) : %d,%d\n",subband,i,((short *)dl_ch0)[2*i],((short *)dl_ch0)[1+(2*i)]); 
-	      phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband] = (signal_energy_nodc(dl_ch0,12) + signal_energy_nodc(dl_ch1,12))*rx_power_correction; // - phy_vars_ue->PHY_measurements.n0_power[aarx];
+	      phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband] = (signal_energy_nodc(dl_ch0,12) + signal_energy_nodc(dl_ch1,12)); // - phy_vars_ue->PHY_measurements.n0_power[aarx];
 	      phy_vars_ue->PHY_measurements.subband_cqi_tot[eNB_id][subband] += phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband];
 	      phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB_id][aarx][subband] = dB_fixed2(phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband],
 											      phy_vars_ue->PHY_measurements.n0_power[aarx]);			
@@ -608,7 +564,7 @@ void lte_ue_measurements(PHY_VARS_UE *phy_vars_ue,
 	      //	    for (i=0;i<48;i++)
 	      //	      printf("subband %d (%d) : %d,%d\n",subband,i,((short *)dl_ch0)[2*i],((short *)dl_ch0)[1+(2*i)]);
 	      phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband] = 
-		(signal_energy_nodc(dl_ch0,48) )*rx_power_correction - phy_vars_ue->PHY_measurements.n0_power[aarx];
+		(signal_energy_nodc(dl_ch0,48) ) - phy_vars_ue->PHY_measurements.n0_power[aarx];
 	    
 	      phy_vars_ue->PHY_measurements.subband_cqi_tot[eNB_id][subband] += phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband];
 	      phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB_id][aarx][subband] = dB_fixed2(phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband],
@@ -617,7 +573,7 @@ void lte_ue_measurements(PHY_VARS_UE *phy_vars_ue,
 	    else {
 	      //	    for (i=0;i<12;i++)
 	      //	      printf("subband %d (%d) : %d,%d\n",subband,i,((short *)dl_ch0)[2*i],((short *)dl_ch0)[1+(2*i)]); 
-	      phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband] = (signal_energy_nodc(dl_ch0,12) )*rx_power_correction - phy_vars_ue->PHY_measurements.n0_power[aarx];
+	      phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband] = (signal_energy_nodc(dl_ch0,12) ) - phy_vars_ue->PHY_measurements.n0_power[aarx];
 	      phy_vars_ue->PHY_measurements.subband_cqi_tot[eNB_id][subband] += phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband];
 	      phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB_id][aarx][subband] = dB_fixed2(phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband],
 											      phy_vars_ue->PHY_measurements.n0_power[aarx]);							
diff --git a/openair1/PHY/LTE_TRANSPORT/dci.c b/openair1/PHY/LTE_TRANSPORT/dci.c
index b612bb54a2..3cbf4ac282 100644
--- a/openair1/PHY/LTE_TRANSPORT/dci.c
+++ b/openair1/PHY/LTE_TRANSPORT/dci.c
@@ -1832,13 +1832,13 @@ int32_t rx_pdcch(LTE_UE_COMMON *lte_ue_common_vars,
 			  lte_ue_pdcch_vars[eNB_id]->llr16, //subsequent function require 16 bit llr, but output must be 8 bit (actually clipped to 4, because of the Viterbi decoder)
 			  lte_ue_pdcch_vars[eNB_id]->llr,
 			  s);
-
+      /*
 #ifdef DEBUG_PHY
       if (subframe==5) {
 	write_output("llr8_seq.m","llr8",&lte_ue_pdcch_vars[eNB_id]->llr[s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,4);
 	write_output("llr16_seq.m","llr16",&lte_ue_pdcch_vars[eNB_id]->llr16[s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,4);
       }
-#endif
+      #endif*/
     } 
     else {
 #endif //MU_RECEIVER
@@ -1846,9 +1846,9 @@ int32_t rx_pdcch(LTE_UE_COMMON *lte_ue_common_vars,
 		lte_ue_pdcch_vars[eNB_id]->rxdataF_comp,
 		(char *)lte_ue_pdcch_vars[eNB_id]->llr,
 		s);
-#ifdef DEBUG_PHY
+      /*#ifdef DEBUG_PHY
       write_output("llr8_seq.m","llr8",&lte_ue_pdcch_vars[eNB_id]->llr[s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,4);
-#endif
+      #endif*/
 #ifdef MU_RECEIVER
     }
 #endif //MU_RECEIVER
diff --git a/openair1/PHY/LTE_TRANSPORT/dci_tools.c b/openair1/PHY/LTE_TRANSPORT/dci_tools.c
index a040c64b23..84463c1bbe 100644
--- a/openair1/PHY/LTE_TRANSPORT/dci_tools.c
+++ b/openair1/PHY/LTE_TRANSPORT/dci_tools.c
@@ -4031,12 +4031,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
       harq_pid = subframe2harq_pid(frame_parms,
 				   pdcch_alloc2ul_frame(frame_parms,phy_vars_ue->frame,subframe),
 				   pdcch_alloc2ul_subframe(frame_parms,subframe));
-    /*
-        msg("Scheduling UE transmission for frame %d, subframe %d harq_pid = %d\n",
-	  pdcch_alloc2ul_frame(frame_parms,phy_vars_ue->frame,subframe),
-	  pdcch_alloc2ul_subframe(frame_parms,subframe),harq_pid);
-    */
-
+    
     if (harq_pid == 255) {
       LOG_E(PHY, "frame %d, subframe %d, rnti %x, format %d: illegal harq_pid!\n",
 	    phy_vars_ue->frame, subframe, rnti, dci_format);
diff --git a/openair1/PHY/LTE_TRANSPORT/initial_sync.c b/openair1/PHY/LTE_TRANSPORT/initial_sync.c
index b82b5e3a6e..b1fbe64837 100644
--- a/openair1/PHY/LTE_TRANSPORT/initial_sync.c
+++ b/openair1/PHY/LTE_TRANSPORT/initial_sync.c
@@ -276,6 +276,8 @@ int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode) {
       (mode != rx_calib_ue) && (mode != rx_calib_ue_med) && (mode != rx_calib_ue_byp) )
     //phy_adjust_gain(phy_vars_ue,0);
     gain_control_all(phy_vars_ue->PHY_measurements.rx_power_avg_dB[0],0);
+#else
+  phy_adjust_gain(phy_vars_ue,0);
 #endif
 
   // SSS detection
diff --git a/openair1/PHY/LTE_TRANSPORT/pbch.c b/openair1/PHY/LTE_TRANSPORT/pbch.c
index 83000c46c5..d30ac6775c 100755
--- a/openair1/PHY/LTE_TRANSPORT/pbch.c
+++ b/openair1/PHY/LTE_TRANSPORT/pbch.c
@@ -762,7 +762,7 @@ uint16_t rx_pbch(LTE_UE_COMMON *lte_ue_common_vars,
   pbch_E  = (frame_parms->Ncp==0) ? 1920 : 1728; //RE/RB * #RB * bits/RB (QPSK)
   pbch_e_rx = &lte_ue_pbch_vars->llr[frame_mod4*(pbch_E>>2)];
 #ifdef DEBUG_PBCH
-  msg("[PBCH] starting symbol loop\n");
+  msg("[PBCH] starting symbol loop (Ncp %d, frame_mod4 %d,mimo_mode %d\n",frame_parms->Ncp,frame_mod4,mimo_mode);
 #endif
 
   // clear LLR buffer
diff --git a/openair1/PHY/LTE_TRANSPORT/pcfich.c b/openair1/PHY/LTE_TRANSPORT/pcfich.c
index 081a7eb2da..930aa1df75 100644
--- a/openair1/PHY/LTE_TRANSPORT/pcfich.c
+++ b/openair1/PHY/LTE_TRANSPORT/pcfich.c
@@ -142,10 +142,6 @@ void generate_pcfich(uint8_t num_pdcch_symbols,
   uint8_t i;
   uint32_t symbol_offset,m,re_offset,reg_offset;
   int16_t gain_lin_QPSK;
-#ifdef IFFT_FPGA
-  uint8_t qpsk_table_offset = 0; 
-  uint8_t qpsk_table_offset2 = 0;
-#endif
   uint16_t *pcfich_reg = frame_parms->pcfich_reg;
 
   int nushiftmod3 = frame_parms->nushift%3;
@@ -164,28 +160,15 @@ void generate_pcfich(uint8_t num_pdcch_symbols,
     gain_lin_QPSK = amp/2;  
 
   if (frame_parms->mode1_flag) { // SISO
-#ifndef IFFT_FPGA
+
     for (i=0;i<16;i++) {
       ((int16_t*)(&(pcfich_d[0][i])))[0]   = ((pcfich_bt[2*i] == 1) ? -gain_lin_QPSK : gain_lin_QPSK);
       ((int16_t*)(&(pcfich_d[1][i])))[0]   = ((pcfich_bt[2*i] == 1) ? -gain_lin_QPSK : gain_lin_QPSK);
       ((int16_t*)(&(pcfich_d[0][i])))[1]   = ((pcfich_bt[2*i+1] == 1) ? -gain_lin_QPSK : gain_lin_QPSK);
       ((int16_t*)(&(pcfich_d[1][i])))[1]   = ((pcfich_bt[2*i+1] == 1) ? -gain_lin_QPSK : gain_lin_QPSK);
     }
-#else
-    for (i=0;i<16;i++) {
-      qpsk_table_offset = MOD_TABLE_QPSK_OFFSET;
-      if (pcfich_bt[2*i] == 1)
-	qpsk_table_offset+=2;
-      if (pcfich_bt[2*i+1] == 1) 
-	qpsk_table_offset+=1;
-      
-      pcfich_d[0][i] = (mod_sym_t) qpsk_table_offset;
-      pcfich_d[1][i] = (mod_sym_t) qpsk_table_offset;
-    }
-#endif
   }
   else { // ALAMOUTI
-#ifndef IFFT_FPGA
     for (i=0;i<16;i+=2) {
       // first antenna position n -> x0
       ((int16_t*)(&(pcfich_d[0][i])))[0]   = ((pcfich_bt[2*i] == 1) ? -gain_lin_QPSK : gain_lin_QPSK);
@@ -201,83 +184,25 @@ void generate_pcfich(uint8_t num_pdcch_symbols,
     
       
     }  
-#else
-    for (i=0;i<16;i+=2) {
-      qpsk_table_offset =  MOD_TABLE_QPSK_OFFSET;  //x0
-      qpsk_table_offset2 =  MOD_TABLE_QPSK_OFFSET; //x0*
-      
-      // flipping bit for imag part of symbol means taking x0*
-      if (pcfich_bt[2*i] == 1) { //real
-	qpsk_table_offset+=2;
-	qpsk_table_offset2+=2;
-      }
-      if (pcfich_bt[2*i+1] == 1) //imag
-	qpsk_table_offset+=1;
-      else
-	qpsk_table_offset2+=1;
-	
-      pcfich_d[0][i]   = (mod_sym_t) qpsk_table_offset;      // x0
-      pcfich_d[1][i+1] = (mod_sym_t) qpsk_table_offset2;   // x0*
-	
-	
-      qpsk_table_offset = MOD_TABLE_QPSK_OFFSET; //-x1*
-      qpsk_table_offset2 = MOD_TABLE_QPSK_OFFSET;//x1
-	
-      // flipping bit for real part of symbol means taking -x1*
-      if (pcfich_bt[2*i+2] == 1) //real   
-	qpsk_table_offset2+=2;
-      else
-	qpsk_table_offset+=2;
-      if (pcfich_bt[2*i+3] == 1) { //imag
-	qpsk_table_offset+=1;
-	qpsk_table_offset2+=1;
-      }
-	
-      pcfich_d[1][i] = (mod_sym_t) qpsk_table_offset;     // -x1*
-      pcfich_d[0][i+1] = (mod_sym_t) qpsk_table_offset2;  // x1
-    }
-#endif
   }
 
 
   // mapping
   nsymb = (frame_parms->Ncp==0) ? 14:12;
   
-#ifdef IFFT_FPGA      
-  symbol_offset = (uint32_t)frame_parms->N_RB_DL*12*((subframe*nsymb));
-  re_offset = frame_parms->N_RB_DL*12/2;
-  
-#else
   symbol_offset = (uint32_t)frame_parms->ofdm_symbol_size*((subframe*nsymb));
   re_offset = frame_parms->first_carrier_offset;
 
-#endif
-
   // loop over 4 quadruplets and lookup REGs
   m=0;
   for (pcfich_quad=0;pcfich_quad<4;pcfich_quad++) {
     reg_offset = re_offset+((uint16_t)pcfich_reg[pcfich_quad]*6);
-#ifdef IFFT_FPGA
-    if (reg_offset>=(frame_parms->N_RB_DL*12))
-      reg_offset-=(frame_parms->N_RB_DL*12);
-#else
     if (reg_offset>=frame_parms->ofdm_symbol_size)
       reg_offset=1 + reg_offset-frame_parms->ofdm_symbol_size;
-#endif
     //    printf("mapping pcfich reg_offset %d\n",reg_offset);
     for (i=0;i<6;i++) {
       if ((i!=nushiftmod3)&&(i!=(nushiftmod3+3))) {
 	txdataF[0][symbol_offset+reg_offset+i] = pcfich_d[0][m];
-	/*
-#ifndef IFFT_FPGA
-	printf("pcfich: quad %d, i %d, offset %d => m%d (%d,%d)\n",pcfich_quad,i,reg_offset+i,m,
-	       ((int16_t*)&txdataF[0][symbol_offset+reg_offset+i])[0],
-	       ((int16_t*)&txdataF[0][symbol_offset+reg_offset+i])[1]);
-#else
-	printf("pcfich: quad %d, i %d, offset %d => m%d (%d)\n",pcfich_quad,i,reg_offset+i,m,
-	       txdataF[0][symbol_offset+reg_offset+i]);
-#endif
-	*/
 	if (frame_parms->nb_antennas_tx_eNB>1)  
 	  txdataF[1][symbol_offset+reg_offset+i] = pcfich_d[1][m];
 	m++;
diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c
index f31731f575..b951519368 100644
--- a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c
+++ b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c
@@ -1158,6 +1158,7 @@ unsigned int  ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB,
 #endif    
 
     start_meas(&phy_vars_eNB->ulsch_rate_unmatching_stats);
+
     if (lte_rate_matching_turbo_rx(ulsch->harq_processes[harq_pid]->RTC[r],
 				   G,
 				   ulsch->harq_processes[harq_pid]->w[r],
@@ -1188,14 +1189,14 @@ unsigned int  ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB,
 				   &ulsch->harq_processes[harq_pid]->d[r][96], 
 				   ulsch->harq_processes[harq_pid]->w[r]); 
     stop_meas(&phy_vars_eNB->ulsch_deinterleaving_stats);
-        
-    /*#ifdef DEBUG_ULSCH_DECODING    
+    /*        
+#ifdef DEBUG_ULSCH_DECODING    
     msg("decoder input(segment %d) :",r);
     for (i=0;i<(3*8*Kr_bytes)+12;i++)
       msg("%d : %d\n",i,ulsch->harq_processes[harq_pid]->d[r][96+i]);
     msg("\n");
-    #endif*/
-    
+#endif
+    */
   }
 
 #ifdef OMP
diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c b/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c
index 970fc4bcde..17788ca1b6 100644
--- a/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c
+++ b/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c
@@ -1565,7 +1565,7 @@ void dump_ulsch(PHY_VARS_eNB *PHY_vars_eNB,uint8_t sched_subframe, uint8_t UE_id
   harq_pid = subframe2harq_pid(&PHY_vars_eNB->lte_frame_parms,PHY_vars_eNB->proc[sched_subframe].frame_rx,subframe);
 
   printf("Dumping ULSCH in subframe %d with harq_pid %d, for NB_rb %d, mcs %d, Qm %d, N_symb %d\n", subframe,harq_pid,PHY_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->nb_rb,PHY_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->mcs,get_Qm_ul(PHY_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->mcs),PHY_vars_eNB->ulsch_eNB[UE_id]->Nsymb_pusch);
-#ifndef OAI_EMU 
+  //#ifndef OAI_EMU 
   write_output("/tmp/ulsch_d.m","ulsch_dseq",&PHY_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->d[0][96], 
 	       PHY_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->Kplus*3,1,0);
   write_output("/tmp/rxsig0.m","rxs0", &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][0][0],PHY_vars_eNB->lte_frame_parms.samples_per_tti*10,1,1);
@@ -1590,6 +1590,6 @@ void dump_ulsch(PHY_VARS_eNB *PHY_vars_eNB,uint8_t sched_subframe, uint8_t UE_id
   write_output("/tmp/ulsch_rxF_llr.m","ulsch_llr",PHY_vars_eNB->lte_eNB_pusch_vars[UE_id]->llr,PHY_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->nb_rb*12*get_Qm_ul(PHY_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->mcs)*PHY_vars_eNB->ulsch_eNB[UE_id]->Nsymb_pusch,1,0);	
   write_output("/tmp/ulsch_ch_mag.m","ulsch_ch_mag",&PHY_vars_eNB->lte_eNB_pusch_vars[UE_id]->ul_ch_mag[0][0][0],PHY_vars_eNB->lte_frame_parms.N_RB_UL*12*nsymb,1,1);	  
   //  write_output("ulsch_ch_mag1.m","ulsch_ch_mag1",&PHY_vars_eNB->lte_eNB_pusch_vars[UE_id]->ul_ch_mag[0][1][0],PHY_vars_eNB->lte_frame_parms.N_RB_UL*12*nsymb,1,1);	  
-#endif	 
+  //#endif	 
 }
 
diff --git a/openair1/PHY/MODULATION/defs.h b/openair1/PHY/MODULATION/defs.h
index 8c4d5a23d5..3f5d395c5d 100644
--- a/openair1/PHY/MODULATION/defs.h
+++ b/openair1/PHY/MODULATION/defs.h
@@ -89,6 +89,8 @@ int slot_fep_ul(LTE_DL_FRAME_PARMS *frame_parms,
 
 void normal_prefix_mod(int32_t *txdataF,int32_t *txdata,uint8_t nsymb,LTE_DL_FRAME_PARMS *frame_parms);
 
+void do_OFDM_mod(mod_sym_t **txdataF, int32_t **txdata, uint32_t frame,uint16_t next_slot, LTE_DL_FRAME_PARMS *frame_parms);
+
 void remove_7_5_kHz(PHY_VARS_eNB *phy_vars_eNB,uint8_t subframe);
 
 void apply_7_5_kHz(PHY_VARS_UE *phy_vars_ue,int32_t*txdata,uint8_t subframe);
diff --git a/openair1/PHY/MODULATION/ofdm_mod.c b/openair1/PHY/MODULATION/ofdm_mod.c
index 72fdb56985..0b0416da17 100755
--- a/openair1/PHY/MODULATION/ofdm_mod.c
+++ b/openair1/PHY/MODULATION/ofdm_mod.c
@@ -37,7 +37,7 @@ This section deals with basic functions for OFDM Modulation.
 */
 
 #include "PHY/defs.h"
-
+#include "UTIL/LOG/log.h"
  
 //static short temp2[2048*4] __attribute__((aligned(16)));
 
@@ -244,4 +244,64 @@ void PHY_ofdm_mod(int *input,                       /// pointer to complex input
   */
 }
 
+
+void do_OFDM_mod(mod_sym_t **txdataF, int32_t **txdata, uint32_t frame,uint16_t next_slot, LTE_DL_FRAME_PARMS *frame_parms) {
+
+  int aa, slot_offset, slot_offset_F;
+
+  slot_offset_F = (next_slot)*(frame_parms->ofdm_symbol_size)*((frame_parms->Ncp==1) ? 6 : 7);
+  slot_offset = (next_slot)*(frame_parms->samples_per_tti>>1);
+  
+  for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
+   if (is_pmch_subframe(frame,next_slot>>1,frame_parms)) {
+      if ((next_slot%2)==0) {
+	LOG_D(PHY,"Frame %d, subframe %d: Doing MBSFN modulation (slot_offset %d)\n",frame,next_slot>>1,slot_offset); 
+	PHY_ofdm_mod(&txdataF[aa][slot_offset_F],        // input
+		     &txdata[aa][slot_offset],         // output
+		     frame_parms->log2_symbol_size,                // log2_fft_size
+		     12,                 // number of symbols
+		     frame_parms->ofdm_symbol_size>>2,               // number of prefix samples
+		     frame_parms->twiddle_ifft,  // IFFT twiddle factors
+		     frame_parms->rev,           // bit-reversal permutation
+		     CYCLIC_PREFIX);
+     
+	if (frame_parms->Ncp == EXTENDED)
+	  PHY_ofdm_mod(&txdataF[aa][slot_offset_F],        // input
+		       &txdata[aa][slot_offset],         // output
+		       frame_parms->log2_symbol_size,                // log2_fft_size
+		       2,                 // number of symbols
+		       frame_parms->nb_prefix_samples,               // number of prefix samples
+		       frame_parms->twiddle_ifft,  // IFFT twiddle factors
+		       frame_parms->rev,           // bit-reversal permutation
+		       CYCLIC_PREFIX);
+	else {
+	  LOG_D(PHY,"Frame %d, subframe %d: Doing PDCCH modulation\n",frame,next_slot>>1); 
+	  normal_prefix_mod(&txdataF[aa][slot_offset_F],
+			    &txdata[aa][slot_offset],
+			    2,
+			    frame_parms);
+	}      
+      }
+    }
+    else {
+      if (frame_parms->Ncp == EXTENDED)
+	PHY_ofdm_mod(&txdataF[aa][slot_offset_F],        // input
+		     &txdata[aa][slot_offset],         // output
+		     frame_parms->log2_symbol_size,                // log2_fft_size
+		     6,                 // number of symbols
+		     frame_parms->nb_prefix_samples,               // number of prefix samples
+		     frame_parms->twiddle_ifft,  // IFFT twiddle factors
+		     frame_parms->rev,           // bit-reversal permutation
+		     CYCLIC_PREFIX);
+      else {
+	normal_prefix_mod(&txdataF[aa][slot_offset_F],
+			  &txdata[aa][slot_offset],
+			  7,
+			  frame_parms);
+      }
+    }  
+  }
+  
+}
+
 /** @} */
diff --git a/openair1/PHY/MODULATION/slot_fep.c b/openair1/PHY/MODULATION/slot_fep.c
index e20ff884af..0125aba02e 100644
--- a/openair1/PHY/MODULATION/slot_fep.c
+++ b/openair1/PHY/MODULATION/slot_fep.c
@@ -102,11 +102,7 @@ int slot_fep(PHY_VARS_UE *phy_vars_ue,
   
 
   for (aa=0;aa<frame_parms->nb_antennas_rx;aa++) {
-#ifdef NEW_FFT
     memset(&ue_common_vars->rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],0,frame_parms->ofdm_symbol_size*sizeof(int));
-#else
-    memset(&ue_common_vars->rxdataF[aa][2*frame_parms->ofdm_symbol_size*symbol],0,2*frame_parms->ofdm_symbol_size*sizeof(int));
-#endif
 
     if (l==0) {
       rx_offset = sample_offset + slot_offset + nb_prefix_samples0 + subframe_offset - SOFFSET;
@@ -116,24 +112,10 @@ int slot_fep(PHY_VARS_UE *phy_vars_ue,
 	memcpy((short *)&ue_common_vars->rxdata[aa][frame_length_samples],
 	       (short *)&ue_common_vars->rxdata[aa][0],
 	       frame_parms->ofdm_symbol_size*sizeof(int));
-#ifndef NEW_FFT
-	fft((short *)&ue_common_vars->rxdata[aa][(sample_offset +
-						slot_offset +
-						nb_prefix_samples0 + 
-						subframe_offset -
-						SOFFSET) % frame_length_samples],
-	  (short*)&ue_common_vars->rxdataF[aa][2*frame_parms->ofdm_symbol_size*symbol],
-	  frame_parms->twiddle_fft,
-	  frame_parms->rev,
-	  frame_parms->log2_symbol_size,
-	  frame_parms->log2_symbol_size>>1,
-	  0);
-#else
 	start_meas(&phy_vars_ue->rx_dft_stats);
 	dft((int16_t *)&ue_common_vars->rxdata[aa][(rx_offset) % frame_length_samples],
 	    (int16_t *)&ue_common_vars->rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
 	stop_meas(&phy_vars_ue->rx_dft_stats);
-#endif
       
     }
     else {
@@ -148,38 +130,11 @@ int slot_fep(PHY_VARS_UE *phy_vars_ue,
 	       (short *)&ue_common_vars->rxdata[aa][0],
 	       frame_parms->ofdm_symbol_size*sizeof(int));
  
-#ifndef NEW_FFT
-      fft((short *)&ue_common_vars->rxdata[aa][(sample_offset +
-						slot_offset +
-						(frame_parms->ofdm_symbol_size+nb_prefix_samples0+nb_prefix_samples) + 
-						(frame_parms->ofdm_symbol_size+nb_prefix_samples)*(l-1) +
-						subframe_offset-
-						SOFFSET) % frame_length_samples],
-	  (short*)&ue_common_vars->rxdataF[aa][2*frame_parms->ofdm_symbol_size*symbol],
-	  frame_parms->twiddle_fft,
-	  frame_parms->rev,
-	  frame_parms->log2_symbol_size,
-	  frame_parms->log2_symbol_size>>1,
-	  0);
-#else
 	start_meas(&phy_vars_ue->rx_dft_stats);
 	dft((int16_t *)&ue_common_vars->rxdata[aa][(rx_offset) % frame_length_samples],
 	    (int16_t *)&ue_common_vars->rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
 	stop_meas(&phy_vars_ue->rx_dft_stats);
-#endif
     }
-    /*
-#ifndef NEW_FFT
-    memcpy(&ue_common_vars->rxdataF2[aa][2*subframe_offset_F+2*frame_parms->ofdm_symbol_size*symbol],
-	   &ue_common_vars->rxdataF[aa][2*frame_parms->ofdm_symbol_size*symbol],
-	   2*frame_parms->ofdm_symbol_size*sizeof(int));
-    
-#else
-    memcpy(&ue_common_vars->rxdataF2[aa][subframe_offset_F+frame_parms->ofdm_symbol_size*symbol],
-	   &ue_common_vars->rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],
-	   frame_parms->ofdm_symbol_size*sizeof(int));
-#endif
-    */
   }
 #ifndef PERFECT_CE    
   if ((l==0) || (l==(4-frame_parms->Ncp))) {
diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h
index b2c8b73a59..f07757e65f 100755
--- a/openair1/PHY/defs.h
+++ b/openair1/PHY/defs.h
@@ -362,6 +362,7 @@ typedef struct
   uint32_t rx_gain_med[4];
   uint32_t rx_gain_byp[4];
   int8_t tx_power_dBm;
+  int tx_total_RE;
   int8_t tx_power_max_dBm;
   uint32_t frame;
   uint8_t n_connected_eNB;
diff --git a/openair1/PHY/impl_defs_top.h b/openair1/PHY/impl_defs_top.h
index 0bd25e4e60..d0fa72c818 100755
--- a/openair1/PHY/impl_defs_top.h
+++ b/openair1/PHY/impl_defs_top.h
@@ -183,7 +183,7 @@
 //the min and max gains have to match the calibrated gain table
 //#define MAX_RF_GAIN 160
 //#define MIN_RF_GAIN 96
-#define MAX_RF_GAIN 160
+#define MAX_RF_GAIN 200
 #define MIN_RF_GAIN 80
 
 #define PHY_SYNCH_OFFSET ((OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES)-1)  // OFFSET of BEACON SYNCH
diff --git a/openair1/SCHED/defs.h b/openair1/SCHED/defs.h
index bc6bcf28be..10ddadf8fa 100644
--- a/openair1/SCHED/defs.h
+++ b/openair1/SCHED/defs.h
@@ -527,7 +527,7 @@ LTE_DL_FRAME_PARMS *get_lte_frame_parms(module_id_t Mod_id, uint8_t CC_id);
 
 MU_MIMO_mode* get_mu_mimo_mode (module_id_t Mod_id, uint8_t CC_id);
 
-int get_ue_active_harq_pid(uint8_t Mod_id,uint8_t CC_id,uint16_t rnti,uint8_t subframe,uint8_t *harq_pid,uint8_t *round,uint8_t ul_flag);
+int get_ue_active_harq_pid(uint8_t Mod_id,uint8_t CC_id,uint16_t rnti,int frame, uint8_t subframe,uint8_t *harq_pid,uint8_t *round,uint8_t ul_flag);
 void ulsch_decoding_procedures(unsigned char last_slot, unsigned int i, PHY_VARS_eNB *phy_vars_eNB, unsigned char abstraction_flag);
 
 
diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c
index 2147422c0f..74ad1b0286 100755
--- a/openair1/SCHED/phy_procedures_lte_eNb.c
+++ b/openair1/SCHED/phy_procedures_lte_eNb.c
@@ -77,7 +77,6 @@
 #define NS_PER_SLOT 500000
 
 #define PUCCH 1
-
 #define PUCCH1_THRES 15
 #define PUCCH1a_THRES 15
 
@@ -211,7 +210,7 @@ int8_t find_next_ue_index(PHY_VARS_eNB *phy_vars_eNB) {
   return(-1);
 }
 
-int get_ue_active_harq_pid(uint8_t Mod_id,uint8_t CC_id,uint16_t rnti,uint8_t sched_subframe,uint8_t *harq_pid,uint8_t *round,uint8_t ul_flag) {
+int get_ue_active_harq_pid(uint8_t Mod_id,uint8_t CC_id,uint16_t rnti,int frame, uint8_t subframe,uint8_t *harq_pid,uint8_t *round,uint8_t ul_flag) {
 
   LTE_eNB_DLSCH_t *DLSCH_ptr;  
   LTE_eNB_ULSCH_t *ULSCH_ptr;  
@@ -219,8 +218,8 @@ int get_ue_active_harq_pid(uint8_t Mod_id,uint8_t CC_id,uint16_t rnti,uint8_t sc
   uint8_t ulsch_subframe,ulsch_frame; 
   uint8_t i;
   int8_t UE_id = find_ue(rnti,PHY_vars_eNB_g[Mod_id][CC_id]);
-  int frame    = PHY_vars_eNB_g[Mod_id][CC_id]->proc[sched_subframe].frame_tx;
-  int subframe = PHY_vars_eNB_g[Mod_id][CC_id]->proc[sched_subframe].subframe_tx;
+  //  int frame    = PHY_vars_eNB_g[Mod_id][CC_id]->proc[sched_subframe].frame_tx;
+  //  int subframe = PHY_vars_eNB_g[Mod_id][CC_id]->proc[sched_subframe].subframe_tx;
 
   if (UE_id==-1) {
     LOG_E(PHY,"Cannot find UE with rnti %x\n",rnti);
@@ -2095,6 +2094,23 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
 #ifdef EMOS
   phy_procedures_emos_eNB_TX(next_slot, phy_vars_eNB);
 #endif
+
+#ifndef EXMIMO
+#ifndef USRP
+  if (abstraction_flag==0) {
+    start_meas(&phy_vars_eNB->ofdm_mod_stats);
+    do_OFDM_mod(phy_vars_eNB->lte_eNB_common_vars.txdataF[0],
+		phy_vars_eNB->lte_eNB_common_vars.txdata[0],
+		phy_vars_eNB->proc[sched_subframe].frame_tx,subframe<<1,
+		&phy_vars_eNB->lte_frame_parms);
+    do_OFDM_mod(phy_vars_eNB->lte_eNB_common_vars.txdataF[0],
+		phy_vars_eNB->lte_eNB_common_vars.txdata[0],
+		phy_vars_eNB->proc[sched_subframe].frame_tx,1+(subframe<<1),
+		&phy_vars_eNB->lte_frame_parms);
+    stop_meas(&phy_vars_eNB->ofdm_mod_stats);
+  }
+#endif
+#endif
   
   vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_TX,0);
   stop_meas(&phy_vars_eNB->phy_proc_tx);
@@ -2959,7 +2975,7 @@ void phy_procedures_eNB_RX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
 		frame,subframe, i,
 		phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round-1,
 		phy_vars_eNB->lte_frame_parms.maxHARQ_Msg3Tx-1);
-
+	  
 	  if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round == 
 	      phy_vars_eNB->lte_frame_parms.maxHARQ_Msg3Tx) {
 	    LOG_D(PHY,"[eNB %d][RAPROC] maxHARQ_Msg3Tx reached, abandoning RA procedure for UE %d\n",
@@ -2991,11 +3007,12 @@ void phy_procedures_eNB_RX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
 	  for (j=0;j<phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3;j++)
 	    printf("%x.",phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->c[0][j]);
 	  printf("\n");
-	  dump_ulsch(phy_vars_eNB,sched_subframe,i);*/
+	   */
+	  //	  dump_ulsch(phy_vars_eNB,sched_subframe,i);
 	  //#ifndef EXMIMO_IOT
 	  LOG_W(PHY,"[eNB] Frame %d, Subframe %d: Msg3 in error\n", frame,subframe);
 	  //#else 
-	  //	  mac_exit_wrapper("Msg3 error");
+	  //mac_exit_wrapper("Msg3 error");
 	  //#endif 
 	} // This is Msg3 error
 	else { //normal ULSCH
@@ -3017,6 +3034,7 @@ void phy_procedures_eNB_RX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
 	  
 
 	  //	  dump_ulsch(phy_vars_eNB,sched_subframe,i);
+	  //mac_exit_wrapper("ULSCH error");
 	  
 	  if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round== phy_vars_eNB->ulsch_eNB[i]->Mdlharq) {
 	    LOG_I(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d ULSCH Mdlharq %d reached\n",
diff --git a/openair1/SCHED/phy_procedures_lte_ue.c b/openair1/SCHED/phy_procedures_lte_ue.c
index 809cc35532..f60ec8f1ee 100755
--- a/openair1/SCHED/phy_procedures_lte_ue.c
+++ b/openair1/SCHED/phy_procedures_lte_ue.c
@@ -367,7 +367,7 @@ void process_timing_advance(uint8_t Mod_id,uint8_t CC_id,int16_t timing_advance)
 uint8_t is_SR_TXOp(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe) {
   
   LOG_D(PHY,"[UE %d][SR %x] Frame %d subframe %d Checking for SR TXOp (sr_ConfigIndex %d)\n",
-      phy_vars_ue->Mod_id,phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti,phy_vars_ue->frame,subframe,
+	phy_vars_ue->Mod_id,phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti,phy_vars_ue->frame+(subframe==0)?1:0,subframe,
       phy_vars_ue->scheduling_request_config[eNB_id].sr_ConfigIndex);
   
   if (phy_vars_ue->scheduling_request_config[eNB_id].sr_ConfigIndex <= 4) {        // 5 ms SR period
@@ -717,6 +717,8 @@ void phy_procedures_UE_TX(uint8_t next_slot,PHY_VARS_UE *phy_vars_ue,uint8_t eNB
 #else
 	phy_vars_ue->tx_power_dBm = UE_TX_POWER;
 #endif
+	phy_vars_ue->tx_total_RE = phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->nb_rb*12;
+
 	LOG_D(PHY,"[UE  %d][PUSCH %d] Frame %d subframe %d harq pid %d, Po_PUSCH : %d dBm\n",
 	      phy_vars_ue->Mod_id,harq_pid,(((next_slot>>1)==0)?1:0)+phy_vars_ue->frame,next_slot>>1,harq_pid, phy_vars_ue->tx_power_dBm);	
 
@@ -919,6 +921,8 @@ void phy_procedures_UE_TX(uint8_t next_slot,PHY_VARS_UE *phy_vars_ue,uint8_t eNB
 #else
 	  phy_vars_ue->tx_power_dBm = UE_TX_POWER;
 #endif
+	  phy_vars_ue->tx_total_RE = phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->nb_rb*12;
+
 	  LOG_I(PHY,"[UE  %d][PUSCH %d] Frame %d subframe %d, generating PUSCH, Po_PUSCH: %d dBm, amp %d\n",
 		phy_vars_ue->Mod_id,harq_pid,(((next_slot>>1)==0)?1:0)+phy_vars_ue->frame,next_slot>>1,phy_vars_ue->tx_power_dBm,
 #ifdef EXMIMO
@@ -1030,7 +1034,7 @@ void phy_procedures_UE_TX(uint8_t next_slot,PHY_VARS_UE *phy_vars_ue,uint8_t eNB
 	// Check for SR and do ACK/NACK accordingly
 	if (is_SR_TXOp(phy_vars_ue,eNB_id,next_slot>>1)==1) {
 	  LOG_D(PHY,"[UE %d][SR %x] Frame %d subframe %d: got SR_TXOp, Checking for SR for PUSCH from MAC\n",
-	 	phy_vars_ue->Mod_id,phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti,phy_vars_ue->frame,next_slot>>1);
+	 	phy_vars_ue->Mod_id,phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti,phy_vars_ue->frame+(next_slot==0)?1:0,next_slot>>1);
 #ifdef OPENAIR2
 	  SR_payload = mac_xface->ue_get_SR(phy_vars_ue->Mod_id,
 					    phy_vars_ue->CC_id,
@@ -1045,7 +1049,7 @@ void phy_procedures_UE_TX(uint8_t next_slot,PHY_VARS_UE *phy_vars_ue,uint8_t eNB
 	  if (SR_payload>0) {
 	    generate_ul_signal = 1;
 	    LOG_D(PHY,"[UE %d][SR %x] Frame %d subframe %d got the SR for PUSCH is %d\n",
-		  phy_vars_ue->Mod_id,phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti,phy_vars_ue->frame,next_slot>>1,SR_payload);
+		  phy_vars_ue->Mod_id,phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti,phy_vars_ue->frame+(next_slot==0)?1:0,next_slot>>1,SR_payload);
 	  }
 	  else {
 	    phy_vars_ue->sr[next_slot>>1]=0;
@@ -1073,12 +1077,13 @@ void phy_procedures_UE_TX(uint8_t next_slot,PHY_VARS_UE *phy_vars_ue,uint8_t eNB
 #else
 	    phy_vars_ue->tx_power_dBm = UE_TX_POWER;
 #endif
+	    phy_vars_ue->tx_total_RE = 12;
 
 	    if (SR_payload>0) {
 	      LOG_I(PHY,"[UE  %d][SR %x] Frame %d subframe %d Generating PUCCH 1a/1b (with SR for PUSCH), n1_pucch %d, Po_PUCCH, amp %d\n",
 		    phy_vars_ue->Mod_id, 
 		    phy_vars_ue->dlsch_ue[eNB_id][0]->rnti,
-		    phy_vars_ue->frame, next_slot>>1,
+		    phy_vars_ue->frame+(next_slot==0)?1:0, next_slot>>1,
 		    phy_vars_ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex,
 		    Po_PUCCH,
 #ifdef EXMIMO
@@ -1142,11 +1147,12 @@ void phy_procedures_UE_TX(uint8_t next_slot,PHY_VARS_UE *phy_vars_ue,uint8_t eNB
 #else
 	  phy_vars_ue->tx_power_dBm = UE_TX_POWER;
 #endif
+	  phy_vars_ue->tx_total_RE = 12;
 
 	  LOG_I(PHY,"[UE  %d][SR %x] Frame %d subframe %d Generating PUCCH 1 (SR for PUSCH), n1_pucch %d, Po_PUCCH %d\n",
 		phy_vars_ue->Mod_id, 
 		phy_vars_ue->dlsch_ue[eNB_id][0]->rnti,
-		phy_vars_ue->frame, next_slot>>1,
+		phy_vars_ue->frame+(next_slot==0)?1:0, next_slot>>1,
 		phy_vars_ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex,
 		Po_PUCCH);
 	  
@@ -1316,6 +1322,8 @@ void phy_procedures_UE_TX(uint8_t next_slot,PHY_VARS_UE *phy_vars_ue,uint8_t eNB
 	    phy_vars_ue->tx_power_dBm = UE_TX_POWER;
 #endif
 
+	    phy_vars_ue->tx_total_RE = 96;
+
 #ifdef EXMIMO
 	    phy_vars_ue->lte_ue_prach_vars[eNB_id]->amp = get_tx_amp(phy_vars_ue->tx_power_dBm,phy_vars_ue->tx_power_max_dBm);
 #else
@@ -1491,10 +1499,15 @@ void lte_ue_measurement_procedures(uint8_t last_slot, uint16_t l, PHY_VARS_UE *p
     
     // AGC
 #ifdef EXMIMO    
+
     if ((openair_daq_vars.rx_gain_mode == DAQ_AGC_ON) &&
 	(mode != rx_calib_ue) && (mode != rx_calib_ue_med) && (mode != rx_calib_ue_byp) )
-      //phy_adjust_gain (phy_vars_ue,0);
       gain_control_all(phy_vars_ue->PHY_measurements.rx_power_avg_dB[eNB_id],0);
+
+#else
+
+    phy_adjust_gain (phy_vars_ue,0);
+
 #endif
 
     eNB_id = 0;
diff --git a/openair1/SIMULATION/RF/dac.c b/openair1/SIMULATION/RF/dac.c
index accb0f1124..2c4c5d3d3c 100755
--- a/openair1/SIMULATION/RF/dac.c
+++ b/openair1/SIMULATION/RF/dac.c
@@ -87,17 +87,18 @@ double dac_fixed_gain(double **s_re,
 		      uint32_t input_offset_meas,
 		      uint32_t length_meas,
 		      uint8_t B,
-		      double txpwr_dBm) {
+		      double txpwr_dBm,
+		      int NB_RE) {
 
   int i;
   int aa;
   double amp,amp1;
  
-  amp = pow(10.0,.05*txpwr_dBm)/sqrt(nb_tx_antennas); //this is amp per tx antenna
+  amp = sqrt(NB_RE)*pow(10.0,.05*txpwr_dBm)/sqrt(nb_tx_antennas); //this is amp per tx antenna
 
   amp1 = 0;
   for (aa=0;aa<nb_tx_antennas;aa++) {
-    amp1 += sqrt((double)signal_energy((int32_t*)&input[aa][input_offset_meas],length_meas) * (512.0/300.0));
+    amp1 += sqrt((double)signal_energy((int32_t*)&input[aa][input_offset_meas],length_meas));
   }
   amp1/=nb_tx_antennas;
 
@@ -118,11 +119,10 @@ double dac_fixed_gain(double **s_re,
     for (aa=0;aa<nb_tx_antennas;aa++) {
       s_re[aa][i] = amp*((double)(((short *)input[aa]))[((i+input_offset)<<1)])/amp1; ///(1<<(B-1));
       s_im[aa][i] = amp*((double)(((short *)input[aa]))[((i+input_offset)<<1)+1])/amp1; ///(1<<(B-1));
-
     }
   }
 
   //  printf("ener %e\n",signal_energy_fp(s_re,s_im,nb_tx_antennas,length,0));
 
-  return(signal_energy_fp(s_re,s_im,nb_tx_antennas,512,0));
+  return(signal_energy_fp(s_re,s_im,nb_tx_antennas,length_meas,0));
 }
diff --git a/openair1/SIMULATION/RF/defs.h b/openair1/SIMULATION/RF/defs.h
index eded0a6222..41544d9980 100644
--- a/openair1/SIMULATION/RF/defs.h
+++ b/openair1/SIMULATION/RF/defs.h
@@ -101,4 +101,5 @@ double dac_fixed_gain(double **s_re,
 		      unsigned int input_offset_meas,
 		      unsigned int length_meas,
 		      unsigned char B,
-		      double gain);
+		      double gain,
+		      int NB_RE);
diff --git a/openair1/SIMULATION/RF/rf.c b/openair1/SIMULATION/RF/rf.c
index dbd7e97603..75fdc475aa 100644
--- a/openair1/SIMULATION/RF/rf.c
+++ b/openair1/SIMULATION/RF/rf.c
@@ -46,7 +46,7 @@ extern int write_output(const char *,const char *,void *,int,int,char);
 
 //double pn[1024];
 
-//#define DEBUG_RF 1
+#define DEBUG_RF 1
 
   //free(input_data);
 void rf_rx(double **r_re,
-- 
GitLab