From eee0a1551b2c17519ba95f19b54b544f03e89cd9 Mon Sep 17 00:00:00 2001
From: Raymond Knopp <raymond.knopp@eurecom.fr>
Date: Tue, 20 Oct 2015 05:26:07 -0700
Subject: [PATCH] TM2 fixes for TDD

---
 .../PHY/LTE_TRANSPORT/dlsch_demodulation.c    | 223 ++++++++++++------
 .../PHY/LTE_TRANSPORT/dlsch_llr_computation.c |   1 +
 2 files changed, 149 insertions(+), 75 deletions(-)

diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c b/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c
index 7ce84dbc55e..de9acefb6ee 100644
--- a/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c
+++ b/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c
@@ -45,7 +45,6 @@
 #include "PHY/sse_intrin.h"
 
 
-
 #ifndef USER_MODE
 #define NOCYGWIN_STATIC static
 #else
@@ -55,7 +54,7 @@
 //#define DEBUG_PHY 1
 //#define DEBUG_DLSCH_DEMOD 1
 
-int avg[4];
+int avg[4]; 
 
 // [MCS][i_mod (0,1,2) = (2,4,6)]
 unsigned char offset_mumimo_llr_drange_fix=0;
@@ -3362,7 +3361,10 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF,
 
         //PSS in subframe 0/5 if FDD
         if (frame_parms->frame_type == FDD) {  //FDD
-          if (((subframe==0)||(subframe==5)) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) {
+          if (((subframe==0)||(subframe==5)) && 
+	      (rb>((frame_parms->N_RB_DL>>1)-3)) && 
+	      (rb<((frame_parms->N_RB_DL>>1)+3)) && 
+	      (l==pss_symb) ) {
             rb_alloc_ind = 0;
           }
 
@@ -3439,7 +3441,7 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF,
                   dl_ch0_ext[j++]=dl_ch0[i];
                 }
               }
