From 62c42f4e5336767deb35e80b2946966a1978316d Mon Sep 17 00:00:00 2001
From: Rakesh <rakeshmundlamur@iisc.ac.in>
Date: Wed, 19 Jun 2019 18:14:11 +0530
Subject: [PATCH] Fix for dmrs and data extraction for using threequarter
 sampling rate

---
 .../nr_dl_channel_estimation.c                | 77 +++++++++++++------
 openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c        | 10 ++-
 2 files changed, 59 insertions(+), 28 deletions(-)

diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
index 1728d93b69..6df9e0c20e 100644
--- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
+++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
@@ -98,7 +98,8 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue,
 #endif
 
     pil+=2;
-    re_offset = (re_offset+4)&(ue->frame_parms.ofdm_symbol_size-1);
+    //re_offset = (re_offset+4)&(ue->frame_parms.ofdm_symbol_size-1);
+    re_offset = (re_offset >= ue->frame_parms.ofdm_symbol_size) ? (re_offset - ue->frame_parms.ofdm_symbol_size + 4) : (re_offset+4);
     rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)];
 
 
@@ -113,7 +114,8 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue,
 #endif
 
     pil+=2;
-    re_offset = (re_offset+4)&(ue->frame_parms.ofdm_symbol_size-1);
+    //re_offset = (re_offset+4)&(ue->frame_parms.ofdm_symbol_size-1);
+    re_offset = (re_offset >= ue->frame_parms.ofdm_symbol_size) ? (re_offset - ue->frame_parms.ofdm_symbol_size + 4) : (re_offset+4);
     rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)];
 
     current_ssb->c_re +=ch[0];
@@ -124,7 +126,8 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue,
 #endif
 
     pil+=2;
-    re_offset = (re_offset+4)&(ue->frame_parms.ofdm_symbol_size-1);
+    //re_offset = (re_offset+4)&(ue->frame_parms.ofdm_symbol_size-1);
+    re_offset = (re_offset >= ue->frame_parms.ofdm_symbol_size) ? (re_offset - ue->frame_parms.ofdm_symbol_size + 4) : (re_offset+4);
     rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)];
 
     for (pilot_cnt=3; pilot_cnt<(3*20); pilot_cnt+=3) {
@@ -135,7 +138,8 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue,
       // in 2nd symbol, skip middle  REs (48 with DMRS,  144 for SSS, and another 48 with DMRS) 
       if (dmrss == 1 && pilot_cnt == 12) {
 	pilot_cnt=48;
-	re_offset = (re_offset+144)&(ue->frame_parms.ofdm_symbol_size-1);
+	//re_offset = (re_offset+144)&(ue->frame_parms.ofdm_symbol_size-1);
+        re_offset = (re_offset >= ue->frame_parms.ofdm_symbol_size) ? (re_offset - ue->frame_parms.ofdm_symbol_size + 144) : (re_offset+144);
 	rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)];
       }
       ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
@@ -149,7 +153,8 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue,
 #endif
 
       pil+=2;
-      re_offset = (re_offset+4)&(ue->frame_parms.ofdm_symbol_size-1);
+      //re_offset = (re_offset+4)&(ue->frame_parms.ofdm_symbol_size-1);
+      re_offset = (re_offset >= ue->frame_parms.ofdm_symbol_size) ? (re_offset - ue->frame_parms.ofdm_symbol_size + 4) : (re_offset+4);
       rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)];
         
   
@@ -163,7 +168,8 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue,
       printf("pilot %d : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt+1,rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]);
 #endif
       pil+=2;
-      re_offset = (re_offset+4)&(ue->frame_parms.ofdm_symbol_size-1);
+      //re_offset = (re_offset+4)&(ue->frame_parms.ofdm_symbol_size-1);
+      re_offset = (re_offset >= ue->frame_parms.ofdm_symbol_size) ? (re_offset - ue->frame_parms.ofdm_symbol_size + 4) : (re_offset+4);
       rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)];
         
 
@@ -178,7 +184,8 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue,
 #endif
 
       pil+=2;
-      re_offset = (re_offset+4)&(ue->frame_parms.ofdm_symbol_size-1);
+      //re_offset = (re_offset+4)&(ue->frame_parms.ofdm_symbol_size-1);
+      re_offset = (re_offset >= ue->frame_parms.ofdm_symbol_size) ? (re_offset - ue->frame_parms.ofdm_symbol_size + 4) : (re_offset+4);
       rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)];
 
     }
@@ -303,7 +310,8 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
 				       dl_ch,
 				       16);
     pil+=2;
-    re_offset = (re_offset+4)&(ue->frame_parms.ofdm_symbol_size-1);
+    //re_offset = (re_offset+4)&(ue->frame_parms.ofdm_symbol_size-1);
+    re_offset = (re_offset >= ue->frame_parms.ofdm_symbol_size) ? (re_offset - ue->frame_parms.ofdm_symbol_size + 4) : (re_offset+4);
     rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)];
 
     //for (int i= 0; i<8; i++)
@@ -321,7 +329,8 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
 				       dl_ch,
 				       16);
     pil+=2;
