dlsch_demodulation.c 187 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
#endif

Elena Lukashova's avatar
Elena Lukashova committed
54
55
56
//#undef LOG_D
//#define LOG_D LOG_I

57
//#define DEBUG_PHY 1
58
//#define DEBUG_DLSCH_DEMOD 1
59

knopp's avatar
knopp committed
60
int avg[4]; 
61
62
int avg_0[2];
int avg_1[2];
63
64

// [MCS][i_mod (0,1,2) = (2,4,6)]
65
unsigned char offset_mumimo_llr_drange_fix=0;
Elena Lukashova's avatar
Elena Lukashova committed
66
67
68
uint8_t interf_unaw_shift0=0;
uint8_t interf_unaw_shift1=0;
uint8_t interf_unaw_shift=0;
69
//inferference-free case
70
71
unsigned char interf_unaw_shift_tm4_mcs[29]={5, 3, 4, 3, 3, 2, 1, 1, 2, 0, 1, 1, 1, 1, 0, 0, 
					     1, 1, 1, 1, 0, 2, 1, 0, 1, 0, 1, 0, 0} ;
72
73
unsigned char interf_unaw_shift_tm1_mcs[29]={5, 5, 4, 3, 3, 3, 2, 2, 4, 4, 2, 3, 3, 3, 1, 1, 
					     0, 1, 1, 2, 5, 4, 4, 6, 5, 1, 0, 5, 6} ; // mcs 21, 26, 28 seem to be errorneous
74

75
76
77
/*
//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
78
79
{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
80
*/
81
82
83
84
85
86
87
88
 /*
 //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
 */
89
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}};
90
91


92
extern void print_shorts(char *s,int16_t *x);
93

94

95
96
97
98
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
99
             uint8_t subframe,
100
101
             unsigned char symbol,
             unsigned char first_symbol_flag,
102
             RX_type_t rx_type,
103
             unsigned char i_mod,
104
105
106
             unsigned char harq_pid)
{

107
108
109
110
111
112
  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
113

114
  unsigned char aatx,aarx;    
115
  unsigned short nb_rb, round;
116
  int avgs, rb;  
Elena Lukashova's avatar
Elena Lukashova committed
117
118

 LTE_DL_UE_HARQ_t *dlsch0_harq,*dlsch1_harq = 0;
119
  uint32_t *rballoc;
120

121
122
123
  int32_t **rxdataF_comp_ptr;
  int32_t **dl_ch_mag_ptr;

Elena Lukashova's avatar
Elena Lukashova committed
124
125
  
  
126
127
128
129
  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];
130
    dlsch0_harq       = dlsch_ue[0]->harq_processes[harq_pid];
131
    break;
132

133
134
135
  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];
136
    dlsch0_harq       = dlsch_ue[0]->harq_processes[harq_pid];
137
    break;
138

139
140
141
  case PDSCH:
    lte_ue_pdsch_vars = &phy_vars_ue->lte_ue_pdsch_vars[eNB_id];
    dlsch_ue          = phy_vars_ue->dlsch_ue[eNB_id];
142
143
    dlsch0_harq       = dlsch_ue[0]->harq_processes[harq_pid];
    dlsch1_harq       = dlsch_ue[1]->harq_processes[harq_pid];
144
145
146
    break;

  default:
147
    LOG_E(PHY,"[UE %d][FATAL] Frame %d subframe %d: Unknown PDSCH format %d\n",phy_vars_ue->frame_rx,subframe,type);
148
149
150
    return(-1);
    break;
  }
151

152
153
  DevAssert(dlsch0_harq);
  round = dlsch0_harq->round;
154

155
  if (eNB_id > 2) {
jiangx's avatar
jiangx committed
156
    LOG_W(PHY,"dlsch_demodulation.c: Illegal eNB_id %d\n",eNB_id);
157
158
    return(-1);
  }
159

160
  if (!lte_ue_common_vars) {
jiangx's avatar
jiangx committed
161
    LOG_W(PHY,"dlsch_demodulation.c: Null lte_ue_common_vars\n");
162
163
164
165
    return(-1);
  }

  if (!dlsch_ue[0]) {
jiangx's avatar
jiangx committed
166
    LOG_W(PHY,"dlsch_demodulation.c: Null dlsch_ue pointer\n");
167
168
169
170
    return(-1);
  }

  if (!lte_ue_pdsch_vars) {
jiangx's avatar
jiangx committed
171
    LOG_W(PHY,"dlsch_demodulation.c: Null lte_ue_pdsch_vars pointer\n");
172
173
    return(-1);
  }
