From 7d27d45d02b34a6979dead469db62e146fe4cda3 Mon Sep 17 00:00:00 2001
From: Florian Kaltenberger <florian.kaltenberger@eurecom.fr>
Date: Wed, 2 Dec 2015 15:57:25 +0100
Subject: [PATCH] few more fixes

---
 .../PHY/LTE_TRANSPORT/dlsch_demodulation.c    |  38 ++++---
 openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c |  10 +-
 openair1/PHY/LTE_TRANSPORT/proto.h            |   5 +-
 openair1/SIMULATION/LTE_PHY/dlsim.c           | 102 ++++++------------
 4 files changed, 62 insertions(+), 93 deletions(-)

diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c b/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c
index 12958f07bdd..a27c0f1d1a6 100644
--- a/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c
+++ b/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c
@@ -203,7 +203,10 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue,
                                    frame_parms,
 				   dlsch0_harq->mimo_mode);
 //#ifdef DEBUG_DLSCH_MOD
-    printf("dlsch: using pmi %lx, rb_alloc %x, pmi_ext %x\n",pmi2hex_2Ar1(dlsch0_harq->pmi_alloc),*rballoc,*lte_ue_pdsch_vars[eNB_id]->pmi_ext);
+    printf("dlsch: using pmi %lx, rb_alloc %x, pmi_ext ",pmi2hex_2Ar1(dlsch0_harq->pmi_alloc),*rballoc);
+    for (rb=0;rb<nb_rb;rb++)
+      printf("%d",lte_ue_pdsch_vars[eNB_id]->pmi_ext[rb]);
+    printf("\n");
 //#endif
 
    if (rx_type==rx_IC_single_stream) {
@@ -1381,17 +1384,19 @@ void prec2A_TM4_128(int pmi,__m128i *ch0,__m128i *ch1) {
     ch0[0] = _mm_adds_epi16(tmp0,tmp1);
     ch1[0] = _mm_subs_epi16(tmp0,tmp1);
   }
-  else {
+  else { //[1 j; 1 -j]
     tmp0 = ch0[0];
-    tmp1   = _mm_sign_epi16(ch1[0],*(__m128i*)&conjugate[0]);
-    tmp1   = _mm_shufflelo_epi16(tmp1,_MM_SHUFFLE(2,3,0,1));
-    tmp1   = _mm_shufflehi_epi16(tmp1,_MM_SHUFFLE(2,3,0,1));
-    ch0[0] = _mm_subs_epi16(tmp0,tmp1);
+    tmp1 = ch1[0];
+    ch0[0] = _mm_adds_epi16(tmp0,tmp1);
     ch1[0] = _mm_subs_epi16(tmp0,tmp1);
-  }
+  
+    //print_shorts("prec2A_TM4 ch0 (middle):",ch0);
+    //print_shorts("prec2A_TM4 ch1 (middle):",ch1);
 
-  //print_shorts("prec2A_TM4 ch0 (middle):",ch0);
-  //print_shorts("prec2A_TM4 ch1 (middle):",ch1);
+    ch1[0] = _mm_sign_epi16(ch1[0],*(__m128i*)&conjugate2[0]);
+    ch1[0] = _mm_shufflelo_epi16(ch1[0],_MM_SHUFFLE(2,3,0,1));
+    ch1[0] = _mm_shufflehi_epi16(ch1[0],_MM_SHUFFLE(2,3,0,1));
+  }
 
   //ch0[0] = _mm_mulhi_epi16(ch0[0],amp);
   //ch0[0] = _mm_slli_epi16(ch0[0],1);
@@ -1902,7 +1907,7 @@ void dlsch_channel_compensation_TM34(LTE_DL_FRAME_PARMS *frame_parms,
         }
       }
       
