dlsch_demodulation.c 173 KB
Newer Older
1
/*******************************************************************************
2
    OpenAirInterface
ghaddab's avatar
ghaddab committed
3
    Copyright(c) 1999 - 2014 Eurecom
4

ghaddab's avatar
ghaddab committed
5 6 7 8
    OpenAirInterface is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.
9 10


ghaddab's avatar
ghaddab committed
11 12 13 14
    OpenAirInterface is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
15

ghaddab's avatar
ghaddab committed
16
    You should have received a copy of the GNU General Public License
17 18
    along with OpenAirInterface.The full GNU General Public License is
   included in this distribution in the file called "COPYING". If not,
ghaddab's avatar
ghaddab committed
19
   see <http://www.gnu.org/licenses/>.
20 21

  Contact Information
ghaddab's avatar
ghaddab committed
22 23
  OpenAirInterface Admin: openair_admin@eurecom.fr
  OpenAirInterface Tech : openair_tech@eurecom.fr
24
  OpenAirInterface Dev  : openair4g-devel@lists.eurecom.fr
25

ghaddab's avatar
ghaddab committed
26
  Address      : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE
27

28
*******************************************************************************/
29 30 31 32 33

/*! \file PHY/LTE_TRANSPORT/dlsch_demodulation.c
 * \brief Top-level routines for demodulating the PDSCH physical channel from 36-211, V8.6 2009-03
 * \author R. Knopp, F. Kaltenberger,A. Bhamri, S. Aubert
 * \date 2011
34
 * \version 0.1
35 36 37 38 39 40 41 42 43 44
 * \company Eurecom
 * \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr,ankit.bhamri@eurecom.fr,sebastien.aubert@eurecom.fr
 * \note
 * \warning
 */

#include "PHY/defs.h"
#include "PHY/extern.h"
#include "defs.h"
#include "extern.h"
45
#include "PHY/sse_intrin.h"
46 47 48 49 50


#ifndef USER_MODE
#define NOCYGWIN_STATIC static
#else
51
#define NOCYGWIN_STATIC
52 53 54
#endif

//#define DEBUG_PHY 1
55
//#define DEBUG_DLSCH_DEMOD 1
56

knopp's avatar
knopp committed
57
int avg[4]; 
58 59

// [MCS][i_mod (0,1,2) = (2,4,6)]
60 61 62 63
unsigned char offset_mumimo_llr_drange_fix=0;
/*
//original values from sebastion + same hand tuning
unsigned char offset_mumimo_llr_drange[29][3]={{8,8,8},{7,7,7},{7,7,7},{7,7,7},{6,6,6},{6,6,6},{6,6,6},{5,5,5},{4,4,4},{1,2,4}, // QPSK
64 65
{5,5,4},{5,5,5},{5,5,5},{3,3,3},{2,2,2},{2,2,2},{2,2,2}, // 16-QAM
{2,2,1},{3,3,3},{3,3,3},{3,3,1},{2,2,2},{2,2,2},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}}; //64-QAM
66
*/
67 68 69 70 71 72 73 74
 /*
 //first optimization try
 unsigned char offset_mumimo_llr_drange[29][3]={{7, 8, 7},{6, 6, 7},{6, 6, 7},{6, 6, 6},{5, 6, 6},{5, 5, 6},{5, 5, 6},{4, 5, 4},{4, 3, 4},{3, 2, 2},{6, 5, 5},{5, 4, 4},{5, 5, 4},{3, 3, 2},{2, 2, 1},{2, 1, 1},{2, 2, 2},{3, 3, 3},{3, 3, 2},{3, 3, 2},{3, 2, 1},{2, 2, 2},{2, 2, 2},{0, 0, 0},{0, 0, 0},{0, 0, 0},{0, 0, 0},{0, 0, 0}};
 */
 //second optimization try
 /*
   unsigned char offset_mumimo_llr_drange[29][3]={{5, 8, 7},{4, 6, 8},{3, 6, 7},{7, 7, 6},{4, 7, 8},{4, 7, 4},{6, 6, 6},{3, 6, 6},{3, 6, 6},{1, 3, 4},{1, 1, 0},{3, 3, 2},{3, 4, 1},{4, 0, 1},{4, 2, 2},{3, 1, 2},{2, 1, 0},{2, 1, 1},{1, 0, 1},{1, 0, 1},{0, 0, 0},{1, 0, 0},{0, 0, 0},{0, 1, 0},{1, 0, 0},{0, 0, 0},{0, 0, 0},{0, 0, 0},{0, 0, 0}};  w
 */
75
unsigned char offset_mumimo_llr_drange[29][3]= {{0, 6, 5},{0, 4, 5},{0, 4, 5},{0, 5, 4},{0, 5, 6},{0, 5, 3},{0, 4, 4},{0, 4, 4},{0, 3, 3},{0, 1, 2},{1, 1, 0},{1, 3, 2},{3, 4, 1},{2, 0, 0},{2, 2, 2},{1, 1, 1},{2, 1, 0},{2, 1, 1},{1, 0, 1},{1, 0, 1},{0, 0, 0},{1, 0, 0},{0, 0, 0},{0, 1, 0},{1, 0, 0},{0, 0, 0},{0, 0, 0},{0, 0, 0},{0, 0, 0}};
76 77


78
extern void print_shorts(char *s,int16_t *x);
79

80