174

175
  if (!frame_parms) {
jiangx's avatar
jiangx committed
176
    LOG_W(PHY,"dlsch_demodulation.c: Null lte_frame_parms\n");
177
178
    return(-1);
  }
179
180
181
182
183
184
  
  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;
185

Elena Lukashova's avatar
Elena Lukashova committed
186
  if (dlsch0_harq->mimo_mode>DUALSTREAM_PUSCH_PRECODING) {
187
188
189
    LOG_E(PHY,"This transmission mode is not yet supported!\n");
    return(-1);
  }
Elena Lukashova's avatar
Elena Lukashova committed
190
191
192
  
  
  
193
194
195
196
197
198
199
200
201
202
  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);

203
204
  if (frame_parms->nb_antennas_tx_eNB>1) {
    nb_rb = dlsch_extract_rbs_dual(lte_ue_common_vars->rxdataF,
205
206
207
208
209
                                   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,
210
                                   rballoc,
211
212
213
                                   symbol,
                                   subframe,
                                   phy_vars_ue->high_speed_flag,
Elena Lukashova's avatar
Elena Lukashova committed
214
215
                                   frame_parms,
				   dlsch0_harq->mimo_mode);
216
//#ifdef DEBUG_DLSCH_MOD
217
218
219
220
    /*   printf("dlsch: using pmi %lx, rb_alloc %x, pmi_ext ",pmi2hex_2Ar1(dlsch0_harq->pmi_alloc),*rballoc);
       for (rb=0;rb<nb_rb;rb++)
	  printf("%d",lte_ue_pdsch_vars[eNB_id]->pmi_ext[rb]);
       printf("\n");*/
221
//#endif
222

Elena Lukashova's avatar
Elena Lukashova committed
223
   if (rx_type >= rx_IC_single_stream) {
224
      if (eNB_id_i<phy_vars_ue->n_connected_eNB) // we are in TM5
Elena Lukashova's avatar
Elena Lukashova committed
225
       nb_rb = dlsch_extract_rbs_dual(lte_ue_common_vars->rxdataF,
226
227
228
229
230
                                       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,
231
                                       rballoc,
232
233
234
                                       symbol,
                                       subframe,
                                       phy_vars_ue->high_speed_flag,
Elena Lukashova's avatar
Elena Lukashova committed
235
236
                                       frame_parms,
				       dlsch0_harq->mimo_mode);
Elena Lukashova's avatar
Elena Lukashova committed
237
238
     else 
       nb_rb = dlsch_extract_rbs_dual(lte_ue_common_vars->rxdataF,
239
                                       lte_ue_common_vars->dl_ch_estimates[eNB_id],
240
241
                                       lte_ue_pdsch_vars[eNB_id_i]->rxdataF_ext,
                                       lte_ue_pdsch_vars[eNB_id_i]->dl_ch_estimates_ext,
242
                                       dlsch0_harq->pmi_alloc,
243
                                       lte_ue_pdsch_vars[eNB_id_i]->pmi_ext,
244
                                       rballoc,
245
246
247
                                       symbol,
                                       subframe,
                                       phy_vars_ue->high_speed_flag,
Elena Lukashova's avatar
Elena Lukashova committed
248
249
                                       frame_parms,
				       dlsch0_harq->mimo_mode);
250
251
    }
  } // if n_tx>1
252
  else {
253
    nb_rb = dlsch_extract_rbs_single(lte_ue_common_vars->rxdataF,
254
255
256
257
258
                                     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,
259
                                     rballoc,
260
261
262
263
                                     symbol,
                                     subframe,
                                     phy_vars_ue->high_speed_flag,
                                     frame_parms);
Elena Lukashova's avatar
Elena Lukashova committed
264
265
   if (rx_type==rx_IC_single_stream) {
     if (eNB_id_i<phy_vars_ue->n_connected_eNB)
266
267
268
269
270
271
        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,
272
                                         rballoc,
273
274
275
276
                                         symbol,
                                         subframe,
                                         phy_vars_ue->high_speed_flag,
                                         frame_parms);
Elena Lukashova's avatar
Elena Lukashova committed
277

278
      else 
279
280
281
282
283
284
        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,
285
                                         rballoc,
286
287
288
289
                                         symbol,
                                         subframe,
                                         phy_vars_ue->high_speed_flag,
                                         frame_parms);