-    re_offset = (re_offset+4)&(ue->frame_parms.ofdm_symbol_size-1);
+    //re_offset = (re_offset+4)&(ue->frame_parms.ofdm_symbol_size-1);
+    re_offset = (re_offset >= ue->frame_parms.ofdm_symbol_size) ? (re_offset - ue->frame_parms.ofdm_symbol_size + 4) : (re_offset+4);
     rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)];
 
     ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
@@ -336,7 +345,8 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
 				       dl_ch,
 				       16);
     pil+=2;
-    re_offset = (re_offset+4)&(ue->frame_parms.ofdm_symbol_size-1);
+    //re_offset = (re_offset+4)&(ue->frame_parms.ofdm_symbol_size-1);
+    re_offset = (re_offset >= ue->frame_parms.ofdm_symbol_size) ? (re_offset - ue->frame_parms.ofdm_symbol_size + 4) : (re_offset+4);
     rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)];
     dl_ch+=24;
 
@@ -348,7 +358,8 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
       // in 2nd symbol, skip middle  REs (48 with DMRS,  144 for SSS, and another 48 with DMRS) 
       if (dmrss == 1 && pilot_cnt == 12) {
 	pilot_cnt=48;
-	re_offset = (re_offset+144)&(ue->frame_parms.ofdm_symbol_size-1);
+	//re_offset = (re_offset+144)&(ue->frame_parms.ofdm_symbol_size-1);
+        re_offset = (re_offset >= ue->frame_parms.ofdm_symbol_size) ? (re_offset - ue->frame_parms.ofdm_symbol_size + 144) : (re_offset+144);
 	rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)];
 	dl_ch += 288;
       }
@@ -367,7 +378,8 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
       //            printf("pilot_cnt %d dl_ch %d %d\n", pilot_cnt, dl_ch+i, *(dl_ch+i));
 
       pil+=2;
-      re_offset = (re_offset+4)&(ue->frame_parms.ofdm_symbol_size-1);
+      //re_offset = (re_offset+4)&(ue->frame_parms.ofdm_symbol_size-1);
+      re_offset = (re_offset >= ue->frame_parms.ofdm_symbol_size) ? (re_offset - ue->frame_parms.ofdm_symbol_size + 4) : (re_offset+4);
       rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)];
         
   
@@ -382,7 +394,8 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
 					 dl_ch,
 					 16);
       pil+=2;
-      re_offset = (re_offset+4)&(ue->frame_parms.ofdm_symbol_size-1);
+      //re_offset = (re_offset+4)&(ue->frame_parms.ofdm_symbol_size-1);
+      re_offset = (re_offset >= ue->frame_parms.ofdm_symbol_size) ? (re_offset - ue->frame_parms.ofdm_symbol_size + 4) : (re_offset+4);
       rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)];
         
 
@@ -398,7 +411,8 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
 					 dl_ch,
 					 16);
       pil+=2;
-      re_offset = (re_offset+4)&(ue->frame_parms.ofdm_symbol_size-1);
+      //re_offset = (re_offset+4)&(ue->frame_parms.ofdm_symbol_size-1);
+      re_offset = (re_offset >= ue->frame_parms.ofdm_symbol_size) ? (re_offset - ue->frame_parms.ofdm_symbol_size + 4) : (re_offset+4);
       rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)];
       dl_ch+=24;
 
@@ -611,9 +625,17 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue,
     idft = idft2048;
     break;
 
-  default:
-    idft = idft512;
+  case 3072:
+    idft = idft3072;
+    break;
+
+  case 4096:
+    idft = idft4096;
     break;
+
+  default:
+    printf("unsupported ofdm symbol size \n");
+    assert(0);
   }
 
   if( (Ns== 1) && (symbol == 0))
@@ -623,7 +645,7 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue,
           for (p=0; p<ue->frame_parms.nb_antenna_ports_eNB; p++) {
               if (ue->pdcch_vars[ue->current_thread_id[Ns]][eNB_offset]->dl_ch_estimates[(p<<1)+aarx])
               {
-		LOG_D(PHY,"Channel Impulse Computation Slot %d ThreadId %d Symbol %d \n", Ns, ue->current_thread_id[Ns], symbol);
+		LOG_I(PHY,"Channel Impulse Computation Slot %d ThreadId %d Symbol %d \n", Ns, ue->current_thread_id[Ns], symbol);
 		idft((int16_t*) &ue->pdcch_vars[ue->current_thread_id[Ns]][eNB_offset]->dl_ch_estimates[(p<<1)+aarx][0],
 		     (int16_t*) ue->pdcch_vars[ue->current_thread_id[Ns]][eNB_offset]->dl_ch_estimates_time[(p<<1)+aarx],1);
               }
@@ -734,7 +756,8 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
                                          dl_ch,
                                          8);
       pil+=2;
-      re_offset = (re_offset+2)&(ue->frame_parms.ofdm_symbol_size-1);
+      //re_offset = (re_offset+2)&(ue->frame_parms.ofdm_symbol_size-1);
+      re_offset = (re_offset >= ue->frame_parms.ofdm_symbol_size) ? (re_offset - ue->frame_parms.ofdm_symbol_size + 2) : (re_offset+2);
       rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
       //for (int i= 0; i<8; i++)
       //printf("dl_ch addr %p %d\n", dl_ch+i, *(dl_ch+i));