-
+	      rxF_ext+=5;
               dl_ch0_ext+=5;
             } else if (skip_half==2) {
               for (i=0; i<6; i++) {
@@ -3495,29 +3497,31 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF,
 	nb_rb++;
 
       // PBCH
-      if ((subframe==0) && (rb>=((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4))) {
+      if ((subframe==0) && 
+	  (l>=(nsymb>>1)) && 
+	  (l<((nsymb>>1) + 4))) {
         rb_alloc_ind = 0;
       }
 
       //SSS
-      if (((subframe==0)||(subframe==5)) && (rb>=((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==sss_symb) ) {
+      if (((subframe==0)||(subframe==5)) && (l==sss_symb) ) {
         rb_alloc_ind = 0;
       }
 
       if (frame_parms->frame_type == FDD) {
         //PSS
-        if (((subframe==0)||(subframe==5)) && (rb>=((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) {
+        if (((subframe==0)||(subframe==5)) && (l==pss_symb) ) {
           rb_alloc_ind = 0;
         }
       }
 
+      //PSS
       if ((frame_parms->frame_type == TDD) &&
-          (subframe==6)) {
-        //PSS
-        if ((rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) {
-          rb_alloc_ind = 0;
-        }
+          (subframe==6) &&
+	  (l==pss_symb) ) {
+	rb_alloc_ind = 0;
       }
+      
 
       //  printf("dlch_ext %d\n",dl_ch0_ext-&dl_ch_estimates_ext[aarx][0]);
       //      printf("DC rb %d (%p)\n",rb,rxF);
@@ -3823,51 +3827,54 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF,
       if (rb_alloc_ind == 1)
           nb_rb++;
       
-      // PBCH
-      if ((subframe==0) && 
-	  (prb>((frame_parms->N_RB_DL>>1)-3)) && 
-	  (prb<((frame_parms->N_RB_DL>>1)+3)) && 
-	  (l>=(nsymb>>1)) && 
-	  (l<((nsymb>>1) + 4))) {
-	rb_alloc_ind = 0;
-	//	printf("symbol %d / rb %d: skipping PBCH REs\n",symbol,prb);
-      }
-      
-      //SSS
-      
-      if (((subframe==0)||(subframe==5)) &&
-	  (prb>((frame_parms->N_RB_DL>>1)-3)) &&
-	  (prb<((frame_parms->N_RB_DL>>1)+3)) &&
-	  (l==sss_symb) ) {
-	rb_alloc_ind = 0;
-	//	printf("symbol %d / rb %d: skipping SSS REs\n",symbol,prb);
-      }
-      
-      
-      
-      //PSS in subframe 0/5 if FDD
-      if (frame_parms->frame_type == FDD) {  //FDD
-	if (((subframe==0)||(subframe==5)) && 
-	    (prb>((frame_parms->N_RB_DL>>1)-3)) && 
+
+      if ((frame_parms->N_RB_DL&1) == 0) {  // even number of RBs
+
+	// PBCH
+	if ((subframe==0) && 
+	    (prb>=((frame_parms->N_RB_DL>>1)-3)) && 
 	    (prb<((frame_parms->N_RB_DL>>1)+3)) && 
-	    (l==pss_symb) ) {
+	    (l>=(nsymb>>1)) && 
+	    (l<((nsymb>>1) + 4))) {
 	  rb_alloc_ind = 0;
-	  //	  printf("symbol %d / rb %d: skipping PSS REs\n",symbol,prb);
+	  //	printf("symbol %d / rb %d: skipping PBCH REs\n",symbol,prb);
 	}
-      }
-      
-      if ((frame_parms->frame_type == TDD) &&
-	  (subframe==6)) { //TDD Subframe 6
-	if ((prb>=((frame_parms->N_RB_DL>>1)-3)) && 
-	    (prb<=((frame_parms->N_RB_DL>>1)+3)) && 
-	    (l==pss_symb) ) {
+	
+	//SSS
+	
+	if (((subframe==0)||(subframe==5)) &&
+	    (prb>=((frame_parms->N_RB_DL>>1)-3)) &&
+	    (prb<((frame_parms->N_RB_DL>>1)+3)) &&
+	    (l==sss_symb) ) {
 	  rb_alloc_ind = 0;
+	  //	printf("symbol %d / rb %d: skipping SSS REs\n",symbol,prb);
 	}
-      }
-      
-      if (rb_alloc_ind==1) {              // PRB is allocated
+	
+	
+	
+	//PSS in subframe 0/5 if FDD
+	if (frame_parms->frame_type == FDD) {  //FDD
+	  if (((subframe==0)||(subframe==5)) && 
+	      (prb>=((frame_parms->N_RB_DL>>1)-3)) && 
+	      (prb<((frame_parms->N_RB_DL>>1)+3)) && 
+	      (l==pss_symb) ) {
+	    rb_alloc_ind = 0;
+	    //	  printf("symbol %d / rb %d: skipping PSS REs\n",symbol,prb);
+	  }
+	}
+	
+	if ((frame_parms->frame_type == TDD) &&
+	    (subframe==6)) { //TDD Subframe 6
+	  if ((prb>=((frame_parms->N_RB_DL>>1)-3)) && 
+	      (prb<((frame_parms->N_RB_DL>>1)+3)) && 
+	      (l==pss_symb) ) {
+	    rb_alloc_ind = 0;
+	  }
+	}
+	
+	if (rb_alloc_ind==1) {              // PRB is allocated
+
 
-	if ((frame_parms->N_RB_DL&1) == 0) {  // even number of RBs
 	  
 	  prb_off      = 12*prb;
 	  prb_off2     = 1+(12*(prb-(frame_parms->N_RB_DL>>1)));
@@ -3912,11 +3919,55 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF,
 	    rxF_ext+=8;
           } // pilots==1
 
+	}
+      } else {  // Odd number of RBs
 
-        } else {  // Odd number of RBs
 
-	  skip_half=0;
+      // PBCH
+	if ((subframe==0) && 
+	    (prb>((frame_parms->N_RB_DL>>1)-3)) && 
+	    (prb<((frame_parms->N_RB_DL>>1)+3)) && 
+	    (l>=(nsymb>>1)) && 
+	    (l<((nsymb>>1) + 4))) {
+	  rb_alloc_ind = 0;
+	  //	printf("symbol %d / rb %d: skipping PBCH REs\n",symbol,prb);
+	}
+	
+	//SSS
+	
+	if (((subframe==0)||(subframe==5)) &&
+	    (prb>((frame_parms->N_RB_DL>>1)-3)) &&
+	    (prb<((frame_parms->N_RB_DL>>1)+3)) &&
+	    (l==sss_symb) ) {
+	  rb_alloc_ind = 0;
+	  //	printf("symbol %d / rb %d: skipping SSS REs\n",symbol,prb);
+	}
+	
+	
+	
+	//PSS in subframe 0/5 if FDD
+	if (frame_parms->frame_type == FDD) {  //FDD
+	  if (((subframe==0)||(subframe==5)) && 
+	      (prb>((frame_parms->N_RB_DL>>1)-3)) && 
+	      (prb<((frame_parms->N_RB_DL>>1)+3)) && 
+	      (l==pss_symb) ) {
+	    rb_alloc_ind = 0;
+	    //	  printf("symbol %d / rb %d: skipping PSS REs\n",symbol,prb);
+	  }
+	}
+	
+	if ((frame_parms->frame_type == TDD) &&
+	    ((subframe==1) || (subframe==6))) { //TDD Subframe 1-6
+	  if ((prb>((frame_parms->N_RB_DL>>1)-3)) && 
+	      (prb<((frame_parms->N_RB_DL>>1)+3)) && 
+	      (l==pss_symb) ) {
+	    rb_alloc_ind = 0;
+	  }
+	}
 
+	if (rb_alloc_ind == 1) {
+	  skip_half=0;
+	
 	  //Check if we have to drop half a PRB due to PSS/SSS/PBCH
 	  // skip_half == 0 means full PRB
 	  // skip_half == 1 means first half is used (leftmost half-PRB from PSS/SSS/PBCH)
@@ -3947,13 +3998,12 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF,
 	  if (((frame_parms->frame_type == FDD) &&
 	       (((subframe==0)||(subframe==5)))) ||  //FDD Subframes 0,5
 	      ((frame_parms->frame_type == TDD) &&
-	       (((subframe==2) || (subframe==6))))) { //TDD Subframes 2,6
+	       (((subframe==1) || (subframe==6))))) { //TDD Subframes 1,6
 		
 	    if ((prb==((frame_parms->N_RB_DL>>1)-3)) && 
 		(l==pss_symb))
 	      skip_half=1;
-	    else if (((subframe==0)||(subframe==5)) && 
-		     (prb==((frame_parms->N_RB_DL>>1)+3)) && 
+	    else if ((prb==((frame_parms->N_RB_DL>>1)+3)) && 
 		     (l==pss_symb))
 	      skip_half=2;
 	  }
@@ -3973,9 +4023,9 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF,
 	    rxF      = &rxdataF[aarx][prb_off2+ 
 				      (symbol*(frame_parms->ofdm_symbol_size))];
 	  }
-
-	  //          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);
-
+#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
           *pmi_loc = (pmi>>((prb>>2)<<1))&3;
           //    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,rb,rb>>2,*pmi_loc,pmi_loc,rxF,dl_ch0, dl_ch1, rxF_ext,dl_ch0_ext,dl_ch1_ext);
 
@@ -3987,6 +4037,10 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF,
 		memcpy(dl_ch0_ext,dl_ch0p,6*sizeof(int32_t));
 		memcpy(dl_ch1_ext,dl_ch1p,6*sizeof(int32_t));
 		memcpy(rxF_ext,rxF,6*sizeof(int32_t));
+#ifdef DEBUG_DLSCH_DEMOD
+		for (i=0;i<6;i++)
+		  printf("extract rb %d, re %d => (%d,%d)\n",prb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
+#endif
 		dl_ch0_ext+=6;
 		dl_ch1_ext+=6;
 		rxF_ext+=6;
@@ -3994,6 +4048,10 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF,
 		memcpy(dl_ch0_ext,dl_ch0p+6,6*sizeof(int32_t));
 		memcpy(dl_ch1_ext,dl_ch1p+6,6*sizeof(int32_t));
 		memcpy(rxF_ext,rxF+6,6*sizeof(int32_t));
+#ifdef DEBUG_DLSCH_DEMOD
+		for (i=0;i<6;i++)
+		  printf("extract rb %d, re %d => (%d,%d)\n",prb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
+#endif
 		dl_ch0_ext+=6;
 		dl_ch1_ext+=6;
 		rxF_ext+=6;
@@ -4001,8 +4059,10 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF,
 		memcpy(dl_ch0_ext,dl_ch0p,12*sizeof(int32_t));
 		memcpy(dl_ch1_ext,dl_ch1p,12*sizeof(int32_t));
 		memcpy(rxF_ext,rxF,12*sizeof(int32_t));
-		//		for (i=0;i<12;i++)
-		  //		  printf("extract rb %d, re %d => (%d,%d)\n",prb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
+#ifdef DEBUG_DLSCH_DEMOD
+		for (i=0;i<12;i++)
+		  printf("extract rb %d, re %d => (%d,%d)\n",prb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
+#endif
 		dl_ch0_ext+=12;
 		dl_ch1_ext+=12;
 		rxF_ext+=12;
@@ -4015,7 +4075,9 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF,
 		  if ((i!=frame_parms->nushift) &&
 		      (i!=((frame_parms->nushift+3)%6))) {
 		    rxF_ext[j]=rxF[i];
-		    //		    printf("(pilots,skip1)extract rb %d, re %d => (%d,%d)\n",prb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j]));
+#ifdef DEBUG_DLSCH_DEMOD
+		    printf("(pilots,skip1)extract rb %d, re %d (%d)=> (%d,%d)\n",prb,i,j,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j]));
+#endif
 		    dl_ch0_ext[j]=dl_ch0p[i];
 		    dl_ch1_ext[j++]=dl_ch1p[i];
 		  }
@@ -4028,15 +4090,17 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF,
 		  if ((i!=frame_parms->nushift) &&
 		      (i!=((frame_parms->nushift+3)%6))) {
 		    rxF_ext[j]=rxF[(i+6)];
-		    //		    printf("(pilots,skip2)extract rb %d, re %d => (%d,%d)\n",prb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j]));
+#ifdef DEBUG_DLSCH_DEMOD
+		    printf("(pilots,skip2)extract rb %d, re %d (%d) => (%d,%d)\n",prb,i,j,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j]));
+#endif
 		    dl_ch0_ext[j]=dl_ch0p[i+6];
 		    dl_ch1_ext[j++]=dl_ch1p[i+6];
 		  }
-		  
-		  dl_ch0_ext+=4;
-		  dl_ch1_ext+=4;
-		  rxF_ext+=4;
 		}
+		dl_ch0_ext+=4;
+		dl_ch1_ext+=4;
+		rxF_ext+=4;
+
 	      } else { //skip_half==0
 		for (i=0; i<12; i++) {
 		  if ((i!=frame_parms->nushift) &&
@@ -4044,7 +4108,9 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF,
 		      (i!=frame_parms->nushift+6) &&
 		      (i!=((frame_parms->nushift+9)%12))) {
 		    rxF_ext[j]=rxF[i];
-		    //		    printf("(pilots)extract rb %d, re %d => (%d,%d)\n",prb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j]));
+#ifdef DEBUG_DLSCH_DEMOD
+		    printf("(pilots)extract rb %d, re %d => (%d,%d)\n",prb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j]));
+#endif
 		    dl_ch0_ext[j]  =dl_ch0p[i];
 		    dl_ch1_ext[j++]=dl_ch1p[i];
 		  }
@@ -4060,10 +4126,11 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF,
 	      memcpy(dl_ch0_ext,dl_ch0p,6*sizeof(int32_t));
 	      memcpy(dl_ch1_ext,dl_ch1p,6*sizeof(int32_t));
 	      memcpy(rxF_ext,rxF,6*sizeof(int32_t));
-	      /*
+#ifdef DEBUG_DLSCH_DEMOD
 	      for (i=0; i<6; i++) {
 		printf("extract rb %d, re %d => (%d,%d)\n",prb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
-		}*/
+	      }
+#endif
 	      rxF_ext+=6;
 	      dl_ch0_ext+=6;
 	      dl_ch1_ext+=6;
@@ -4075,9 +4142,11 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF,
 	      memcpy(dl_ch0_ext,dl_ch0p,6*sizeof(int32_t));
 	      memcpy(dl_ch1_ext,dl_ch1p,6*sizeof(int32_t));
 	      memcpy(rxF_ext,rxF,6*sizeof(int32_t));	      
-	      /*for (i=0; i<6; i++) {
+#ifdef DEBUG_DLSCH_DEMOD
+	      for (i=0; i<6; i++) {
 		printf("extract rb %d, re %d => (%d,%d)\n",prb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
-		}*/
+	      }
+#endif
 	      rxF_ext+=6;
 	      dl_ch0_ext+=6;
 	      dl_ch1_ext+=6;
@@ -4090,7 +4159,9 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF,
 		  dl_ch0_ext[j]=dl_ch0p[i];
 		  dl_ch1_ext[j]=dl_ch1p[i];
 		  rxF_ext[j++]=rxF[i];
-		  //printf("(pilots)extract rb %d, re %d => (%d,%d)\n",prb,i,*(short *)&rxF[i],*(1+(short*)&rxF[i]));
+#ifdef DEBUG_DLSCH_DEMOD
+		  printf("(pilots)extract rb %d, re %d (%d) => (%d,%d)\n",prb,i,j,*(short *)&rxF[i],*(1+(short*)&rxF[i]));
+#endif
 		}
 	      }
 	      rxF       = &rxdataF[aarx][1+symbol*(frame_parms->ofdm_symbol_size)];
@@ -4100,8 +4171,10 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF,
 		    (i!=((frame_parms->nushift+9)%12))) {
 		  dl_ch0_ext[j]=dl_ch0p[i];
 		  dl_ch1_ext[j]=dl_ch1p[i];
-		  rxF_ext[j++]=rxF[(i-6)];
-		  //printf("(pilots)extract rb %d, re %d => (%d,%d)\n",prb,i,*(short *)&rxF[1+i-6],*(1+(short*)&rxF[1+i-6]));
+		  rxF_ext[j++]=rxF[i-6];	   
+#ifdef DEBUG_DLSCH_DEMOD
+		  printf("(pilots)extract rb %d, re %d (%d) => (%d,%d)\n",prb,i,j,*(short *)&rxF[1+i-6],*(1+(short*)&rxF[1+i-6]));
+#endif
 		}
 	      }
 	      
diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation.c b/openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation.c
index a65a9098288..a35f89b8518 100644
--- a/openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation.c
+++ b/openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation.c
@@ -672,6 +672,7 @@ int dlsch_qpsk_llr(LTE_DL_FRAME_PARMS *frame_parms,
   //  printf("dlsch_qpsk_llr: symbol %d,nb_rb %d, len %d,pbch_pss_sss_adjust %d\n",symbol,nb_rb,len,pbch_pss_sss_adjust);
   for (i=0; i<len; i++) {
     *llr32 = *rxF;
+    //    printf("llr %d : (%d,%d)\n",i,((int16_t*)llr32)[0],((int16_t*)llr32)[1]);
     rxF++;
     llr32++;
   }
-- 
GitLab