290
291
    }
  } //else n_tx>1
292
293

  //  printf("nb_rb = %d, eNB_id %d\n",nb_rb,eNB_id);
294
  if (nb_rb==0) {
295
    LOG_D(PHY,"dlsch_demodulation.c: nb_rb=0\n");
296
297
    return(-1);
  }
298

Elena Lukashova's avatar
Elena Lukashova committed
299

300
301
302
303
304
#ifdef DEBUG_PHY
    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);
#endif

Elena Lukashova's avatar
Elena Lukashova committed
305
306
307
308
  aatx = frame_parms->nb_antennas_tx_eNB;
  aarx = frame_parms->nb_antennas_rx;

  if (dlsch0_harq->mimo_mode<LARGE_CDD) {// SISO or ALAMOUTI
309
310
311
312
313
314
    
      dlsch_scale_channel(lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext,
			  frame_parms,
			  dlsch_ue,
			  symbol,
			  nb_rb);
315
  
316
317
      if (first_symbol_flag==1) {
	dlsch_channel_level(lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext,
318
319
320
321
                        frame_parms,
                        avg,
                        symbol,
                        nb_rb);
322
323
324
325
#ifdef DEBUG_PHY
    LOG_D(PHY,"[DLSCH] avg[0] %d\n",avg[0]);
#endif

326
    avgs = 0;
327

328
329
    for (aatx=0;aatx<frame_parms->nb_antennas_tx_eNB;aatx++)
      for (aarx=0;aarx<frame_parms->nb_antennas_rx;aarx++)
330
        avgs = cmax(avgs,avg[(aatx<<1)+aarx]);
331
    //  avgs = cmax(avgs,avg[(aarx<<1)+aatx]);
332

333
334
     lte_ue_pdsch_vars[eNB_id]->log2_maxh = (log2_approx(avgs)/2); //+ interf_unaw_shift_tm1_mcs[dlsch0_harq->mcs];
   // printf("TM4 I-A log2_maxh0 = %d\n", lte_ue_pdsch_vars[eNB_id]->log2_maxh);
335
336
      }
    
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
                               nb_rb,
                               lte_ue_pdsch_vars[eNB_id]->log2_maxh,
                               phy_measurements); // log2_maxh+I0_shift
Elena Lukashova's avatar
Elena Lukashova committed
351
 
352
 /*if (symbol == 5) {
353
     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);
354
 } */
355
356
    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
       
	 
	 // scaling interfering channel (following for TM56)
Elena Lukashova's avatar
Elena Lukashova committed
399
	dlsch_scale_channel(lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext,
400
401
402
			    frame_parms,
			    dlsch_ue,
			    symbol,
Elena Lukashova's avatar
Elena Lukashova committed
403
			    nb_rb);
404
405
	
	        
406
      if (first_symbol_flag==1) {
407
408
        // 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, 
Elena Lukashova's avatar
Elena Lukashova committed
409
410
                                 frame_parms,
				 lte_ue_pdsch_vars[eNB_id]->pmi_ext,
411
412
                                 avg_0,
				 avg_1,
Elena Lukashova's avatar
Elena Lukashova committed
413
414
				 symbol,
				 nb_rb,
415
                                 dlsch0_harq->mimo_mode);
416
417
418
419
	
	  

 //  write_output("dlsch0_r0_aver_chan_1.m","dl_aver_ch1_r0_0",&avg_1[0],1,1,2);
420
	    
Elena Lukashova's avatar
Elena Lukashova committed
421
	
422
	if (rx_type>rx_standard) {
Elena Lukashova's avatar
Elena Lukashova committed
423
424
	// Shifts are needed to avoid tails in SNR/BLER curves.
	// LUT will be introduced with mcs-dependent shift
425
426
	avg_0[0] = (log2_approx(avg_0[0])/2) -13 + interf_unaw_shift;
	avg_1[0] = (log2_approx(avg_1[0])/2) -13 + interf_unaw_shift;
427
428
	lte_ue_pdsch_vars[eNB_id]->log2_maxh0 = cmax(avg_0[0],0);
	lte_ue_pdsch_vars[eNB_id]->log2_maxh1 = cmax(avg_1[0],0);
429
	
Elena Lukashova's avatar
Elena Lukashova committed
430
431
	//printf("TM4 I-A log2_maxh0 = %d\n", lte_ue_pdsch_vars[eNB_id]->log2_maxh0);
	//printf("TM4 I-A log2_maxh1 = %d\n", lte_ue_pdsch_vars[eNB_id]->log2_maxh1);
432
	  
Elena Lukashova's avatar
Elena Lukashova committed
433
	 }