81 82 83 84
int rx_pdsch(PHY_VARS_UE *phy_vars_ue,
             PDSCH_t type,
             unsigned char eNB_id,
             unsigned char eNB_id_i, //if this == phy_vars_ue->n_connected_eNB, we assume MU interference
gauthier's avatar
gauthier committed
85
             uint8_t subframe,
86 87
             unsigned char symbol,
             unsigned char first_symbol_flag,
88
             RX_type_t rx_type,
89
             unsigned char i_mod,
90 91 92
             unsigned char harq_pid)
{

93 94 95 96 97 98
  LTE_UE_COMMON *lte_ue_common_vars  = &phy_vars_ue->lte_ue_common_vars;
  LTE_UE_PDSCH **lte_ue_pdsch_vars;
  LTE_DL_FRAME_PARMS *frame_parms    = &phy_vars_ue->lte_frame_parms;
  PHY_MEASUREMENTS *phy_measurements = &phy_vars_ue->PHY_measurements;
  LTE_UE_DLSCH_t   **dlsch_ue;

Elena Lukashova's avatar
Elena Lukashova committed
99

100
  unsigned char aatx,aarx;    
101
  unsigned short nb_rb, round;
102
  int avgs, rb;  
Elena Lukashova's avatar
Elena Lukashova committed
103 104

 LTE_DL_UE_HARQ_t *dlsch0_harq,*dlsch1_harq = 0;
105
  uint32_t *rballoc;
106

107 108 109
  int32_t **rxdataF_comp_ptr;
  int32_t **dl_ch_mag_ptr;

110 111 112 113
  switch (type) {
  case SI_PDSCH:
    lte_ue_pdsch_vars = &phy_vars_ue->lte_ue_pdsch_vars_SI[eNB_id];
    dlsch_ue          = &phy_vars_ue->dlsch_ue_SI[eNB_id];
114
    dlsch0_harq       = dlsch_ue[0]->harq_processes[harq_pid];
115
    break;
116

117 118 119
  case RA_PDSCH:
    lte_ue_pdsch_vars = &phy_vars_ue->lte_ue_pdsch_vars_ra[eNB_id];
    dlsch_ue          = &phy_vars_ue->dlsch_ue_ra[eNB_id];
120
    dlsch0_harq       = dlsch_ue[0]->harq_processes[harq_pid];
121
    break;
122

123 124 125
  case PDSCH:
    lte_ue_pdsch_vars = &phy_vars_ue->lte_ue_pdsch_vars[eNB_id];
    dlsch_ue          = phy_vars_ue->dlsch_ue[eNB_id];
126 127
    dlsch0_harq       = dlsch_ue[0]->harq_processes[harq_pid];
    dlsch1_harq       = dlsch_ue[1]->harq_processes[harq_pid];
128 129 130
    break;

  default:
131
    LOG_E(PHY,"[UE %d][FATAL] Frame %d subframe %d: Unknown PDSCH format %d\n",phy_vars_ue->frame_rx,subframe,type);
132 133 134
    return(-1);
    break;
  }
135

136 137
  DevAssert(dlsch0_harq);
  round = dlsch0_harq->round;
138

139
  if (eNB_id > 2) {
jiangx's avatar
jiangx committed
140
    LOG_W(PHY,"dlsch_demodulation.c: Illegal eNB_id %d\n",eNB_id);
141 142
    return(-1);
  }
143

144
  if (!lte_ue_common_vars) {
jiangx's avatar
jiangx committed
145
    LOG_W(PHY,"dlsch_demodulation.c: Null lte_ue_common_vars\n");
146 147 148 149
    return(-1);
  }

  if (!dlsch_ue[0]) {
jiangx's avatar
jiangx committed
150
    LOG_W(PHY,"dlsch_demodulation.c: Null dlsch_ue pointer\n");
151 152 153 154
    return(-1);
  }

  if (!lte_ue_pdsch_vars) {
jiangx's avatar
jiangx committed
155
    LOG_W(PHY,"dlsch_demodulation.c: Null lte_ue_pdsch_vars pointer\n");
156 157
    return(-1);
  }
158

159
  if (!frame_parms) {
jiangx's avatar
jiangx committed
160
    LOG_W(PHY,"dlsch_demodulation.c: Null lte_frame_parms\n");
161 162
    return(-1);
  }
163 164 165 166 167 168
  
  if (((frame_parms->Ncp == NORMAL) && (symbol>=7)) ||
      ((frame_parms->Ncp == EXTENDED) && (symbol>=6)))
    rballoc = dlsch0_harq->rb_alloc_odd;
  else
    rballoc = dlsch0_harq->rb_alloc_even;
169

170 171 172 173 174 175 176 177 178 179 180 181 182 183
  if (dlsch0_harq->mimo_mode>DUALSTREAM_UNIFORM_PRECODINGj) {
    LOG_E(PHY,"This transmission mode is not yet supported!\n");
    return(-1);
  }
  if ((dlsch0_harq->mimo_mode==LARGE_CDD) || ((dlsch0_harq->mimo_mode>=DUALSTREAM_UNIFORM_PRECODING1) && (dlsch0_harq->mimo_mode<=DUALSTREAM_PUSCH_PRECODING)))  {
    DevAssert(dlsch1_harq);
    if (eNB_id!=eNB_id_i) {
      LOG_E(PHY,"TM3/TM4 requires to set eNB_id==eNB_id_i!\n");
      return(-1);
    }
  }

  //printf("rx_pdsch: harq_pid=%d, round=%d\n",harq_pid,round);

184
  if (frame_parms->nb_antennas_tx_eNB>1) {
185
#ifdef DEBUG_DLSCH_MOD
186
    LOG_I(PHY,"dlsch: using pmi %x (%p), rb_alloc %x\n",pmi2hex_2Ar1(dlsch0_harq->pmi_alloc),dlsch_ue[0],dlsch0_harq->rb_alloc_even[0]);
187 188
#endif
    nb_rb = dlsch_extract_rbs_dual(lte_ue_common_vars->rxdataF,
189 190 191 192 193
                                   lte_ue_common_vars->dl_ch_estimates[eNB_id],
                                   lte_ue_pdsch_vars[eNB_id]->rxdataF_ext,
                                   lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext,
                                   dlsch0_harq->pmi_alloc,
                                   lte_ue_pdsch_vars[eNB_id]->pmi_ext,
194
                                   rballoc,
195 196 197 198 199
                                   symbol,
                                   subframe,
                                   phy_vars_ue->high_speed_flag,
                                   frame_parms);

Elena Lukashova's avatar
Elena Lukashova committed
200
   if (rx_type==rx_IC_single_stream) {
201
      if (eNB_id_i<phy_vars_ue->n_connected_eNB) // we are in TM5
Elena Lukashova's avatar
Elena Lukashova committed
202
       nb_rb = dlsch_extract_rbs_dual(lte_ue_common_vars->rxdataF,
203 204 205 206 207
                                       lte_ue_common_vars->dl_ch_estimates[eNB_id_i],
                                       lte_ue_pdsch_vars[eNB_id_i]->rxdataF_ext,
                                       lte_ue_pdsch_vars[eNB_id_i]->dl_ch_estimates_ext,
                                       dlsch0_harq->pmi_alloc,
                                       lte_ue_pdsch_vars[eNB_id_i]->pmi_ext,
208
                                       rballoc,
209 210 211 212
                                       symbol,
                                       subframe,
                                       phy_vars_ue->high_speed_flag,
                                       frame_parms);
Elena Lukashova's avatar
Elena Lukashova committed
213 214
     else 
       nb_rb = dlsch_extract_rbs_dual(lte_ue_common_vars->rxdataF,
215 216 217 218 219
                                       lte_ue_common_vars->dl_ch_estimates[eNB_id],
                                       lte_ue_pdsch_vars[eNB_id_i]->rxdataF_ext,
                                       lte_ue_pdsch_vars[eNB_id_i]->dl_ch_estimates_ext,
                                       dlsch0_harq->pmi_alloc,
                                       lte_ue_pdsch_vars[eNB_id_i]->pmi_ext,
220
                                       rballoc,
221 222 223 224
                                       symbol,
                                       subframe,
                                       phy_vars_ue->high_speed_flag,
                                       frame_parms);
225 226
    }
  } // if n_tx>1
227
  else {
228
    nb_rb = dlsch_extract_rbs_single(lte_ue_common_vars->rxdataF,
229 230 231 232 233
                                     lte_ue_common_vars->dl_ch_estimates[eNB_id],
                                     lte_ue_pdsch_vars[eNB_id]->rxdataF_ext,
                                     lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext,
                                     dlsch0_harq->pmi_alloc,
                                     lte_ue_pdsch_vars[eNB_id]->pmi_ext,
234
                                     rballoc,
235 236 237 238
                                     symbol,
                                     subframe,
                                     phy_vars_ue->high_speed_flag,
                                     frame_parms);
Elena Lukashova's avatar
Elena Lukashova committed
239 240
   if (rx_type==rx_IC_single_stream) {
     if (eNB_id_i<phy_vars_ue->n_connected_eNB)
241 242 243 244 245 246
        nb_rb = dlsch_extract_rbs_single(lte_ue_common_vars->rxdataF,
                                         lte_ue_common_vars->dl_ch_estimates[eNB_id_i],
                                         lte_ue_pdsch_vars[eNB_id_i]->rxdataF_ext,
                                         lte_ue_pdsch_vars[eNB_id_i]->dl_ch_estimates_ext,    
                                         dlsch0_harq->pmi_alloc,
                                         lte_ue_pdsch_vars[eNB_id_i]->pmi_ext,
247
                                         rballoc,
248 249 250 251
                                         symbol,
                                         subframe,
                                         phy_vars_ue->high_speed_flag,
                                         frame_parms);
Elena Lukashova's avatar
Elena Lukashova committed
252

253
      else 
254 255 256 257 258 259
        nb_rb = dlsch_extract_rbs_single(lte_ue_common_vars->rxdataF,
                                         lte_ue_common_vars->dl_ch_estimates[eNB_id],
                                         lte_ue_pdsch_vars[eNB_id_i]->rxdataF_ext,
                                         lte_ue_pdsch_vars[eNB_id_i]->dl_ch_estimates_ext,    
                                         dlsch0_harq->pmi_alloc,
                                         lte_ue_pdsch_vars[eNB_id_i]->pmi_ext,
260
                                         rballoc,
261 262 263 264
                                         symbol,
                                         subframe,
                                         phy_vars_ue->high_speed_flag,
                                         frame_parms);
265 266
    }
  } //else n_tx>1
267 268

  //  printf("nb_rb = %d, eNB_id %d\n",nb_rb,eNB_id);
269
  if (nb_rb==0) {
270
    LOG_D(PHY,"dlsch_demodulation.c: nb_rb=0\n");
271 272
    return(-1);
  }
273

knopp's avatar
 
knopp committed
274
  /*
275 276
  // DL power control: Scaling of Channel estimates for PDSCH
  dlsch_scale_channel(lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext,
277 278 279 280
  frame_parms,
  dlsch_ue,
  symbol,
  nb_rb);
knopp's avatar
 
knopp committed
281
  */
282 283
  if (first_symbol_flag==1) {
    dlsch_channel_level(lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext,
284 285 286 287
                        frame_parms,
                        avg,
                        symbol,
                        nb_rb);
288
#ifdef DEBUG_PHY
jiangx's avatar
jiangx committed
289
    LOG_D(PHY,"[DLSCH] avg[0] %d\n",avg[0]);
290
#endif
291

292 293 294 295
    // the channel gain should be the effective gain of precoding + channel
    // however lets be more conservative and set maxh = nb_tx*nb_rx*max(h_i)
    // in case of precoding we add an additional factor of two for the precoding gain
    avgs = 0;
296

297 298
    for (aatx=0;aatx<frame_parms->nb_antennas_tx_eNB;aatx++)
      for (aarx=0;aarx<frame_parms->nb_antennas_rx;aarx++)
299 300
        avgs = cmax(avgs,avg[(aatx<<1)+aarx]);
    //  avgs = cmax(avgs,avg[(aarx<<1)+aatx]);
301

Elena Lukashova's avatar
Elena Lukashova committed
302
   lte_ue_pdsch_vars[eNB_id]->log2_maxh = (log2_approx(avgs)/2);
303 304
    // + log2_approx(frame_parms->nb_antennas_tx_eNB-1) //-1 because log2_approx counts the number of bits
    //      + log2_approx(frame_parms->nb_antennas_rx-1);
305

306
    if ((dlsch0_harq->mimo_mode>=UNIFORM_PRECODING11) &&
307 308
        (dlsch0_harq->mimo_mode< DUALSTREAM_UNIFORM_PRECODING1) &&
        (dlsch0_harq->dl_power_off==1)) // we are in TM 6
309 310
      lte_ue_pdsch_vars[eNB_id]->log2_maxh++;

311 312
    //printf("log2_maxh =%d\n",lte_ue_pdsch_vars[eNB_id]->log2_maxh);
    
313
    // this version here applies the factor .5 also to the extra terms. however, it does not work so well as the one above
314
    /* K = Nb_rx         in TM1
315 316 317 318
       Nb_tx*Nb_rx   in TM2,4,5
       Nb_tx^2*Nb_rx in TM6 */
    /*
      K = frame_parms->nb_antennas_rx*frame_parms->nb_antennas_tx_eNB; //that also covers TM1 since Nb_tx=1
319 320 321
      if ((dlsch0_harq->mimo_mode>=UNIFORM_PRECODING11) &&
      (dlsch0_harq->mimo_mode< DUALSTREAM_UNIFORM_PRECODING1) &&
      (dlsch0_harq->dl_power_off==1)) // we are in TM 6
322 323 324 325 326 327
      K *= frame_parms->nb_antennas_tx_eNB;

      lte_ue_pdsch_vars[eNB_id]->log2_maxh = (log2_approx(K*avgs)/2);
    */

#ifdef DEBUG_PHY
jiangx's avatar
jiangx committed
328 329
    LOG_D(PHY,"[DLSCH] log2_maxh = %d (%d,%d)\n",lte_ue_pdsch_vars[eNB_id]->log2_maxh,avg[0],avgs);
    LOG_D(PHY,"[DLSCH] mimo_mode = %d\n", dlsch0_harq->mimo_mode);
330 331
#endif
  }
332

333 334 335
  aatx = frame_parms->nb_antennas_tx_eNB;
  aarx = frame_parms->nb_antennas_rx;

336
  if (dlsch0_harq->mimo_mode<LARGE_CDD) {// SISO or ALAMOUTI
337
    
Elena Lukashova's avatar
Elena Lukashova committed
338
    	dlsch_channel_compensation(lte_ue_pdsch_vars[eNB_id]->rxdataF_ext,
339 340 341 342 343 344 345 346
                               lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext,
                               lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0,
                               lte_ue_pdsch_vars[eNB_id]->dl_ch_magb0,
                               lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0,
                               (aatx>1) ? lte_ue_pdsch_vars[eNB_id]->rho : NULL,
                               frame_parms,
                               symbol,
                               first_symbol_flag,
Elena Lukashova's avatar
Elena Lukashova committed
347
                               dlsch0_harq->Qm,
348 349 350 351 352 353 354 355 356
                               nb_rb,
                               lte_ue_pdsch_vars[eNB_id]->log2_maxh,
                               phy_measurements); // log2_maxh+I0_shift
 /*
 if (symbol == 5) {
     write_output("rxF_comp_d.m","rxF_c_d",&lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);
 } */
    if ((rx_type==rx_IC_single_stream) && 
        (eNB_id_i<phy_vars_ue->n_connected_eNB)) {
Elena Lukashova's avatar
Elena Lukashova committed
357 358
         
	 dlsch_channel_compensation(lte_ue_pdsch_vars[eNB_id_i]->rxdataF_ext,
359 360 361 362 363 364 365 366 367 368 369 370
                                 lte_ue_pdsch_vars[eNB_id_i]->dl_ch_estimates_ext,
                                 lte_ue_pdsch_vars[eNB_id_i]->dl_ch_mag0,
                                 lte_ue_pdsch_vars[eNB_id_i]->dl_ch_magb0,
                                 lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0,
                                 (aatx>1) ? lte_ue_pdsch_vars[eNB_id_i]->rho : NULL,
                                 frame_parms,
                                 symbol,
                                 first_symbol_flag,
                                 i_mod,
                                 nb_rb,
                                 lte_ue_pdsch_vars[eNB_id]->log2_maxh,
                                 phy_measurements); // log2_maxh+I0_shift
371
#ifdef DEBUG_PHY
372

373
      if (symbol == 5) {
374
        write_output("rxF_comp_d.m","rxF_c_d",&lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);
375

376
        write_output("rxF_comp_i.m","rxF_c_i",&lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);     
377 378
      }
#endif 
Elena Lukashova's avatar
Elena Lukashova committed
379
     // compute correlation between signal and interference channels
380
      dlsch_dual_stream_correlation(frame_parms,
381 382 383 384 385 386
                                    symbol,
                                    nb_rb,
                                    lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext,
                                    lte_ue_pdsch_vars[eNB_id_i]->dl_ch_estimates_ext,
                                    lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
                                    lte_ue_pdsch_vars[eNB_id]->log2_maxh);
387
    }
388
    
389
  }
390 391 392
  else if ((dlsch0_harq->mimo_mode == LARGE_CDD) || 
           ((dlsch0_harq->mimo_mode >=DUALSTREAM_UNIFORM_PRECODING1) && 
            (dlsch0_harq->mimo_mode <=DUALSTREAM_PUSCH_PRECODING))){  // TM3 or TM4
393
    //   LOG_I(PHY,"Running PDSCH RX for TM3\n");
394
	      
395
    if (frame_parms->nb_antennas_tx_eNB == 2) {
396 397 398 399 400 401 402 403 404 405
       
	 
	 // scaling interfering channel (following for TM56)
	dlsch_scale_channel(lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext,
			    frame_parms,
			    dlsch_ue,
			    symbol,
			    nb_rb);
	
	        
406
      if (first_symbol_flag==1) {
407 408 409
        // effective channel of desired user is always stronger than interfering eff. channel
        dlsch_channel_level_TM34(lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext, 
                                 frame_parms, 
Elena Lukashova's avatar
Elena Lukashova committed
410 411 412
                                 avg,
				 symbol,
				 nb_rb,
413 414
                                 dlsch0_harq->mimo_mode);
	    
Elena Lukashova's avatar
Elena Lukashova committed
415
	
416 417 418 419 420
	if (rx_type>rx_standard) {
	  //	LOG_D(PHY,"llr_offset = %d\n",offset_mumimo_llr_drange[dlsch0_harq->mcs][(dlsch1_harq->mcs>>1)-1]);
	  lte_ue_pdsch_vars[eNB_id]->log2_maxh = log2_approx(avg[0]) - 13 + offset_mumimo_llr_drange[dlsch0_harq->mcs][(get_Qm(dlsch1_harq->mcs)>>1)-1];
	}
	else 
Elena Lukashova's avatar
Elena Lukashova committed
421

422 423 424 425 426 427 428 429 430

	lte_ue_pdsch_vars[eNB_id]->log2_maxh = log2_approx(avg[0])/2;
      }
    
      dlsch_channel_compensation_TM34(frame_parms, 
                                     lte_ue_pdsch_vars[eNB_id],
                                     phy_measurements, 
                                     eNB_id, 
                                     symbol, 
Elena Lukashova's avatar
Elena Lukashova committed
431 432
                                     dlsch0_harq->Qm, 
                                     dlsch1_harq->Qm,
433 434 435 436 437
                                     harq_pid,
                                     dlsch0_harq->round,
                                     dlsch0_harq->mimo_mode,
                                     nb_rb, 
                                     lte_ue_pdsch_vars[eNB_id]->log2_maxh); 
Elena Lukashova's avatar
Elena Lukashova committed
438
   	/*   
439 440 441 442 443 444 445 446
       if (symbol == 5) {
   
     write_output("rxF_comp_d00.m","rxF_c_d00",&lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);// should be QAM
     write_output("rxF_comp_d01.m","rxF_c_d01",&lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0[1][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);//should be almost 0
     write_output("rxF_comp_d10.m","rxF_c_d10",&lte_ue_pdsch_vars[eNB_id]->rxdataF_comp1[harq_pid][round][0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);//should be almost 0
     write_output("rxF_comp_d11.m","rxF_c_d11",&lte_ue_pdsch_vars[eNB_id]->rxdataF_comp1[harq_pid][round][1][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);//should be QAM

   
Elena Lukashova's avatar
Elena Lukashova committed
447
	}*/
448
      // compute correlation between signal and interference channels (rho12 and rho21)
Elena Lukashova's avatar
Elena Lukashova committed
449 450
      
	dlsch_dual_stream_correlation(frame_parms,
451 452 453 454 455
                                    symbol,
                                    nb_rb,
                                    lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext,
                                    &(lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext[2]),
                                    lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
Elena Lukashova's avatar
Elena Lukashova committed
456
			   	    lte_ue_pdsch_vars[eNB_id]->log2_maxh);
457 458

      //to be optimized (just take complex conjugate)
Elena Lukashova's avatar
Elena Lukashova committed
459

460
      dlsch_dual_stream_correlation(frame_parms,
461 462 463 464
                                    symbol,
                                    nb_rb,
                                    &(lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext[2]),
                                    lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext,
465
                                    lte_ue_pdsch_vars[eNB_id]->dl_ch_rho2_ext,
Elena Lukashova's avatar
Elena Lukashova committed
466
				    lte_ue_pdsch_vars[eNB_id]->log2_maxh);
467 468
      //printf("TM3 log2_maxh : %d\n",lte_ue_pdsch_vars[eNB_id]->log2_maxh);

Elena Lukashova's avatar
Elena Lukashova committed
469
   }
470
      else {
Elena Lukashova's avatar
Elena Lukashova committed
471
     LOG_E(PHY, "only 2 tx antennas supported for TM3\n");
472
      return(-1);
473 474
    }
  }
475
  else if (dlsch0_harq->mimo_mode<DUALSTREAM_UNIFORM_PRECODING1) {// single-layer precoding (TM5, TM6)
Elena Lukashova's avatar
Elena Lukashova committed
476
   //    printf("Channel compensation for precoding\n");
477
    if ((rx_type==rx_IC_single_stream) && (eNB_id_i==phy_vars_ue->n_connected_eNB)) {  // TM5 two-user
478 479 480

      // Scale the channel estimates for interfering stream

481
      dlsch_scale_channel(lte_ue_pdsch_vars[eNB_id_i]->dl_ch_estimates_ext,
482 483 484 485
                          frame_parms,
                          dlsch_ue,
                          symbol,
                          nb_rb);     
486 487 488

      /* compute new log2_maxh for effective channel */
      if (first_symbol_flag==1) {
Elena Lukashova's avatar
Elena Lukashova committed
489

490
        // effective channel of desired user is always stronger than interfering eff. channel
Elena Lukashova's avatar
Elena Lukashova committed
491
       dlsch_channel_level_TM56(lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext, frame_parms, lte_ue_pdsch_vars[eNB_id]->pmi_ext, avg, symbol, nb_rb);
492

493 494
        //    LOG_D(PHY,"llr_offset = %d\n",offset_mumimo_llr_drange[dlsch0_harq->mcs][(i_mod>>1)-1]);
        avg[0] = log2_approx(avg[0]) - 13 + offset_mumimo_llr_drange[dlsch0_harq->mcs][(i_mod>>1)-1];
495

496 497
        lte_ue_pdsch_vars[eNB_id]->log2_maxh = cmax(avg[0],0);
        //printf("log1_maxh =%d\n",lte_ue_pdsch_vars[eNB_id]->log2_maxh);
498 499 500 501 502 503 504 505 506 507 508 509
      }

      dlsch_channel_compensation_TM56(lte_ue_pdsch_vars[eNB_id]->rxdataF_ext,
                                      lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext,
                                      lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0,
                                      lte_ue_pdsch_vars[eNB_id]->dl_ch_magb0,
                                      lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0,
                                      lte_ue_pdsch_vars[eNB_id]->pmi_ext,
                                      frame_parms,
                                      phy_measurements,
                                      eNB_id,
                                      symbol,
510
                                      dlsch0_harq->Qm,
511 512
                                      nb_rb,
                                      lte_ue_pdsch_vars[eNB_id]->log2_maxh,
513
                                      dlsch0_harq->dl_power_off);
514 515 516 517

      // if interference source is MU interference, assume opposite precoder was used at eNB

      // calculate opposite PMI
518
      for (rb=0; rb<nb_rb; rb++) {
Elena Lukashova's avatar
Elena Lukashova committed
519

520 521 522 523
        switch(lte_ue_pdsch_vars[eNB_id]->pmi_ext[rb]) {
        case 0:
          lte_ue_pdsch_vars[eNB_id_i]->pmi_ext[rb]=1;
          break;
Elena Lukashova's avatar
Elena Lukashova committed
524
       case 1:
525 526
          lte_ue_pdsch_vars[eNB_id_i]->pmi_ext[rb]=0;
          break;
Elena Lukashova's avatar
Elena Lukashova committed
527
       case 2:
528 529 530 531 532 533
          lte_ue_pdsch_vars[eNB_id_i]->pmi_ext[rb]=3;
          break;
        case 3:
          lte_ue_pdsch_vars[eNB_id_i]->pmi_ext[rb]=2;
          break;
        }
534

Elena Lukashova's avatar
Elena Lukashova committed
535
       //  if (rb==0)
536 537
        //    printf("pmi %d, pmi_i %d\n",lte_ue_pdsch_vars[eNB_id]->pmi_ext[rb],lte_ue_pdsch_vars[eNB_id_i]->pmi_ext[rb]);

538 539
      }

540 541 542 543 544 545 546 547 548 549 550 551 552
      dlsch_channel_compensation_TM56(lte_ue_pdsch_vars[eNB_id_i]->rxdataF_ext,
                                      lte_ue_pdsch_vars[eNB_id_i]->dl_ch_estimates_ext,
                                      lte_ue_pdsch_vars[eNB_id_i]->dl_ch_mag0,
                                      lte_ue_pdsch_vars[eNB_id_i]->dl_ch_magb0,
                                      lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0,
                                      lte_ue_pdsch_vars[eNB_id_i]->pmi_ext,
                                      frame_parms,
                                      phy_measurements,
                                      eNB_id_i,
                                      symbol,
                                      i_mod,
                                      nb_rb,
                                      lte_ue_pdsch_vars[eNB_id]->log2_maxh,
553
                                      dlsch0_harq->dl_power_off);
554

Elena Lukashova's avatar
Elena Lukashova committed
555

556
#ifdef DEBUG_PHY
557

558
      if (symbol==5) {
559
        write_output("rxF_comp_d.m","rxF_c_d",&lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);
Elena Lukashova's avatar
Elena Lukashova committed
560
       write_output("rxF_comp_i.m","rxF_c_i",&lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);
561
      }
562
#endif
563
      dlsch_dual_stream_correlation(frame_parms, 
564 565 566 567 568 569
                                    symbol, 
                                    nb_rb, 
                                    lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext, 
                                    lte_ue_pdsch_vars[eNB_id_i]->dl_ch_estimates_ext, 
                                    lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round], 
                                    lte_ue_pdsch_vars[eNB_id]->log2_maxh);
570

571
    } else {
572
      dlsch_channel_compensation_TM56(lte_ue_pdsch_vars[eNB_id]->rxdataF_ext,
573 574 575 576 577 578 579 580 581
                                      lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext,
                                      lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0,
                                      lte_ue_pdsch_vars[eNB_id]->dl_ch_magb0,
                                      lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0,
                                      lte_ue_pdsch_vars[eNB_id]->pmi_ext,
                                      frame_parms,
                                      phy_measurements,
                                      eNB_id,
                                      symbol,
582
                                      dlsch0_harq->Qm,
583 584 585
                                      nb_rb,
                                      lte_ue_pdsch_vars[eNB_id]->log2_maxh,
                                      1);
Elena Lukashova's avatar
Elena Lukashova committed
586

587 588 589 590
    }
  }

  //  printf("MRC\n");