@@ -749,7 +772,8 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
                                          dl_ch,
                                          8);
       pil+=2;
-      re_offset = (re_offset+2)&(ue->frame_parms.ofdm_symbol_size-1);
+      //re_offset = (re_offset+2)&(ue->frame_parms.ofdm_symbol_size-1);
+      re_offset = (re_offset >= ue->frame_parms.ofdm_symbol_size) ? (re_offset - ue->frame_parms.ofdm_symbol_size + 2) : (re_offset+2);
       rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
       //printf("dl_ch addr %p\n",dl_ch);
       
@@ -767,7 +791,8 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
       //printf("dl_ch addr %p %d\n", dl_ch+i, *(dl_ch+i));
       
       pil+=2;
-      re_offset = (re_offset+2)&(ue->frame_parms.ofdm_symbol_size-1);
+      //re_offset = (re_offset+2)&(ue->frame_parms.ofdm_symbol_size-1);
+      re_offset = (re_offset >= ue->frame_parms.ofdm_symbol_size) ? (re_offset - ue->frame_parms.ofdm_symbol_size + 2) : (re_offset+2);
       rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
       dl_ch+=8;
 
@@ -787,7 +812,8 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
                                            8);
 
         pil+=2;
-        re_offset = (re_offset+2)&(ue->frame_parms.ofdm_symbol_size-1);
+        //re_offset = (re_offset+2)&(ue->frame_parms.ofdm_symbol_size-1);
+        re_offset = (re_offset >= ue->frame_parms.ofdm_symbol_size) ? (re_offset - ue->frame_parms.ofdm_symbol_size + 2) : (re_offset+2);
         rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
       
         ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
@@ -800,7 +826,8 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
                                            dl_ch,
                                            8);
         pil+=2;
-        re_offset = (re_offset+2)&(ue->frame_parms.ofdm_symbol_size-1);
+        //re_offset = (re_offset+2)&(ue->frame_parms.ofdm_symbol_size-1);
+        re_offset = (re_offset >= ue->frame_parms.ofdm_symbol_size) ? (re_offset - ue->frame_parms.ofdm_symbol_size + 2) : (re_offset+2);
         rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
         dl_ch+=8;
 
@@ -821,7 +848,8 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
       //printf("dl_ch addr %p %d\n", dl_ch+i, *(dl_ch+i));
 
       pil+=2;
-      re_offset = (re_offset+2)&(ue->frame_parms.ofdm_symbol_size-1);
+      //re_offset = (re_offset+2)&(ue->frame_parms.ofdm_symbol_size-1);
+      re_offset = (re_offset >= ue->frame_parms.ofdm_symbol_size) ? (re_offset - ue->frame_parms.ofdm_symbol_size + 2) : (re_offset+2);
       rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
              
       ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
@@ -836,7 +864,8 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
                                          8);
                                          
       pil+=2;
-      re_offset = (re_offset+2)&(ue->frame_parms.ofdm_symbol_size-1);
+      //re_offset = (re_offset+2)&(ue->frame_parms.ofdm_symbol_size-1);
+      re_offset = (re_offset >= ue->frame_parms.ofdm_symbol_size) ? (re_offset - ue->frame_parms.ofdm_symbol_size + 2) : (re_offset+2);
       rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
       dl_ch+=8;
       
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c b/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c
index 641b27b081..cac9ae92ac 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c
@@ -103,8 +103,9 @@ uint16_t nr_pbch_extract(int **rxdataF,
             j++;
           }
 
-          rx_offset=(rx_offset+1)&(frame_parms->ofdm_symbol_size-1);
-        }
+          //rx_offset=(rx_offset+1)&(frame_parms->ofdm_symbol_size-1);
+          rx_offset = (rx_offset >= frame_parms->ofdm_symbol_size) ? (rx_offset - frame_parms->ofdm_symbol_size + 1) : (rx_offset+1);
+	}
 
         rxF_ext+=9;
       } else { //symbol 2
@@ -125,11 +126,12 @@ uint16_t nr_pbch_extract(int **rxdataF,
               j++;
             }
 
-            rx_offset=(rx_offset+1)&(frame_parms->ofdm_symbol_size-1);
+            //rx_offset=(rx_offset+1)&(frame_parms->ofdm_symbol_size-1);
+            rx_offset = (rx_offset >= frame_parms->ofdm_symbol_size) ? (rx_offset - frame_parms->ofdm_symbol_size + 1) : (rx_offset+1);
           }
 
           rxF_ext+=9;
-        } else rx_offset = (rx_offset+12)&(frame_parms->ofdm_symbol_size-1);
+        } else rx_offset = (rx_offset >= frame_parms->ofdm_symbol_size) ? (rx_offset - frame_parms->ofdm_symbol_size + 12) : (rx_offset+12);//rx_offset = (rx_offset+12)&(frame_parms->ofdm_symbol_size-1);
       }
     }
 
-- 
2.26.2