434
	else {
Elena Lukashova's avatar
Elena Lukashova committed
435
436
	// Shifts are needed to avoid tails in SNR/BLER curves.
	// LUT will be introduced with mcs-dependent shift
437
438
	avg_0[0] = (log2_approx(avg_0[0])/2) - 13 + interf_unaw_shift;
	avg_1[0] = (log2_approx(avg_1[0])/2) - 13 + interf_unaw_shift;
439
440
	lte_ue_pdsch_vars[eNB_id]->log2_maxh0 = cmax(avg_0[0],0);
	lte_ue_pdsch_vars[eNB_id]->log2_maxh1 = cmax(avg_1[0],0);
Elena Lukashova's avatar
Elena Lukashova committed
441
442
443
	//printf("TM4 I-UA log2_maxh0 = %d\n", lte_ue_pdsch_vars[eNB_id]->log2_maxh0);
	//printf("TM4 I-UA log2_maxh1 = %d\n", lte_ue_pdsch_vars[eNB_id]->log2_maxh1);
        }
444
      }
445

446
447
448
449
450
      dlsch_channel_compensation_TM34(frame_parms, 
                                     lte_ue_pdsch_vars[eNB_id],
                                     phy_measurements, 
                                     eNB_id, 
                                     symbol, 
Elena Lukashova's avatar
Elena Lukashova committed
451
452
                                     dlsch0_harq->Qm, 
                                     dlsch1_harq->Qm,
453
454
455
456
                                     harq_pid,
                                     dlsch0_harq->round,
                                     dlsch0_harq->mimo_mode,
                                     nb_rb, 
457
458
                                     lte_ue_pdsch_vars[eNB_id]->log2_maxh0,
				     lte_ue_pdsch_vars[eNB_id]->log2_maxh1); 
Elena Lukashova's avatar
Elena Lukashova committed
459
   	   
460
  /*   if (symbol == 5) {
461
462
463
464
465
466
467
   
     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

   
468
	} */
Elena Lukashova's avatar
Elena Lukashova committed
469

470
      // compute correlation between signal and interference channels (rho12 and rho21)
Elena Lukashova's avatar
Elena Lukashova committed
471
      
472
	dlsch_dual_stream_correlation(frame_parms, // this is doing h11'*h12 and h21'*h22
473
474
475
                                    symbol,
                                    nb_rb,
                                    lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext,
476
                                    &(lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext[2]),
477
                                    lte_ue_pdsch_vars[eNB_id]->dl_ch_rho2_ext, 
478
			   	    lte_ue_pdsch_vars[eNB_id]->log2_maxh0);
479
480
	
	//printf("rho stream1 =%d\n", &lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round] );
481
482

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

484
      dlsch_dual_stream_correlation(frame_parms, // this is doing h12'*h11 and h22'*h21
485
486
                                    symbol,
                                    nb_rb,
487
				    &(lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext[2]),
488
                                    lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext,
489
				    lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
490
				    lte_ue_pdsch_vars[eNB_id]->log2_maxh1);
491
    //  printf("rho stream2 =%d\n",&lte_ue_pdsch_vars[eNB_id]->dl_ch_rho2_ext );
492
      //printf("TM3 log2_maxh : %d\n",lte_ue_pdsch_vars[eNB_id]->log2_maxh);
Elena Lukashova's avatar
Elena Lukashova committed
493
      
494
  /*     if (symbol == 5) {
Elena Lukashova's avatar
Elena Lukashova committed
495
496
497
498
499
500
501
   
     write_output("rho0_0.m","rho0_0",&lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round][0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);// should be QAM
     write_output("rho2_0.m","rho2_0",&lte_ue_pdsch_vars[eNB_id]->dl_ch_rho2_ext[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);//should be almost 0
     write_output("rho0_1.m.m","rho0_1",&lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round][1][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);//should be almost 0
     write_output("rho2_1.m","rho2_1",&lte_ue_pdsch_vars[eNB_id]->dl_ch_rho2_ext[1][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);//should be QAM

   
502
	} */
