From 927e4fde792ce9fa1d0a685fbca5f594761ad2cc Mon Sep 17 00:00:00 2001
From: Parminder Singh <parminder.singh@iis.fraunhofer.de>
Date: Mon, 26 Oct 2020 10:23:52 +0100
Subject: [PATCH] DMRS Specific changes from fhg-dl-dmrs branch

---
 openair1/PHY/NR_REFSIG/dmrs_nr.c              |  4 +-
 openair1/PHY/NR_REFSIG/nr_gold_ue.c           | 18 ++---
 openair1/PHY/NR_REFSIG/refsig_defs_ue.h       |  4 +-
 openair1/PHY/NR_TRANSPORT/nr_dlsch.c          | 74 ++++++++++---------
 .../nr_dl_channel_estimation.c                |  4 +-
 .../NR_UE_TRANSPORT/nr_dlsch_demodulation.c   | 25 +++++--
 .../NR_UE_TRANSPORT/nr_transport_proto_ue.h   |  3 +-
 openair1/PHY/defs_nr_UE.h                     |  2 +-
 openair1/SCHED_NR_UE/phy_procedures_nr_ue.c   | 37 +++++-----
 9 files changed, 97 insertions(+), 74 deletions(-)

diff --git a/openair1/PHY/NR_REFSIG/dmrs_nr.c b/openair1/PHY/NR_REFSIG/dmrs_nr.c
index 415e6adfa2..7c143d243c 100644
--- a/openair1/PHY/NR_REFSIG/dmrs_nr.c
+++ b/openair1/PHY/NR_REFSIG/dmrs_nr.c
@@ -366,10 +366,12 @@ void generate_dmrs_pbch(uint32_t dmrs_pbch_bitmap[DMRS_PBCH_I_SSB][DMRS_PBCH_N_H
 int get_next_dmrs_symbol_in_slot(uint16_t  ul_dmrs_symb_pos, uint8_t counter, uint8_t end_symbol)
 {
   for(uint8_t symbol = counter; symbol < end_symbol; symbol++)
-    if((ul_dmrs_symb_pos >>symbol)&0x01 )
+  {
+    if((ul_dmrs_symb_pos >> symbol) & 0x01 )
     {
       return symbol;
     }
+  }
   return 0;
 }
 
diff --git a/openair1/PHY/NR_REFSIG/nr_gold_ue.c b/openair1/PHY/NR_REFSIG/nr_gold_ue.c
index 39ab13b1f1..414582a31d 100644
--- a/openair1/PHY/NR_REFSIG/nr_gold_ue.c
+++ b/openair1/PHY/NR_REFSIG/nr_gold_ue.c
@@ -107,9 +107,7 @@ void nr_gold_pdcch(PHY_VARS_NR_UE* ue,
 }
 
 void nr_gold_pdsch(PHY_VARS_NR_UE* ue,
-                   unsigned short lbar,
-                   unsigned short *n_idDMRS,
-                   unsigned short length_dmrs)
+                   unsigned short *n_idDMRS)
 {
   unsigned char ns,l;
   unsigned int n,x1,x2,x2tmp0;
@@ -129,12 +127,12 @@ void nr_gold_pdsch(PHY_VARS_NR_UE* ue,
 
     for (ns=0; ns<20; ns++) {
 
-      for (l=0; l<length_dmrs; l++) {
+      for (l=0; l<14; l++) {
 
-    	x2tmp0 = ((14*ns+(lbar+l)+1)*((nid<<1)+1))<<17;
+        x2tmp0 = ((14*ns+l+1)*((nid<<1)+1))<<17;
         x2 = (x2tmp0+(nid<<1)+nscid)%(1<<31);  //cinit
-	LOG_D(PHY,"UE DMRS slot %d, symb %d, lbar %d, x2 %x, nscid %d\n",ns,l,lbar,x2,nscid);
-                //printf("ns %d gold pdsch x2 %d\n",ns,x2);
+        LOG_D(PHY,"UE DMRS slot %d, symb %d, x2 %x, nscid %d\n",ns,l,x2,nscid);
+        //printf("ns %d gold pdsch x2 %d\n",ns,x2);
 
         x1 = 1+ (1<<31);
         x2=x2 ^ ((x2 ^ (x2>>1) ^ (x2>>2) ^ (x2>>3))<<31);
@@ -145,7 +143,7 @@ void nr_gold_pdsch(PHY_VARS_NR_UE* ue,
           x1 = x1 ^ (x1<<31) ^ (x1<<28);
           x2 = (x2>>1) ^ (x2>>2) ^ (x2>>3) ^ (x2>>4);
           x2 = x2 ^ (x2<<31) ^ (x2<<30) ^ (x2<<29) ^ (x2<<28);
-            //printf("x1 : %x, x2 : %x\n",x1,x2);
+          //printf("x1 : %x, x2 : %x\n",x1,x2);
         }
 
         for (n=0; n<NR_MAX_PDSCH_DMRS_INIT_LENGTH_DWORD; n++) {
@@ -154,8 +152,8 @@ void nr_gold_pdsch(PHY_VARS_NR_UE* ue,
           x2 = (x2>>1) ^ (x2>>2) ^ (x2>>3) ^ (x2>>4);
           x2 = x2 ^ (x2<<31) ^ (x2<<30) ^ (x2<<29) ^ (x2<<28);
           ue->nr_gold_pdsch[nscid][ns][l][n] = x1^x2;
-            // if ((ns==2)&&(l==0))
-            //printf("n=%d : c %x\n",n,x1^x2);
+          // if ((ns==2)&&(l==0))
+          //printf("n=%d : c %x\n",n,x1^x2);
         }
 
       }
diff --git a/openair1/PHY/NR_REFSIG/refsig_defs_ue.h b/openair1/PHY/NR_REFSIG/refsig_defs_ue.h
index 93a64051de..f349cfcd98 100644
--- a/openair1/PHY/NR_REFSIG/refsig_defs_ue.h
+++ b/openair1/PHY/NR_REFSIG/refsig_defs_ue.h
@@ -61,9 +61,7 @@ void nr_gold_pdcch(PHY_VARS_NR_UE* ue,
                    unsigned short length_dmrs);
 
 void nr_gold_pdsch(PHY_VARS_NR_UE* ue,
-                   unsigned short lbar,
-                   unsigned short *n_idDMRS,
-                   unsigned short length_dmrs);
+                   unsigned short *n_idDMRS);
 
 void nr_init_pusch_dmrs(PHY_VARS_NR_UE* ue,
                         uint16_t *N_n_scid,
diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c
index 4461edb33b..f724ab8596 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c
@@ -39,6 +39,8 @@
 
 //#define DEBUG_DLSCH
 //#define DEBUG_DLSCH_MAPPING
+// forward declarations for mac function to avoid semantic issues
+extern int get_num_dmrs(uint16_t dmrs_mask );
 
 void nr_pdsch_codeword_scrambling(uint8_t *in,
                                   uint32_t size,
@@ -118,7 +120,6 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
   int32_t** txdataF = gNB->common_vars.txdataF;
   int16_t amp = AMP;
   NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms;
-  int xOverhead = 0;
   time_stats_t *dlsch_encoding_stats=&gNB->dlsch_encoding_stats;
   time_stats_t *dlsch_scrambling_stats=&gNB->dlsch_scrambling_stats;
   time_stats_t *dlsch_modulation_stats=&gNB->dlsch_modulation_stats;
@@ -140,7 +141,7 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
     uint32_t scrambled_output[NR_MAX_NB_CODEWORDS][NR_MAX_PDSCH_ENCODED_LENGTH>>5];
     int16_t **mod_symbs = (int16_t**)dlsch->mod_symbs;
     int16_t **tx_layers = (int16_t**)dlsch->txdataF;
-    int8_t Wf[2], Wt[2], l0, l_prime[2], delta;
+    int8_t Wf[2], Wt[2], l_prime[2], delta;
     uint8_t dmrs_Type = rel15->dmrsConfigType;
     int nb_re_dmrs;
     uint16_t n_dmrs;
@@ -152,8 +153,12 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
       nb_re_dmrs = 4*rel15->numDmrsCdmGrpsNoData;
       n_dmrs = ((rel15->rbSize+rel15->rbStart)*4)<<1;
     }
+    
+    uint16_t dmrs_symbol_map = rel15->dlDmrsSymbPos;//single DMRS: 010000100 Double DMRS 110001100
+    uint8_t dmrs_len = get_num_dmrs(rel15->dlDmrsSymbPos);
+    
     uint16_t nb_re;
-    nb_re = ((12*rel15->NrOfSymbols)-nb_re_dmrs-xOverhead)*rel15->rbSize*rel15->NrOfCodewords;
+    nb_re = ((12*rel15->NrOfSymbols)-nb_re_dmrs-dmrs_len)*rel15->rbSize*rel15->NrOfCodewords;
     uint8_t Qm = rel15->qamModOrder[0];
     uint32_t encoded_length = nb_re*Qm;
     int16_t mod_dmrs[n_dmrs<<1] __attribute__ ((aligned(16)));
@@ -248,23 +253,7 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
     
     /// Antenna port mapping
     //to be moved to init phase potentially, for now tx_layers 1-8 are mapped on antenna ports 1000-1007
-    
-    /// DMRS QPSK modulation
-    
-    
-    l0 = get_l0(rel15->dlDmrsSymbPos);
-    nr_modulation(pdsch_dmrs[l0][0], n_dmrs, DMRS_MOD_ORDER, mod_dmrs); // currently only codeword 0 is modulated. Qm = 2 as DMRS is QPSK modulated
-    
-#ifdef DEBUG_DLSCH
-    printf("DMRS modulation (single symbol %d, %d symbols, type %d):\n", l0, n_dmrs>>1, dmrs_Type);
-    for (int i=0; i<n_dmrs>>4; i++) {
-      for (int j=0; j<8; j++) {
-	printf("%d %d\t", mod_dmrs[((i<<3)+j)<<1], mod_dmrs[(((i<<3)+j)<<1)+1]);
-      }
-      printf("\n");
-    }
-#endif
-    
+  
     
     /// Resource mapping
     
@@ -284,24 +273,43 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
       get_Wf(Wf, ap, dmrs_Type);
       delta = get_delta(ap, dmrs_Type);
       l_prime[0] = 0; // single symbol ap 0
-      uint8_t dmrs_symbol = l0+l_prime[0];
 #ifdef DEBUG_DLSCH_MAPPING
-      printf("DMRS Type %d params for ap %d: Wt %d %d \t Wf %d %d \t delta %d \t l_prime %d \t l0 %d\tDMRS symbol %d\n",
-	     1+dmrs_Type,ap, Wt[0], Wt[1], Wf[0], Wf[1], delta, l_prime[0], l0, dmrs_symbol);
+      printf("DMRS Type %d params for ap %d: Wt %d %d \t Wf %d %d \t delta %d \t l_prime %d \t \tDMRS symbol map 0x%x\n",
+             1+dmrs_Type,ap, Wt[0], Wt[1], Wf[0], Wf[1], delta, l_prime[0], dmrs_symbol_map);
 #endif
-      uint8_t k_prime=0;
-      uint16_t m=0, n=0, dmrs_idx=0, k=0;
       
-      int txdataF_offset = (slot%2)*frame_parms->samples_per_slot_wCP;
-      if (dmrs_Type == NFAPI_NR_DMRS_TYPE1) // another if condition to be included to check pdsch config type (reference of k)
-	dmrs_idx = rel15->rbStart*6;
-      else
-	dmrs_idx = rel15->rbStart*4;
+      uint16_t m=0, dmrs_idx=0, k=0;
       
+      int txdataF_offset = (slot%2)*frame_parms->samples_per_slot_wCP;
+
+      // Loop Over OFDM symbols:
       for (int l=rel15->StartSymbolIndex; l<rel15->StartSymbolIndex+rel15->NrOfSymbols; l++) {
-	k = start_sc;
+        /// DMRS QPSK modulation
+        uint8_t k_prime=0;
+        uint16_t n=0;
+        if ((dmrs_symbol_map & (1 << l))){ //DMRS time occasion
+          if (dmrs_Type == NFAPI_NR_DMRS_TYPE1) // another if condition to be included to check pdsch config type (reference of k)
+            dmrs_idx = rel15->rbStart*6;
+          else
+            dmrs_idx = rel15->rbStart*4;
+          nr_modulation(pdsch_dmrs[l][0], n_dmrs, DMRS_MOD_ORDER, mod_dmrs); // currently only codeword 0 is modulated. Qm = 2 as DMRS is QPSK modulated
+        }
+
+#ifdef DEBUG_DLSCH
+        printf("DMRS modulation (symbol %d, %d symbols, type %d):\n", l, n_dmrs>>1, dmrs_Type);
+        for (int i=0; i<n_dmrs>>4; i++) {
+          for (int j=0; j<8; j++) {
+            printf("%d %d\t", mod_dmrs[((i<<3)+j)<<1], mod_dmrs[(((i<<3)+j)<<1)+1]);
+          }
+          printf("\n");
+        }
+#endif
+        //FixMe l_prime should be updated here in the case of double DMRS config
+	
+        k = start_sc;
+        // Loop Over SCs:
 	for (int i=0; i<rel15->rbSize*NR_NB_SC_PER_RB; i++) {
-	  if ((l == dmrs_symbol) && (k == ((start_sc+get_dmrs_freq_idx(n, k_prime, delta, dmrs_Type))%(frame_parms->ofdm_symbol_size)))) {
+	  if ( ( dmrs_symbol_map & (1 << l) ) && (k == ((start_sc+get_dmrs_freq_idx(n, k_prime, delta, dmrs_Type))%(frame_parms->ofdm_symbol_size)))) {
 	    ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)] = (Wt[l_prime[0]]*Wf[k_prime]*amp*mod_dmrs[dmrs_idx<<1]) >> 15;
 	    ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)] = (Wt[l_prime[0]]*Wf[k_prime]*amp*mod_dmrs[(dmrs_idx<<1) + 1]) >> 15;
 #ifdef DEBUG_DLSCH_MAPPING
@@ -316,7 +324,7 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
 	  }
 	  
 	  else {
-	    if( (l != dmrs_symbol) || allowed_xlsch_re_in_dmrs_symbol(k,start_sc,rel15->numDmrsCdmGrpsNoData,dmrs_Type)) {
+	    if( (!(dmrs_symbol_map & (1 << l))) || allowed_xlsch_re_in_dmrs_symbol(k,start_sc,rel15->numDmrsCdmGrpsNoData,dmrs_Type)) {
 	      ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)] = (amp * tx_layers[ap][m<<1]) >> 15;
 	      ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)] = (amp * tx_layers[ap][(m<<1) + 1]) >> 15;
 #ifdef DEBUG_DLSCH_MAPPING
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 71a5771f5b..fac8b9dede 100644
--- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
+++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
@@ -665,7 +665,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
   nushift = (p>>1)&1;
   ue->frame_parms.nushift = nushift;
 
-  if (ue->high_speed_flag == 0) // use second channel estimate position for temporary storage
+  if (ue->high_speed_flag == 0)
     ch_offset     = ue->frame_parms.ofdm_symbol_size ;
   else
     ch_offset     = ue->frame_parms.ofdm_symbol_size*symbol;
@@ -717,7 +717,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
   // generate pilot
   uint16_t rb_offset = (bwp_start_subcarrier - ue->frame_parms.first_carrier_offset) / 12;
   int config_type = 0; // needs to be updated from higher layer
-  nr_pdsch_dmrs_rx(ue,Ns,ue->nr_gold_pdsch[eNB_offset][Ns][0], &pilot[0],1000,0,nb_rb_pdsch+rb_offset);
+  nr_pdsch_dmrs_rx(ue,Ns,ue->nr_gold_pdsch[eNB_offset][Ns][symbol], &pilot[0],1000,0,nb_rb_pdsch+rb_offset);
 
   for (aarx=0; aarx<ue->frame_parms.nb_antennas_rx; aarx++) {
 
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
index e8204ad0b5..8562e7b76c 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
@@ -377,7 +377,8 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
 					nb_rb_pdsch,
 					nr_tti_rx,
 					ue->high_speed_flag,
-					frame_parms);
+                                        frame_parms,
+                                        dlsch0_harq->dlDmrsSymbPos);
   
   } /*else if(beamforming_mode>7) {
     LOG_W(PHY,"dlsch_demodulation: beamforming mode not supported yet.\n");
@@ -2355,7 +2356,8 @@ unsigned short nr_dlsch_extract_rbs_single(int **rxdataF,
 					   unsigned short nb_rb_pdsch,
 					   unsigned char nr_tti_rx,
 					   uint32_t high_speed_flag,
-					   NR_DL_FRAME_PARMS *frame_parms) {
+                                           NR_DL_FRAME_PARMS *frame_parms,
+                                           uint16_t dlDmrsSymbPos) {
 
 
 
@@ -2363,7 +2365,9 @@ unsigned short nr_dlsch_extract_rbs_single(int **rxdataF,
   unsigned char i,aarx; //,nsymb,sss_symb,pss_symb=0,l;
   int *dl_ch0,*dl_ch0_ext,*rxF,*rxF_ext;
 
-
+  uint8_t ClosestDMRSIdx = 15; //closest DMRS index to the current OFDM symbol
+  uint8_t ClosestDMRSdist = 15; //temporarily save the distance to the closest DMRS symbol
+  int8_t DMRSdist = 15; //temporarily save the distance to the DMRS symbol 
 
   unsigned char j=0;
 
@@ -2374,8 +2378,19 @@ unsigned short nr_dlsch_extract_rbs_single(int **rxdataF,
 
     k = frame_parms->first_carrier_offset + NR_NB_SC_PER_RB*start_rb;
 
-    if (high_speed_flag == 1)
-      dl_ch0     = &dl_ch_estimates[aarx][(2*(frame_parms->ofdm_symbol_size))];
+    if (high_speed_flag == 1) {
+      for (int i=0; i<16; i++) { //loop over all possible DMRS symbols
+        if ( (1<<i & dlDmrsSymbPos) > 0 ) {
+          DMRSdist = symbol-i;
+          DMRSdist = DMRSdist>=0 ? DMRSdist : -DMRSdist;
+          if ( DMRSdist < ClosestDMRSdist ) {
+            ClosestDMRSIdx = i;
+            ClosestDMRSdist = DMRSdist;
+          }
+        } 
+      }
+      dl_ch0     = &dl_ch_estimates[aarx][(ClosestDMRSIdx*(frame_parms->ofdm_symbol_size))]; //use closest DMRS
+    }
     else
       dl_ch0     = &dl_ch_estimates[aarx][0];
 
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
index 845eace8b6..96ca766e68 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
@@ -719,7 +719,8 @@ unsigned short nr_dlsch_extract_rbs_single(int **rxdataF,
 										unsigned short nb_pdsch_rb,
                                         unsigned char nr_tti_rx,
                                         uint32_t high_speed_flag,
-                                        NR_DL_FRAME_PARMS *frame_parms);
+                                        NR_DL_FRAME_PARMS *frame_parms,
+                                        uint16_t dlDmrsSymbPos);
 
 /** \fn dlsch_extract_rbs_dual(int32_t **rxdataF,
     int32_t **dl_ch_estimates,
diff --git a/openair1/PHY/defs_nr_UE.h b/openair1/PHY/defs_nr_UE.h
index fff6a82047..4df8404994 100644
--- a/openair1/PHY/defs_nr_UE.h
+++ b/openair1/PHY/defs_nr_UE.h
@@ -892,7 +892,7 @@ typedef struct {
   uint32_t nr_gold_pbch[2][64][NR_PBCH_DMRS_LENGTH_DWORD];
 
   /// PDSCH DMRS
-  uint32_t nr_gold_pdsch[2][20][2][NR_MAX_PDSCH_DMRS_INIT_LENGTH_DWORD];
+  uint32_t nr_gold_pdsch[2][20][14][NR_MAX_PDSCH_DMRS_INIT_LENGTH_DWORD];
 
   /// PDCCH DMRS
   uint32_t nr_gold_pdcch[7][20][3][52];
diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
index d24c88fd1f..19a8c59e2c 100644
--- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
+++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
@@ -724,17 +724,18 @@ int nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, int eNB_
     LOG_D(PHY,"[UE %d] PDSCH type %d active in nr_tti_rx %d, harq_pid %d (%d), rb_start %d, nb_rb %d, symbol_start %d, nb_symbols %d, DMRS mask %x\n",ue->Mod_id,pdsch,nr_tti_rx,harq_pid,dlsch0->harq_processes[harq_pid]->status,pdsch_start_rb,pdsch_nb_rb,s0,s1,dlsch0->harq_processes[harq_pid]->dlDmrsSymbPos);
 
     // do channel estimation for first DMRS only
-    for (m = s0; m < 3; m++) {
+    for (m = s0; m < (s0 +s1); m++) {
       if (((1<<m)&dlsch0->harq_processes[harq_pid]->dlDmrsSymbPos) > 0) {
-	nr_pdsch_channel_estimation(ue,
-				    0 /*eNB_id*/,
-				    nr_tti_rx,
-				    0 /*p*/,
-				    m,
-				    ue->frame_parms.first_carrier_offset+(BWPStart + pdsch_start_rb)*12,
-				    pdsch_nb_rb);
-	LOG_D(PHY,"Channel Estimation in symbol %d\n",m);
-	break;
+        nr_pdsch_channel_estimation(ue,
+                                    0 /*eNB_id*/,
+                                    nr_tti_rx,
+                                    0 /*p*/,
+                                    m,
+                                    ue->frame_parms.first_carrier_offset+(BWPStart + pdsch_start_rb)*12,
+                                    pdsch_nb_rb);
+        LOG_D(PHY,"Channel Estimation in symbol %d\n",m);
+        if ( ue->high_speed_flag == 0 ) //for slow speed case only estimate the channel once per slot
+          break;
       }
     }
     for (m = s0; m < (s1 + s0); m++) {
@@ -902,7 +903,7 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
   uint8_t is_cw0_active = 0;
   uint8_t is_cw1_active = 0;
   uint8_t dmrs_type, nb_re_dmrs;
-  uint16_t length_dmrs = 1; 
+  uint16_t dmrs_len = get_num_dmrs(dlsch0->harq_processes[dlsch0->current_harq_pid]->dlDmrsSymbPos);
   uint16_t nb_symb_sch = 9;
   nr_downlink_indication_t dl_indication;
   fapi_nr_rx_indication_t rx_ind;
@@ -991,7 +992,7 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
     dlsch0->harq_processes[harq_pid]->G = nr_get_G(dlsch0->harq_processes[harq_pid]->nb_rb,
                                                    nb_symb_sch,
                                                    nb_re_dmrs,
-                                                   length_dmrs,
+                                                   dmrs_len,
                                                    dlsch0->harq_processes[harq_pid]->Qm,
                                                    dlsch0->harq_processes[harq_pid]->Nl);
 #if UE_TIMING_TRACE
@@ -1072,11 +1073,11 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
       if(is_cw1_active)
       {
           // start ldpc decode for CW 1
-          dlsch1->harq_processes[harq_pid]->G = nr_get_G(dlsch1->harq_processes[harq_pid]->nb_rb,
-							 nb_symb_sch,
-							 nb_re_dmrs,
-							 length_dmrs,
-							 dlsch1->harq_processes[harq_pid]->Qm,
+        dlsch1->harq_processes[harq_pid]->G = nr_get_G(dlsch1->harq_processes[harq_pid]->nb_rb,
+                                                       nb_symb_sch,
+                                                       nb_re_dmrs,
+                                                       dmrs_len,
+                                                       dlsch1->harq_processes[harq_pid]->Qm,
 							 dlsch1->harq_processes[harq_pid]->Nl);
 #if UE_TIMING_TRACE
           start_meas(&ue->dlsch_unscrambling_stats);
@@ -1764,7 +1765,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
       for (int i=0;i<4;i++) if (((1<<i)&dlsch0_harq->dlDmrsSymbPos) > 0) {symb_dmrs=i;break;}
       AssertFatal(symb_dmrs>=0,"no dmrs in 0..3\n");
       LOG_D(PHY,"Initializing dmrs for symb %d DMRS mask %x\n",symb_dmrs,dlsch0_harq->dlDmrsSymbPos);
-      nr_gold_pdsch(ue,symb_dmrs,0, 1);
+      nr_gold_pdsch(ue,0);
     
       for (uint16_t m=start_symb_sch;m<(nb_symb_sch+start_symb_sch) ; m++){
         nr_slot_fep(ue,
-- 
2.26.2