diff --git a/openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c b/openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c
index 9750656a4fe736590b56add4a60625c6e54e0dcc..086e0811a5d1d0c8ac3564456238bf1855496435 100644
--- a/openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c
+++ b/openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c
@@ -3738,8 +3738,8 @@ void dlsch_channel_level(int **dl_ch_estimates_ext,
       for (rb=0;rb<nb_rb;rb++) {
 
         //printf("rb %d : ",rb);
-        avg128D = _mm_add_epi32(avg128D,_mm_srai_epi16(_mm_madd_epi16(dl_ch128[0],dl_ch128[0]),x));
-        avg128D = _mm_add_epi32(avg128D,_mm_srai_epi16(_mm_madd_epi16(dl_ch128[1],dl_ch128[1]),x));
+        avg128D = _mm_add_epi32(avg128D,_mm_srai_epi32(_mm_madd_epi16(dl_ch128[0],dl_ch128[0]),x));
+        avg128D = _mm_add_epi32(avg128D,_mm_srai_epi32(_mm_madd_epi16(dl_ch128[1],dl_ch128[1]),x));
 
         //avg128D = _mm_add_epi32(avg128D,_mm_madd_epi16(dl_ch128[0],_mm_srai_epi16(_mm_mulhi_epi16(dl_ch128[0], coeff128),15)));
         //avg128D = _mm_add_epi32(avg128D,_mm_madd_epi16(dl_ch128[1],_mm_srai_epi16(_mm_mulhi_epi16(dl_ch128[1], coeff128),15)));
@@ -3748,7 +3748,7 @@ void dlsch_channel_level(int **dl_ch_estimates_ext,
           dl_ch128+=2;
         }
         else {
-           avg128D = _mm_add_epi32(avg128D,_mm_srai_epi16(_mm_madd_epi16(dl_ch128[2],dl_ch128[2]),x));
+           avg128D = _mm_add_epi32(avg128D,_mm_srai_epi32(_mm_madd_epi16(dl_ch128[2],dl_ch128[2]),x));
           //avg128D = _mm_add_epi32(avg128D,_mm_madd_epi16(dl_ch128[2],_mm_srai_epi16(_mm_mulhi_epi16(dl_ch128[2], coeff128),15)));
           dl_ch128+=3;
         }
@@ -3863,8 +3863,8 @@ void dlsch_channel_level_core(int **dl_ch_estimates_ext,
         length2 = length>>3;
 
         for (ii=0;ii<length2;ii++) {
-          avg128D = _mm_add_epi32(avg128D,_mm_srai_epi16(_mm_madd_epi16(dl_ch128[0],dl_ch128[0]),x));
-          avg128D = _mm_add_epi32(avg128D,_mm_srai_epi16(_mm_madd_epi16(dl_ch128[1],dl_ch128[1]),x));
+          avg128D = _mm_add_epi32(avg128D,_mm_srai_epi32(_mm_madd_epi16(dl_ch128[0],dl_ch128[0]),x));
+          avg128D = _mm_add_epi32(avg128D,_mm_srai_epi32(_mm_madd_epi16(dl_ch128[1],dl_ch128[1]),x));
 
           dl_ch128+=2;
         }
@@ -3938,6 +3938,112 @@ void dlsch_channel_level_core(int **dl_ch_estimates_ext,
 
 }
 
+void dlsch_channel_level_median(int **dl_ch_estimates_ext,
+                                int32_t *median,
+                                int n_tx,
+                                int n_rx,
+                                int length,
+                                int start_point)
+{
+
+#if defined(__x86_64__)||defined(__i386__)
+
+  short ii;
+  int aatx,aarx;
+  int length_mod4;
+  int length2;
+  int max = 0, min=0;
+  int norm_pack;
+  __m128i *dl_ch128, norm128D;
+
+  int16_t x = factor2(length);
+  int16_t y = (length)>>x;
+
+  for (aatx=0; aatx<n_tx; aatx++){
+    for (aarx=0; aarx<n_rx; aarx++) {
+      max = 0;
+      min = 0;
+      norm128D = _mm_setzero_si128();
+
+      dl_ch128=(__m128i *)&dl_ch_estimates_ext[aatx*n_rx + aarx][start_point];
+
+      length_mod4=length&3;
+
+      length2 = length>>2;
+
+      for (ii=0;ii<length2;ii++) {
+        norm128D = _mm_srai_epi32( _mm_madd_epi16(dl_ch128[0],dl_ch128[0]), 1);
+          //print_ints("norm128D",&norm128D[0]);
+
+        norm_pack = ((int32_t*)&norm128D)[0] +
+                    ((int32_t*)&norm128D)[1] +
+                    ((int32_t*)&norm128D)[2] +
+                    ((int32_t*)&norm128D)[3];
+
+        if (ii<1){
+          print_ints("norm128D",&norm128D[0]);
+          printf("norm_pack[%d] %d\n", aatx*n_rx + aarx, norm_pack);
+        }
+
+        if (norm_pack > max)
+          max = norm_pack;
+        if (norm_pack < min)
+          min = norm_pack;
+
+          dl_ch128+=1;
+      }
+
+        median[aatx*n_rx + aarx]  = (max+min)>>1;
+
+     // printf("Channel level  median [%d]: %d\n",aatx*n_rx + aarx, median[aatx*n_rx + aarx]);
+      }
+    }
+
+  _mm_empty();
+  _m_empty();
+
+#elif defined(__arm__)
+
+  short rb;
+  unsigned char aatx,aarx,nre=12,symbol_mod;
+  int32x4_t norm128D;
+  int16x4_t *dl_ch128;
+
+  for (aatx=0; aatx<frame_parms->nb_antenna_ports_eNB; aatx++){
+    for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
+      max = 0;
+      min = 0;
+      norm128D = vdupq_n_s32(0);
+
+      dl_ch128=(int16x4_t *)&dl_ch_estimates_ext[aatx*n_rx + aarx][start_point];
+
+      length_mod8=length&3;
+      length2 = length>>2;
+
+      for (ii=0;ii<length2;ii++) {
+        norm128D = vshrq_n_u32(vmull_s16(dl_ch128[0],dl_ch128[0]), 1);
+        norm_pack = ((int32_t*)&norm128D)[0] +
+                    ((int32_t*)&norm128D)[1] +
+                    ((int32_t*)&norm128D)[2] +
+                    ((int32_t*)&norm128D)[3];
+
+        if (norm_pack > max)
+          max = norm_pack;
+        if (norm_pack < min)
+          min = norm_pack;
+
+          dl_ch128+=1;
+      }
+
+        median[aatx*n_rx + aarx]  = (max+min)>>1;
+
+      //printf("Channel level  median [%d]: %d\n",aatx*n_rx + aarx, median[aatx*n_rx + aarx]);
+      }
+    }
+#endif
+
+}
+
 void mmse_processing_oai(LTE_UE_PDSCH *pdsch_vars,
                      LTE_DL_FRAME_PARMS *frame_parms,
                      PHY_MEASUREMENTS *measurements,
diff --git a/openair1/PHY/LTE_UE_TRANSPORT/transport_proto_ue.h b/openair1/PHY/LTE_UE_TRANSPORT/transport_proto_ue.h
index 814816a8852797713b44f89a6193f32fbf863d7a..49b9e8b808b5fd0db93c0e0323d2ac68a4f4ab03 100644
--- a/openair1/PHY/LTE_UE_TRANSPORT/transport_proto_ue.h
+++ b/openair1/PHY/LTE_UE_TRANSPORT/transport_proto_ue.h
@@ -966,6 +966,13 @@ void dlsch_channel_level_core(int32_t **dl_ch_estimates_ext,
                               int length,
                               int start_point);
 
+void dlsch_channel_level_median(int **dl_ch_estimates_ext,
+                                int32_t *median,
+                                int n_tx,
+                                int n_rx,
+                                int length,
+                                int start_point);
+
 
 void dlsch_channel_level_TM34(int **dl_ch_estimates_ext,
                               LTE_DL_FRAME_PARMS *frame_parms,