503

Elena Lukashova's avatar
Elena Lukashova committed
504
   }
505
      else {
Elena Lukashova's avatar
Elena Lukashova committed
506
     LOG_E(PHY, "only 2 tx antennas supported for TM3\n");
507
      return(-1);
508
509
    }
  }
510
  else if (dlsch0_harq->mimo_mode<DUALSTREAM_UNIFORM_PRECODING1) {// single-layer precoding (TM5, TM6)
Elena Lukashova's avatar
Elena Lukashova committed
511
   //    printf("Channel compensation for precoding\n");
512
    if ((rx_type==rx_IC_single_stream) && (eNB_id_i==phy_vars_ue->n_connected_eNB) && (dlsch0_harq->dl_power_off==0)) {  // TM5 two-user
513
514

      // Scale the channel estimates for interfering stream
Elena Lukashova's avatar
Elena Lukashova committed
515
516
517
518
519
520
      
       dlsch_scale_channel(lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext,
                          frame_parms,
                          dlsch_ue,
                          symbol,
                          nb_rb); 
521

522
      dlsch_scale_channel(lte_ue_pdsch_vars[eNB_id_i]->dl_ch_estimates_ext,
523
524
525
526
                          frame_parms,
                          dlsch_ue,
                          symbol,
                          nb_rb);     
527
528
529

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

531
        // effective channel of desired user is always stronger than interfering eff. channel
Elena Lukashova's avatar
Elena Lukashova committed
532
533
534
535
536
537
       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);
538

539
540
        //    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];
541

542
543
        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);
544
      }
545
   
546
547
548
549
550
551
552
553
554
555
      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,
556
                                      dlsch0_harq->Qm,
557
558
                                      nb_rb,
                                      lte_ue_pdsch_vars[eNB_id]->log2_maxh,
559
                                      dlsch0_harq->dl_power_off);
560
561
562
563

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

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

566
567
568
569
        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
570
       case 1:
571
572
          lte_ue_pdsch_vars[eNB_id_i]->pmi_ext[rb]=0;
          break;
Elena Lukashova's avatar
Elena Lukashova committed
573
       case 2:
574
575
576
577
578
579
          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;
        }
580

Elena Lukashova's avatar
Elena Lukashova committed
581
       //  if (rb==0)
582
583
        //    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]);

584
      }
585
586
    
  
587
588
589
590
591
592
593
594
595
596
597
598
599
      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,
600
                                      dlsch0_harq->dl_power_off);
601

Elena Lukashova's avatar
Elena Lukashova committed
602

603
#ifdef DEBUG_PHY
604

605
      if (symbol==5) {
606
        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
607
       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);
608
      }
609
#endif
610
      dlsch_dual_stream_correlation(frame_parms, 
611
612
613
614
615
616
                                    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);
617

618
619
    } 
    else if (dlsch0_harq->dl_power_off==1)  {
Elena Lukashova's avatar
Elena Lukashova committed
620
      
Elena Lukashova's avatar
Elena Lukashova committed
621
        dlsch_scale_channel(lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext,
622
623
624
625
626
			  frame_parms,
			  dlsch_ue,
			  symbol,
			  nb_rb);
  
627
      if (first_symbol_flag==1) {
628
629
630
631
632
633
634
635
	dlsch_channel_level(lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext,
                        frame_parms,
                        avg,
                        symbol,
                        nb_rb);
#ifdef DEBUG_PHY
    LOG_D(PHY,"[DLSCH] avg[0] %d\n",avg[0]);
#endif
636

637
    avgs = 0;
Elena Lukashova's avatar
Elena Lukashova committed
638
639
640
641

    for (aatx=0;aatx<frame_parms->nb_antennas_tx_eNB;aatx++)
      for (aarx=0;aarx<frame_parms->nb_antennas_rx;aarx++)
        avgs = cmax(avgs,avg[(aatx<<1)+aarx]);
642
    //  avgs = cmax(avgs,avg[(aarx<<1)+aatx]);
Elena Lukashova's avatar
Elena Lukashova committed
643

644
645
   lte_ue_pdsch_vars[eNB_id]->log2_maxh = (log2_approx(avgs)/2) + interf_unaw_shift_tm1_mcs[dlsch0_harq->mcs];
    
646
647
648
      }
      
      
Elena Lukashova's avatar
Elena Lukashova committed
649
      
650
      dlsch_channel_compensation_TM56(lte_ue_pdsch_vars[eNB_id]->rxdataF_ext,
651
652
653
654
655
656
657
658
659
                                      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,
660
                                      dlsch0_harq->Qm,
661
662
663
                                      nb_rb,
                                      lte_ue_pdsch_vars[eNB_id]->log2_maxh,
                                      1);
Elena Lukashova's avatar
Elena Lukashova committed
664

665
666
667
668
    }
  }

  //  printf("MRC\n");