591
  if (frame_parms->nb_antennas_rx > 1) {
592 593 594
    if ((dlsch0_harq->mimo_mode == LARGE_CDD) ||
        ((dlsch0_harq->mimo_mode >=DUALSTREAM_UNIFORM_PRECODING1) && 
         (dlsch0_harq->mimo_mode <=DUALSTREAM_PUSCH_PRECODING))){  // TM3 or TM4
595
      if (frame_parms->nb_antennas_tx_eNB == 2) {
Elena Lukashova's avatar
Elena Lukashova committed
596

597 598 599 600 601 602 603
	dlsch_detection_mrc_TM34(frame_parms, 
                                 lte_ue_pdsch_vars[eNB_id],
				 harq_pid,
                                 dlsch0_harq->round,
				 symbol,
				 nb_rb,
				 1);
604
      }
605 606
    } else {

607
      dlsch_detection_mrc(frame_parms,
608 609 610 611 612 613 614 615 616 617 618
                          lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0,
                          lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0,
                          lte_ue_pdsch_vars[eNB_id]->rho,
                          lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
                          lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0,
                          lte_ue_pdsch_vars[eNB_id]->dl_ch_magb0,
                          lte_ue_pdsch_vars[eNB_id_i]->dl_ch_mag0,
                          lte_ue_pdsch_vars[eNB_id_i]->dl_ch_magb0,
                          symbol,
                          nb_rb,
                          rx_type==rx_IC_single_stream); 
619 620
    }
  }