-        else if (mimo_mode==DUALSTREAM_PUSCH_PRECODING) {
+      else if (mimo_mode==DUALSTREAM_PUSCH_PRECODING) {
         prec2A_TM4_128(pmi_ext[rb],&dl_ch0_128[0],&dl_ch1_128[0]);
         prec2A_TM4_128(pmi_ext[rb],&dl_ch0_128[1],&dl_ch1_128[1]);
         
@@ -4137,14 +4142,16 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF,
 	    rxF      = &rxdataF[aarx][prb_off2+
 				      (symbol*(frame_parms->ofdm_symbol_size))];
 	  }
-	  
+
+	  /*	  
 	 if (mimo_mode <= PUSCH_PRECODING1)
           *pmi_loc = (pmi>>((prb>>2)<<1))&3;
 	 else
 	  *pmi_loc=(pmi>>prb)&1;
-	  
+	  */
+	  *pmi_loc = get_pmi(frame_parms->N_RB_DL,mimo_mode,pmi,prb);
           pmi_loc++;
-	  
+	
 	  
           if (pilots == 0) {
 	    
@@ -4279,14 +4286,17 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF,
 #ifdef DEBUG_DLSCH_DEMOD
 	  printf("symbol %d / rb %d: alloc %d skip_half %d (rxF %p, rxF_ext %p) prb_off (%d,%d)\n",symbol,prb,rb_alloc_ind,skip_half,rxF,rxF_ext,prb_off,prb_off2);
 #endif
+	  /*
           if (mimo_mode <= PUSCH_PRECODING1)
            *pmi_loc = (pmi>>((prb>>2)<<1))&3;
 	  else
 	   *pmi_loc=(pmi>>prb)&1;
-         // printf("symbol_mod %d (pilots %d) rb %d, sb %d, pmi %d (pmi_loc %p,rxF %p, ch00 %p, ch01 %p, rxF_ext %p dl_ch0_ext %p dl_ch1_ext %p)\n",symbol_mod,pilots,prb,prb>>2,*pmi_loc,pmi_loc,rxF,dl_ch0, dl_ch1, rxF_ext,dl_ch0_ext,dl_ch1_ext);
+	   */
 
+	  *pmi_loc = get_pmi(frame_parms->N_RB_DL,mimo_mode,pmi,prb);
           pmi_loc++;
 
+
 	  if (prb != (frame_parms->N_RB_DL>>1)) { // This PRB is not around DC
 	    if (pilots==0) {
 	      if (skip_half==1) {
diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c b/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c
index 0c40569f3b5..439da50f907 100644
--- a/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c
+++ b/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c
@@ -1247,12 +1247,12 @@ int allocate_REs_in_RB_MCH(mod_sym_t **txdataF,
   return(0);
 }
 
-uint8_t get_pmi(uint8_t N_RB_DL,LTE_DL_eNB_HARQ_t *dlsch_harq,uint16_t rb)
+uint8_t get_pmi(uint8_t N_RB_DL,MIMO_mode_t mode, uint32_t pmi_alloc,uint16_t rb)
 {
-
-
+  /*
   MIMO_mode_t mode   = dlsch_harq->mimo_mode;
   uint32_t pmi_alloc = dlsch_harq->pmi_alloc;
+  */
 
   switch (N_RB_DL) {
   case 6:   // 1 PRB per subband
@@ -1268,7 +1268,7 @@ uint8_t get_pmi(uint8_t N_RB_DL,LTE_DL_eNB_HARQ_t *dlsch_harq,uint16_t rb)
     if (mode <= PUSCH_PRECODING1)
       return((pmi_alloc>>((rb>>2)<<1))&3);
     else {
-      printf("Getting pmi for RB %d => %d\n",rb,((pmi_alloc>>(rb>>2))&1));
+      //printf("Getting pmi for RB %d => %d\n",rb,((pmi_alloc>>(rb>>2))&1));
       return((pmi_alloc>>(rb>>2))&1);
     }
     break;
@@ -1572,7 +1572,7 @@ int dlsch_modulation(mod_sym_t **txdataF,
                            (dlsch1==NULL) ? NULL : dlsch1->harq_processes[harq_pid],
                            pilots,
                            ((pilots) ? amp_rho_b : amp_rho_a),
-                           get_pmi(frame_parms->N_RB_DL,dlsch0->harq_processes[harq_pid],rb),
+                           get_pmi(frame_parms->N_RB_DL,dlsch0->harq_processes[harq_pid]->mimo_mode,dlsch0->harq_processes[harq_pid]->pmi_alloc,rb),
                            qam_table_s0,
                            qam_table_s1,
                            &re_allocated,
diff --git a/openair1/PHY/LTE_TRANSPORT/proto.h b/openair1/PHY/LTE_TRANSPORT/proto.h
index 87f494e826f..5a51de85888 100644
--- a/openair1/PHY/LTE_TRANSPORT/proto.h
+++ b/openair1/PHY/LTE_TRANSPORT/proto.h
@@ -1607,11 +1607,12 @@ uint32_t pmi_extend(LTE_DL_FRAME_PARMS *frame_parms,uint8_t wideband_pmi, uint8_
 
 /** \brief  This routine extracts a single subband PMI from a bitmap coming from UCI or the pmi_extend function
     @param N_RB_DL number of resource blocks
-    @param dlsch_harq pointer to dlsch structure (containing mimo_mode and pmi_alloc)
+    @param mimo_mode  
+    @param pmi_alloc subband PMI bitmap
     @param rb resource block for which to extract PMI
     @returns subband PMI
 */
-uint8_t get_pmi(uint8_t N_RB_DL,LTE_DL_eNB_HARQ_t *dlsch_harq,uint16_t rb);
+uint8_t get_pmi(uint8_t N_RB_DL,MIMO_mode_t mode, uint32_t pmi_alloc,uint16_t rb);
 
 
 uint16_t get_nCCE(uint8_t num_pdcch_symbols,LTE_DL_FRAME_PARMS *frame_parms,uint8_t mi);
diff --git a/openair1/SIMULATION/LTE_PHY/dlsim.c b/openair1/SIMULATION/LTE_PHY/dlsim.c
index efbc7ba99ea..38c388c7ccc 100644
--- a/openair1/SIMULATION/LTE_PHY/dlsim.c
+++ b/openair1/SIMULATION/LTE_PHY/dlsim.c
@@ -736,7 +736,7 @@ int main(int argc, char **argv)
   if (transmission_mode==5) { 
     n_users = 2;
     //eNB_id_i = PHY_vars_UE->n_connected_eNB;
-  eNB_id_i=1;
+    eNB_id_i=1;
       
   }
   else 
@@ -3437,74 +3437,6 @@ n(tikz_fname,"w");
 		      }
 		    stop_meas(&PHY_vars_UE->dlsch_llr_stats);
 		  }
-		if (test_perf ==0 ) {
-		  if ((n_frames==1) && (Ns==(2+(2*subframe))) && (l==0))  {
-		    
-		    
-		    write_output("chanF11.m","chF11",eNB2UE[0]->chF[0],12*NB_RB,1,8);
-		    write_output("chan11.m","ch11",eNB2UE[0]->ch[0],eNB2UE[0]->channel_length,1,8);
-		    if ( PHY_vars_eNB->lte_frame_parms.nb_antennas_rx==2 && PHY_vars_eNB->lte_frame_parms.nb_antennas_tx==1 ){
-		      write_output("chan21.m","ch21",eNB2UE[0]->ch[1],eNB2UE[0]->channel_length,1,8);
-		    }
-		    if (PHY_vars_eNB->lte_frame_parms.nb_antennas_tx>1){
-		    write_output("chan12.m","ch12",eNB2UE[0]->ch[1],eNB2UE[0]->channel_length,1,8);
-		      if ( PHY_vars_eNB->lte_frame_parms.nb_antennas_rx>1){
-		    write_output("chan21.m","ch21",eNB2UE[0]->ch[2],eNB2UE[0]->channel_length,1,8);
-		    write_output("chan22.m","ch22",eNB2UE[0]->ch[3],eNB2UE[0]->channel_length,1,8);
-		      }
-		     
-		    }
-		    
-		    
-		  /*for (aarx=0;aarx<PHY_vars_UE->lte_frame_parms.nb_antennas_rx; aarx++) {
-		      for (aa=0;aa<PHY_vars_UE->lte_frame_parms.nb_antennas_tx; aa++) {
-		      sprintf(fname,"ch%d%d.m",(aarx+1), (aa+1));
-		      write_output(fname,"ch",eNB2UE[0]->ch[2*aarx+aa],eNB2UE[0]->channel_length,1,8);
-		      }
-		    } */
-		    /*write_output("ch0.m","ch0",eNB2UE[0]->ch[0],eNB2UE[0]->channel_length,1,8);
-		    if (PHY_vars_eNB->lte_frame_parms.nb_antennas_tx>1)
-		      write_output("ch1.m","ch1",eNB2UE[0]->ch[PHY_vars_eNB->lte_frame_parms.nb_antennas_rx],eNB2UE[0]->channel_length,1,8);*/
-		    
-		    //common vars
-		    write_output("rxsig0.m","rxs0", &PHY_vars_UE->lte_ue_common_vars.rxdata[0][0],10*PHY_vars_UE->lte_frame_parms.samples_per_tti,1,1);
-		    write_output("rxsigF0.m","rxsF0", &PHY_vars_UE->lte_ue_common_vars.rxdataF[0][0],PHY_vars_UE->lte_frame_parms.ofdm_symbol_size*nsymb,1,1);
-		    if (PHY_vars_UE->lte_frame_parms.nb_antennas_rx>1) {
-		      write_output("rxsig1.m","rxs1", PHY_vars_UE->lte_ue_common_vars.rxdata[1],PHY_vars_UE->lte_frame_parms.samples_per_tti,1,1);
-		      write_output("rxsigF1.m","rxsF1", PHY_vars_UE->lte_ue_common_vars.rxdataF[1],PHY_vars_UE->lte_frame_parms.ofdm_symbol_size*nsymb,1,1);
-		    }
-
-		    write_output("dlsch00_r0.m","dl00_r0",
-				 &(PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[eNB_id][0][0]),
-				 PHY_vars_UE->lte_frame_parms.ofdm_symbol_size*nsymb,1,1);
-		    if (PHY_vars_UE->lte_frame_parms.nb_antennas_rx>1)
-		      write_output("dlsch01_r0.m","dl01_r0",
-				   &(PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[eNB_id][1][0]),
-				   PHY_vars_UE->lte_frame_parms.ofdm_symbol_size*nsymb,1,1);
-		    if (PHY_vars_eNB->lte_frame_parms.nb_antennas_tx>1)
-		      write_output("dlsch10_r0.m","dl10_r0",
-				   &(PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[eNB_id][2][0]),
-				   PHY_vars_UE->lte_frame_parms.ofdm_symbol_size*nsymb,1,1);
-		    if ((PHY_vars_UE->lte_frame_parms.nb_antennas_rx>1) && (PHY_vars_eNB->lte_frame_parms.nb_antennas_tx>1))
-		      write_output("dlsch11_r0.m","dl11_r0",
-				   &(PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[eNB_id][3][0]),
-				   PHY_vars_UE->lte_frame_parms.ofdm_symbol_size*nsymb/2,1,1);
-		    
-		    //pdsch_vars
-		    dump_dlsch2(PHY_vars_UE,eNB_id,coded_bits_per_codeword,round,PHY_vars_UE->dlsch_ue[0][1]->current_harq_pid );
-		    //dump_dlsch2(PHY_vars_UE,eNB_id_i,coded_bits_per_codeword);
-		  //  write_output("dlsch_e.m","e",PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->e,coded_bits_per_codeword,1,4);
-		    
-
-		    //pdcch_vars
-		    write_output("pdcchF0_ext.m","pdcchF_ext", PHY_vars_UE->lte_ue_pdcch_vars[eNB_id]->rxdataF_ext[0],2*3*PHY_vars_UE->lte_frame_parms.ofdm_symbol_size,1,1);
-		    write_output("pdcch00_ch0_ext.m","pdcch00_ch0_ext",PHY_vars_UE->lte_ue_pdcch_vars[eNB_id]->dl_ch_estimates_ext[0],300*3,1,1);
-
-		    write_output("pdcch_rxF_comp0.m","pdcch0_rxF_comp0",PHY_vars_UE->lte_ue_pdcch_vars[eNB_id]->rxdataF_comp[0],4*300,1,1);
-		    write_output("pdcch_rxF_llr.m","pdcch_llr",PHY_vars_UE->lte_ue_pdcch_vars[eNB_id]->llr,2400,1,4);
-		    
-		  }
-		}
 	      }
 	    }
 	  }
@@ -3751,6 +3683,8 @@ n(tikz_fname,"w");
 	  stop_meas(&PHY_vars_UE->phy_proc_rx);
 	  
 	  if (n_frames==1) {
+
+	    //rxsig
 	    sprintf(fname,"rxsig0_r%d.m",round);
 	    sprintf(vname,"rxs0_r%d",round);
 	    write_output(fname,vname, &PHY_vars_UE->lte_ue_common_vars.rxdata[0][0],10*PHY_vars_UE->lte_frame_parms.samples_per_tti,1,1);
@@ -3765,6 +3699,22 @@ n(tikz_fname,"w");
 	      sprintf(vname,"rxs1F_r%d",round);
 	      write_output(fname,vname, PHY_vars_UE->lte_ue_common_vars.rxdataF[1],2*PHY_vars_UE->lte_frame_parms.ofdm_symbol_size*nsymb,2,1);
 	    }
+
+	    //channel
+	    write_output("chanF11.m","chF11",eNB2UE[0]->chF[0],12*NB_RB,1,8);
+	    write_output("chan11.m","ch11",eNB2UE[0]->ch[0],eNB2UE[0]->channel_length,1,8);
+	    if ( PHY_vars_eNB->lte_frame_parms.nb_antennas_rx==2 && PHY_vars_eNB->lte_frame_parms.nb_antennas_tx==1 ){
+	      write_output("chan21.m","ch21",eNB2UE[0]->ch[1],eNB2UE[0]->channel_length,1,8);
+	    }
+	    if (PHY_vars_eNB->lte_frame_parms.nb_antennas_tx>1){
+	      write_output("chan12.m","ch12",eNB2UE[0]->ch[1],eNB2UE[0]->channel_length,1,8);
+	      if ( PHY_vars_eNB->lte_frame_parms.nb_antennas_rx>1){
+		write_output("chan21.m","ch21",eNB2UE[0]->ch[2],eNB2UE[0]->channel_length,1,8);
+		write_output("chan22.m","ch22",eNB2UE[0]->ch[3],eNB2UE[0]->channel_length,1,8);
+	      }
+	    }
+
+	    //channel estimates
 	    sprintf(fname,"dlsch00_r%d.m",round);
 	    sprintf(vname,"dl00_r%d",round);
 	    write_output(fname,vname,
@@ -3775,21 +3725,21 @@ n(tikz_fname,"w");
 	      sprintf(vname,"dl01_r%d",round);
 	      write_output(fname,vname,
 			   &(PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[eNB_id][1][0]),
-			   PHY_vars_UE->lte_frame_parms.ofdm_symbol_size*nsymb/2,1,1);
+			   PHY_vars_UE->lte_frame_parms.ofdm_symbol_size*nsymb,1,1);
 	    }
 	    if (PHY_vars_eNB->lte_frame_parms.nb_antennas_tx>1) {
 	      sprintf(fname,"dlsch10_r%d.m",round);
 	      sprintf(vname,"dl10_r%d",round);
 	      write_output(fname,vname,
 			   &(PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[eNB_id][2][0]),
-			   PHY_vars_UE->lte_frame_parms.ofdm_symbol_size*nsymb/2,1,1);
+			   PHY_vars_UE->lte_frame_parms.ofdm_symbol_size*nsymb,1,1);
 	    }
 	    if ((PHY_vars_UE->lte_frame_parms.nb_antennas_rx>1) && (PHY_vars_eNB->lte_frame_parms.nb_antennas_tx>1)) {
 	      sprintf(fname,"dlsch11_r%d.m",round);
 	      sprintf(vname,"dl11_r%d",round);
 	      write_output(fname,vname,
 			   &(PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[eNB_id][3][0]),
-			   PHY_vars_UE->lte_frame_parms.ofdm_symbol_size*nsymb/2,1,1);
+			   PHY_vars_UE->lte_frame_parms.ofdm_symbol_size*nsymb,1,1);
 	    }
 	    //pdsch_vars
 	    dump_dlsch2(PHY_vars_UE,eNB_id,coded_bits_per_codeword,round,PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid);
@@ -3799,6 +3749,14 @@ n(tikz_fname,"w");
 	      write_output("dlsch_eNB_w.m","w",PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->w[0],3*(tbs+64),1,4);
 	      write_output("dlsch_UE_w.m","w",PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->w[0],3*(tbs+64),1,0);
 	    */
+
+	    //pdcch_vars
+	    write_output("pdcchF0_ext.m","pdcchF_ext", PHY_vars_UE->lte_ue_pdcch_vars[eNB_id]->rxdataF_ext[0],2*3*PHY_vars_UE->lte_frame_parms.ofdm_symbol_size,1,1);
+	    write_output("pdcch00_ch0_ext.m","pdcch00_ch0_ext",PHY_vars_UE->lte_ue_pdcch_vars[eNB_id]->dl_ch_estimates_ext[0],300*3,1,1);
+	    
+	    write_output("pdcch_rxF_comp0.m","pdcch0_rxF_comp0",PHY_vars_UE->lte_ue_pdcch_vars[eNB_id]->rxdataF_comp[0],4*300,1,1);
+	    write_output("pdcch_rxF_llr.m","pdcch_llr",PHY_vars_UE->lte_ue_pdcch_vars[eNB_id]->llr,2400,1,4);
+	    
 	    
 	    if (round == 3) exit(-1);
 	  }
-- 
GitLab