669
  if (frame_parms->nb_antennas_rx > 1) {
670
671
672
    if ((dlsch0_harq->mimo_mode == LARGE_CDD) ||
        ((dlsch0_harq->mimo_mode >=DUALSTREAM_UNIFORM_PRECODING1) && 
         (dlsch0_harq->mimo_mode <=DUALSTREAM_PUSCH_PRECODING))){  // TM3 or TM4
673
      if (frame_parms->nb_antennas_tx_eNB == 2) {
Elena Lukashova's avatar
Elena Lukashova committed
674

675
676
677
678
679
680
681
	dlsch_detection_mrc_TM34(frame_parms, 
                                 lte_ue_pdsch_vars[eNB_id],
				 harq_pid,
                                 dlsch0_harq->round,
				 symbol,
				 nb_rb,
				 1);
Elena Lukashova's avatar
Elena Lukashova committed
682
683
	
	 
684
    /*   if (symbol == 5) {
Elena Lukashova's avatar
Elena Lukashova committed
685
686
687
   
     write_output("rho0_mrc.m","rho0_0",&lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round][0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);// should be QAM
     write_output("rho2_mrc.m","rho2_0",&lte_ue_pdsch_vars[eNB_id]->dl_ch_rho2_ext[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);//should be almost 0
688
    	} */
Elena Lukashova's avatar
Elena Lukashova committed
689
690
	
	
691
      }
692
693
    } else {

694
      dlsch_detection_mrc(frame_parms,
695
696
697
698
699
700
701
702
703
704
705
                          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); 
706
707
    }
  }
708

709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
  //  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,
724
725
726
727
728
                   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
729
        
730
  } 
731
          
732
733
734
735
736
737
  //    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;
738
739
  }
  else {
740
741
742
    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
743
  }
744

745
  switch (dlsch0_harq->Qm) {
746
  case 2 : 
747
748
749
750
751
    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,
752
                       adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol),
753
754
                       lte_ue_pdsch_vars[eNB_id]->llr128);
    }
Elena Lukashova's avatar
Elena Lukashova committed
755
      else if (rx_type >= rx_IC_single_stream) {
Elena Lukashova's avatar
Elena Lukashova committed
756
        if (dlsch1_harq->Qm == 2) {
757
758
759
          dlsch_qpsk_qpsk_llr(frame_parms,
                              lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0,
                              rxdataF_comp_ptr,
760
                              lte_ue_pdsch_vars[eNB_id]->dl_ch_rho2_ext,
761
762
                              lte_ue_pdsch_vars[eNB_id]->llr[0],
                              symbol,first_symbol_flag,nb_rb,
Elena Lukashova's avatar
Elena Lukashova committed
763
                              adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol),
764
765
766
767
768
                              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,
769
                                lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
770
771
                                lte_ue_pdsch_vars[eNB_id]->llr[1],
                                symbol,first_symbol_flag,nb_rb,
772
                                adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,2,subframe,symbol),
773
774
775
                                lte_ue_pdsch_vars[eNB_id]->llr128_2ndstream);
          }
        }
Elena Lukashova's avatar
Elena Lukashova committed
776
        else if (dlsch1_harq->Qm == 4) { 
777
778
779
780
          dlsch_qpsk_16qam_llr(frame_parms,
                               lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0,
                               rxdataF_comp_ptr,//i
                               dl_ch_mag_ptr,//i
781
                               lte_ue_pdsch_vars[eNB_id]->dl_ch_rho2_ext,
782
783
                               lte_ue_pdsch_vars[eNB_id]->llr[0],
                               symbol,first_symbol_flag,nb_rb,
Elena Lukashova's avatar
Elena Lukashova committed
784
                               adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol),
785
786
787
788
789
790
                               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,
791
                                 lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
792
793
                                 lte_ue_pdsch_vars[eNB_id]->llr[1],
                                 symbol,first_symbol_flag,nb_rb,
Elena Lukashova's avatar
Elena Lukashova committed
794
                                 adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,4,subframe,symbol),