621

622 623 624 625 626 627 628 629 630 631 632 633 634 635 636
  //  printf("Combining");
  if ((dlsch0_harq->mimo_mode == SISO) ||
      ((dlsch0_harq->mimo_mode >= UNIFORM_PRECODING11) &&
       (dlsch0_harq->mimo_mode <= PUSCH_PRECODING0))) {

    /*
      dlsch_siso(frame_parms,
      lte_ue_pdsch_vars[eNB_id]->rxdataF_comp,
      lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp,
      symbol,
      nb_rb);
    */
  } else if (dlsch0_harq->mimo_mode == ALAMOUTI) {

    dlsch_alamouti(frame_parms,
637 638 639 640 641
                   lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0,
                   lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0,
                   lte_ue_pdsch_vars[eNB_id]->dl_ch_magb0,
                   symbol,
                   nb_rb);
Elena Lukashova's avatar
Elena Lukashova committed
642
        
643
  } 
644
          
645 646 647 648 649 650
  //    printf("LLR");
  if ((dlsch0_harq->mimo_mode == LARGE_CDD) || 
      ((dlsch0_harq->mimo_mode >=DUALSTREAM_UNIFORM_PRECODING1) && 
       (dlsch0_harq->mimo_mode <=DUALSTREAM_PUSCH_PRECODING)))  {
    rxdataF_comp_ptr = lte_ue_pdsch_vars[eNB_id]->rxdataF_comp1[harq_pid][round];
    dl_ch_mag_ptr = lte_ue_pdsch_vars[eNB_id]->dl_ch_mag1;
651 652
  }
  else {
653 654 655
    rxdataF_comp_ptr = lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0;
    dl_ch_mag_ptr = lte_ue_pdsch_vars[eNB_id_i]->dl_ch_mag0;
    //i_mod should have been passed as a parameter
656
  }
657

658
  switch (dlsch0_harq->Qm) {
659
  case 2 : 
660 661 662 663 664
    if (rx_type==rx_standard) {
        dlsch_qpsk_llr(frame_parms,
                       lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0,
                       lte_ue_pdsch_vars[eNB_id]->llr[0],
                       symbol,first_symbol_flag,nb_rb,
665
                       adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol),
666 667 668
                       lte_ue_pdsch_vars[eNB_id]->llr128);
    }
      else if ((rx_type==rx_IC_single_stream) || (rx_type==rx_IC_dual_stream)) {
Elena Lukashova's avatar
Elena Lukashova committed
669
        if (dlsch1_harq->Qm == 2) {
670 671 672 673 674 675
          dlsch_qpsk_qpsk_llr(frame_parms,
                              lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0,
                              rxdataF_comp_ptr,
                              lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
                              lte_ue_pdsch_vars[eNB_id]->llr[0],
                              symbol,first_symbol_flag,nb_rb,
Elena Lukashova's avatar
Elena Lukashova committed
676
                              adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol),
677 678 679 680 681 682 683 684
                              lte_ue_pdsch_vars[eNB_id]->llr128);
          if (rx_type==rx_IC_dual_stream) {
            dlsch_qpsk_qpsk_llr(frame_parms,
                                rxdataF_comp_ptr,
                                lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0,
                                lte_ue_pdsch_vars[eNB_id]->dl_ch_rho2_ext,
                                lte_ue_pdsch_vars[eNB_id]->llr[1],
                                symbol,first_symbol_flag,nb_rb,
Elena Lukashova's avatar
Elena Lukashova committed
685
                               adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,2,subframe,symbol),
686 687 688
                                lte_ue_pdsch_vars[eNB_id]->llr128_2ndstream);
          }
        }