795
796
797
798
799
800
801
802
                                 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
803
                               lte_ue_pdsch_vars[eNB_id]->dl_ch_rho2_ext,
804
805
                               lte_ue_pdsch_vars[eNB_id]->llr[0],
                               symbol,first_symbol_flag,nb_rb,
Elena Lukashova's avatar
Elena Lukashova committed
806
                               adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol),
807
808
809
810
811
812
                               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,
813
                                 lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
814
815
                                 lte_ue_pdsch_vars[eNB_id]->llr[1],
                                 symbol,first_symbol_flag,nb_rb,
Elena Lukashova's avatar
Elena Lukashova committed
816
                                 adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,6,subframe,symbol),
817
818
819
                                 lte_ue_pdsch_vars[eNB_id]->llr128_2ndstream);
          }
        }          
820
      }
821
822
823
824
825
826
827
828
    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,
829
                      adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,4,subframe,symbol),
830
                      lte_ue_pdsch_vars[eNB_id]->llr128);
831
    }
832
    else if (rx_type >= rx_IC_single_stream) {
Elena Lukashova's avatar
Elena Lukashova committed
833
      if (dlsch1_harq->Qm == 2) {
834
835
836
837
        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,
838
                             lte_ue_pdsch_vars[eNB_id]->dl_ch_rho2_ext,
839
840
                             lte_ue_pdsch_vars[eNB_id]->llr[0],
                             symbol,first_symbol_flag,nb_rb,
Elena Lukashova's avatar
Elena Lukashova committed
841
                             adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,4,subframe,symbol),
842
843
844
845
846
847
                             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
848
                               lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
849
850
                               lte_ue_pdsch_vars[eNB_id]->llr[1],
                               symbol,first_symbol_flag,nb_rb,
Elena Lukashova's avatar
Elena Lukashova committed
851
                               adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,2,subframe,symbol),
852
853
                               lte_ue_pdsch_vars[eNB_id]->llr128_2ndstream);
        }
854
      }
Elena Lukashova's avatar
Elena Lukashova committed
855
      else if (dlsch1_harq->Qm == 4) {
856
857
858
859
860
	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
861
			      lte_ue_pdsch_vars[eNB_id]->dl_ch_rho2_ext,
862
863
			      lte_ue_pdsch_vars[eNB_id]->llr[0],
			      symbol,first_symbol_flag,nb_rb,
Elena Lukashova's avatar
Elena Lukashova committed
864
			      adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,4,subframe,symbol),
865
866
867
868
869
870
871
			      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
872
				lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
873
874
				lte_ue_pdsch_vars[eNB_id]->llr[1],
				symbol,first_symbol_flag,nb_rb,
Elena Lukashova's avatar
Elena Lukashova committed
875
				adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,4,subframe,symbol),
876
877
				lte_ue_pdsch_vars[eNB_id]->llr128_2ndstream);
	}
878
879
      }
      else {
880
881
882
883
884
	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
885
			      lte_ue_pdsch_vars[eNB_id]->dl_ch_rho2_ext,
886
887
			      lte_ue_pdsch_vars[eNB_id]->llr[0],
			      symbol,first_symbol_flag,nb_rb,
Elena Lukashova's avatar
Elena Lukashova committed
888
			      adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,4,subframe,symbol),
889
890
891
892
893
894
895
			      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,
896
				lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round],
897
898
				lte_ue_pdsch_vars[eNB_id]->llr[1],
				symbol,first_symbol_flag,nb_rb,
Elena Lukashova's avatar
Elena Lukashova committed
899
				adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,6,subframe,symbol),
900
901
902
903
904
905
906
907
908
909
910
911
912
				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,
913
                      adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,6,subframe,symbol),
914
915
                      lte_ue_pdsch_vars[eNB_id]->llr128);
    }
916
    else if (rx_type >= rx_IC_single_stream) {
Elena Lukashova's avatar
Elena Lukashova committed
917
      if (dlsch1_harq->Qm == 2) {