Elena Lukashova's avatar
Elena Lukashova committed
689
        else if (dlsch1_harq->Qm == 4) { 
690 691 692 693 694 695 696
          dlsch_qpsk_16qam_llr(frame_parms,
                               lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0,
                               rxdataF_comp_ptr,//i
                               dl_ch_mag_ptr,//i
                               lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
                               lte_ue_pdsch_vars[eNB_id]->llr[0],
                               symbol,first_symbol_flag,nb_rb,
Elena Lukashova's avatar
Elena Lukashova committed
697
                               adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol),
698 699 700 701 702 703 704 705 706
                               lte_ue_pdsch_vars[eNB_id]->llr128);
          if (rx_type==rx_IC_dual_stream) {
            dlsch_16qam_qpsk_llr(frame_parms,
                                 rxdataF_comp_ptr,
                                 lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0,//i
                                 dl_ch_mag_ptr,
                                 lte_ue_pdsch_vars[eNB_id]->dl_ch_rho2_ext,
                                 lte_ue_pdsch_vars[eNB_id]->llr[1],
                                 symbol,first_symbol_flag,nb_rb,
Elena Lukashova's avatar
Elena Lukashova committed
707
                                 adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,4,subframe,symbol),
708 709 710 711 712 713 714 715 716 717 718
                                 lte_ue_pdsch_vars[eNB_id]->llr128_2ndstream);
          }
        }
        else {
          dlsch_qpsk_64qam_llr(frame_parms,
                               lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0,
                               rxdataF_comp_ptr,//i
                               dl_ch_mag_ptr,//i
                               lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
                               lte_ue_pdsch_vars[eNB_id]->llr[0],
                               symbol,first_symbol_flag,nb_rb,
Elena Lukashova's avatar
Elena Lukashova committed
719
                               adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol),
720 721 722 723 724 725 726 727 728
                               lte_ue_pdsch_vars[eNB_id]->llr128);
          if (rx_type==rx_IC_dual_stream) {
            dlsch_64qam_qpsk_llr(frame_parms,
                                 rxdataF_comp_ptr,
                                 lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0,//i
                                 dl_ch_mag_ptr,
                                 lte_ue_pdsch_vars[eNB_id]->dl_ch_rho2_ext,
                                 lte_ue_pdsch_vars[eNB_id]->llr[1],
                                 symbol,first_symbol_flag,nb_rb,
Elena Lukashova's avatar
Elena Lukashova committed
729
                                 adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,6,subframe,symbol),
730 731 732
                                 lte_ue_pdsch_vars[eNB_id]->llr128_2ndstream);
          }
        }          
733
      }
734 735 736 737 738 739 740 741
    break;
  case 4 :
    if (rx_type==rx_standard) {
      dlsch_16qam_llr(frame_parms,
                      lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0,
                      lte_ue_pdsch_vars[eNB_id]->llr[0],
                      lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0,
                      symbol,first_symbol_flag,nb_rb,
742
                      adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,4,subframe,symbol),
743
                      lte_ue_pdsch_vars[eNB_id]->llr128);
744
    }
745
    else if ((rx_type==rx_IC_single_stream) || (rx_type==rx_IC_dual_stream)) {
Elena Lukashova's avatar
Elena Lukashova committed
746
      if (dlsch1_harq->Qm == 2) {
747 748 749 750 751 752 753
        dlsch_16qam_qpsk_llr(frame_parms,
                             lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0,
                             rxdataF_comp_ptr,//i
                             lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0,
                             lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
                             lte_ue_pdsch_vars[eNB_id]->llr[0],
                             symbol,first_symbol_flag,nb_rb,
Elena Lukashova's avatar
Elena Lukashova committed
754
                             adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,4,subframe,symbol),
755 756 757 758 759 760 761 762 763
                             lte_ue_pdsch_vars[eNB_id]->llr128);
        if (rx_type==rx_IC_dual_stream) {
          dlsch_qpsk_16qam_llr(frame_parms,
                               rxdataF_comp_ptr,
                               lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0,//i
                               lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0,//i
                               lte_ue_pdsch_vars[eNB_id]->dl_ch_rho2_ext,
                               lte_ue_pdsch_vars[eNB_id]->llr[1],
                               symbol,first_symbol_flag,nb_rb,
Elena Lukashova's avatar
Elena Lukashova committed
764
                               adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,2,subframe,symbol),
765 766
                               lte_ue_pdsch_vars[eNB_id]->llr128_2ndstream);
        }
767
      }
Elena Lukashova's avatar
Elena Lukashova committed
768
      else if (dlsch1_harq->Qm == 4) {
769 770 771 772 773 774 775 776
	dlsch_16qam_16qam_llr(frame_parms,
			      lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0,
			      rxdataF_comp_ptr,//i
			      lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0,
			      dl_ch_mag_ptr,//i
			      lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
			      lte_ue_pdsch_vars[eNB_id]->llr[0],
			      symbol,first_symbol_flag,nb_rb,
Elena Lukashova's avatar
Elena Lukashova committed
777
			      adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,4,subframe,symbol),
778 779 780 781 782 783 784 785 786 787
			      lte_ue_pdsch_vars[eNB_id]->llr128);
	if (rx_type==rx_IC_dual_stream) {
	  dlsch_16qam_16qam_llr(frame_parms,
				rxdataF_comp_ptr,
				lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0,//i
				dl_ch_mag_ptr,
				lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0,//i
				lte_ue_pdsch_vars[eNB_id]->dl_ch_rho2_ext,
				lte_ue_pdsch_vars[eNB_id]->llr[1],
				symbol,first_symbol_flag,nb_rb,
Elena Lukashova's avatar
Elena Lukashova committed
788
				adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,4,subframe,symbol),
789 790
				lte_ue_pdsch_vars[eNB_id]->llr128_2ndstream);
	}
791 792
      }
      else {
793 794 795 796 797 798 799 800
	dlsch_16qam_64qam_llr(frame_parms,
			      lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0,
			      rxdataF_comp_ptr,//i
			      lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0,
			      dl_ch_mag_ptr,//i
			      lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
			      lte_ue_pdsch_vars[eNB_id]->llr[0],
			      symbol,first_symbol_flag,nb_rb,
Elena Lukashova's avatar
Elena Lukashova committed
801
			      adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,4,subframe,symbol),
802 803 804 805 806 807 808 809 810 811
			      lte_ue_pdsch_vars[eNB_id]->llr128);
	if (rx_type==rx_IC_dual_stream) {
	  dlsch_64qam_16qam_llr(frame_parms,
				rxdataF_comp_ptr,
				lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0,
				dl_ch_mag_ptr,
				lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0,
				lte_ue_pdsch_vars[eNB_id]->dl_ch_rho2_ext,
				lte_ue_pdsch_vars[eNB_id]->llr[1],
				symbol,first_symbol_flag,nb_rb,
Elena Lukashova's avatar
Elena Lukashova committed
812
				adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,6,subframe,symbol),
813 814 815 816 817 818 819 820 821 822 823 824 825
				lte_ue_pdsch_vars[eNB_id]->llr128_2ndstream);
	}
      }
    }
    break;
  case 6 :
    if (rx_type==rx_standard) {
      dlsch_64qam_llr(frame_parms,
                      lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0,
                      lte_ue_pdsch_vars[eNB_id]->llr[0],
                      lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0,
                      lte_ue_pdsch_vars[eNB_id]->dl_ch_magb0,
                      symbol,first_symbol_flag,nb_rb,
826
                      adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,6,subframe,symbol),
827 828 829
                      lte_ue_pdsch_vars[eNB_id]->llr128);
    }
    else if ((rx_type==rx_IC_single_stream) || (rx_type==rx_IC_dual_stream)) {
Elena Lukashova's avatar
Elena Lukashova committed
830
      if (dlsch1_harq->Qm == 2) {              
831
	dlsch_64qam_qpsk_llr(frame_parms,
832
			     lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0,
833 834 835
			     rxdataF_comp_ptr,//i
			     lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0,
			     lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
836 837
			     lte_ue_pdsch_vars[eNB_id]->llr[0],
			     symbol,first_symbol_flag,nb_rb,
Elena Lukashova's avatar
Elena Lukashova committed
838
			     adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,6,subframe,symbol),
839
			     lte_ue_pdsch_vars[eNB_id]->llr128);
840 841 842 843 844 845 846 847
	if (rx_type==rx_IC_dual_stream) {
	  dlsch_qpsk_64qam_llr(frame_parms,
			       rxdataF_comp_ptr,
			       lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0,//i
			       lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0,
			       lte_ue_pdsch_vars[eNB_id]->dl_ch_rho2_ext,
			       lte_ue_pdsch_vars[eNB_id]->llr[1],
			       symbol,first_symbol_flag,nb_rb,
Elena Lukashova's avatar
Elena Lukashova committed
848
			       adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,2,subframe,symbol),
849 850 851
			       lte_ue_pdsch_vars[eNB_id]->llr128_2ndstream);
	}
      }
Elena Lukashova's avatar
Elena Lukashova committed
852
      else if (dlsch1_harq->Qm == 4) {
853 854 855 856 857 858 859 860
	dlsch_64qam_16qam_llr(frame_parms,
			      lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0,
			      rxdataF_comp_ptr,//i
			      lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0,
			      dl_ch_mag_ptr,//i
			      lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
			      lte_ue_pdsch_vars[eNB_id]->llr[0],
			      symbol,first_symbol_flag,nb_rb,
Elena Lukashova's avatar
Elena Lukashova committed
861
			      adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,6,subframe,symbol),
862 863 864 865 866 867 868 869 870 871
			      lte_ue_pdsch_vars[eNB_id]->llr128);
	if (rx_type==rx_IC_dual_stream) {
	  dlsch_16qam_64qam_llr(frame_parms,
				rxdataF_comp_ptr,
				lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0,//i
				dl_ch_mag_ptr,
				lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0,//i
				lte_ue_pdsch_vars[eNB_id]->dl_ch_rho2_ext,
				lte_ue_pdsch_vars[eNB_id]->llr[1],
				symbol,first_symbol_flag,nb_rb,
Elena Lukashova's avatar
Elena Lukashova committed
872
				adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,4,subframe,symbol),
873 874 875 876 877 878 879 880 881 882 883 884
				lte_ue_pdsch_vars[eNB_id]->llr128_2ndstream);
	}
      }
      else {	  
	dlsch_64qam_64qam_llr(frame_parms,
			      lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0,
			      rxdataF_comp_ptr,//i
			      lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0,
			      dl_ch_mag_ptr,//i
			      lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
			      lte_ue_pdsch_vars[eNB_id]->llr[0],
			      symbol,first_symbol_flag,nb_rb,
Elena Lukashova's avatar
Elena Lukashova committed
885
			      adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,6,subframe,symbol),
886 887 888 889 890 891 892 893 894 895
			      lte_ue_pdsch_vars[eNB_id]->llr128);
	if (rx_type==rx_IC_dual_stream) {
	  dlsch_64qam_64qam_llr(frame_parms,
				rxdataF_comp_ptr,
				lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0,//i
				dl_ch_mag_ptr,
				lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0,//i
				lte_ue_pdsch_vars[eNB_id]->dl_ch_rho2_ext,
				lte_ue_pdsch_vars[eNB_id]->llr[1],
				symbol,first_symbol_flag,nb_rb,
Elena Lukashova's avatar
Elena Lukashova committed
896
				adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,6,subframe,symbol),
897 898 899
				lte_ue_pdsch_vars[eNB_id]->llr128_2ndstream);
	}
      }
900

901
    }
Elena Lukashova's avatar
Elena Lukashova committed
902

903
    break;
904 905 906 907 908 909 910 911 912 913 914 915 916
  default:
    LOG_W(PHY,"rx_dlsch.c : Unknown mod_order!!!!\n");
    return(-1);
    break;
  }

  switch (get_Qm(dlsch1_harq->mcs)) {
  case 2 : 
    if (rx_type==rx_standard) {
        dlsch_qpsk_llr(frame_parms,
                       rxdataF_comp_ptr,
                       lte_ue_pdsch_vars[eNB_id]->llr[1],
                       symbol,first_symbol_flag,nb_rb,
Elena Lukashova's avatar
Elena Lukashova committed
917
                       adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,2,subframe,symbol),
918
                       lte_ue_pdsch_vars[eNB_id]->llr128_2ndstream);
919
    }
920 921 922 923 924 925 926 927
    break;
  case 4:
    if (rx_type==rx_standard) {
      dlsch_16qam_llr(frame_parms,
                      rxdataF_comp_ptr,
                      lte_ue_pdsch_vars[eNB_id]->llr[1],
                      lte_ue_pdsch_vars[eNB_id]->dl_ch_mag1,
                      symbol,first_symbol_flag,nb_rb,
Elena Lukashova's avatar
Elena Lukashova committed
928
                      adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,4,subframe,symbol),
929
                      lte_ue_pdsch_vars[eNB_id]->llr128_2ndstream);
930
    }
931