ulsim.c 66.5 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/*
 * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The OpenAirInterface Software Alliance licenses this file to You under
 * the OAI Public License, Version 1.0  (the "License"); you may not use this file
 * except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.openairinterface.org/?page_id=698
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *-------------------------------------------------------------------------------
 * For more information about the OpenAirInterface (OAI) Software Alliance:
 *      contact@openairinterface.org
 */
21
22

/*! \file ulsim.c
Xiwen JIANG's avatar
Xiwen JIANG committed
23
 \brief Top-level UL simulator
24
 \author R. Knopp
25
 \date 2011 - 2014
26
27
28
29
30
31
32
 \version 0.1
 \company Eurecom
 \email: knopp@eurecom.fr
 \note
 \warning
*/

33
34
35
36
37
38
39
40
41
42
43
44
#include <string.h>
#include <math.h>
#include <unistd.h>
#include "SIMULATION/TOOLS/defs.h"
#include "PHY/types.h"
#include "PHY/defs.h"
#include "PHY/vars.h"

#include "SCHED/defs.h"
#include "SCHED/vars.h"
#include "LAYER2/MAC/vars.h"
#include "OCG_vars.h"
Calisson's avatar
Calisson committed
45
#include "intertask_interface_init.h"
46

47
48
#include "unitary_defs.h"

49
50
#include "PHY/TOOLS/lte_phy_scope.h"

51
52
53
PHY_VARS_eNB *eNB;
PHY_VARS_UE *UE;

54
double cpuf;
55

Florian Kaltenberger's avatar
Florian Kaltenberger committed
56

57

Florian Kaltenberger's avatar
Florian Kaltenberger committed
58
//#define MCS_COUNT 23//added for PHY abstraction
59
60
61
62

channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX];
channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX];
//Added for PHY abstraction
63
node_desc_t *enb_data[NUMBER_OF_eNB_MAX];
64
65
66
node_desc_t *ue_data[NUMBER_OF_UE_MAX];
//double sinr_bler_map[MCS_COUNT][2][16];

gauthier's avatar
gauthier committed
67
extern uint16_t beta_ack[16],beta_ri[16],beta_cqi[16];
68
69
//extern  char* namepointer_chMag ;

70
int xforms=0;
71
72
73
FD_lte_phy_scope_enb *form_enb;
char title[255];

74
75
76
77
78
79
80
81
/*the following parameters are used to control the processing times*/
double t_tx_max = -1000000000; /*!< \brief initial max process time for tx */
double t_rx_max = -1000000000; /*!< \brief initial max process time for rx */
double t_tx_min = 1000000000; /*!< \brief initial min process time for tx */
double t_rx_min = 1000000000; /*!< \brief initial min process time for tx */
int n_tx_dropped = 0; /*!< \brief initial max process time for tx */
int n_rx_dropped = 0; /*!< \brief initial max process time for rx */

knopp's avatar
knopp committed
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166

void fill_ulsch_dci(PHY_VARS_eNB *eNB,void *UL_dci,int first_rb,int nb_rb,int mcs,int ndi,int cqi_flag) {

  switch (eNB->frame_parms.N_RB_UL) {
  case 6:
    break;

  case 25:
    if (eNB->frame_parms.frame_type == TDD) {
      ((DCI0_5MHz_TDD_1_6_t*)UL_dci)->type    = 0;
      ((DCI0_5MHz_TDD_1_6_t*)UL_dci)->rballoc = computeRIV(eNB->frame_parms.N_RB_UL,first_rb,nb_rb);// 12 RBs from position 8
      //printf("nb_rb %d/%d, rballoc %d (dci %x)\n",nb_rb,eNB->frame_parms.N_RB_UL,((DCI0_5MHz_TDD_1_6_t*)UL_dci)->rballoc,*(uint32_t *)UL_dci);
      ((DCI0_5MHz_TDD_1_6_t*)UL_dci)->mcs     = mcs;
      ((DCI0_5MHz_TDD_1_6_t*)UL_dci)->ndi     = ndi;
      ((DCI0_5MHz_TDD_1_6_t*)UL_dci)->TPC     = 0;
      ((DCI0_5MHz_TDD_1_6_t*)UL_dci)->cqi_req = cqi_flag&1;
      ((DCI0_5MHz_TDD_1_6_t*)UL_dci)->cshift  = 0;
      ((DCI0_5MHz_TDD_1_6_t*)UL_dci)->dai     = 1;
    } else {
      ((DCI0_5MHz_FDD_t*)UL_dci)->type    = 0;
      ((DCI0_5MHz_FDD_t*)UL_dci)->rballoc = computeRIV(eNB->frame_parms.N_RB_UL,first_rb,nb_rb);// 12 RBs from position 8
      //      printf("nb_rb %d/%d, rballoc %d (dci %x) (dcip %p)\n",nb_rb,eNB->frame_parms.N_RB_UL,((DCI0_5MHz_FDD_t*)UL_dci)->rballoc,*(uint32_t *)UL_dci,UL_dci);
      ((DCI0_5MHz_FDD_t*)UL_dci)->mcs     = mcs;
      ((DCI0_5MHz_FDD_t*)UL_dci)->ndi     = ndi;
      ((DCI0_5MHz_FDD_t*)UL_dci)->TPC     = 0;
      ((DCI0_5MHz_FDD_t*)UL_dci)->cqi_req = cqi_flag&1;
      ((DCI0_5MHz_FDD_t*)UL_dci)->cshift  = 0;
    }

    break;

  case 50:
    if (eNB->frame_parms.frame_type == TDD) {
      ((DCI0_10MHz_TDD_1_6_t*)UL_dci)->type    = 0;
      ((DCI0_10MHz_TDD_1_6_t*)UL_dci)->rballoc = computeRIV(eNB->frame_parms.N_RB_UL,first_rb,nb_rb);// 12 RBs from position 8
      //      printf("nb_rb %d/%d, rballoc %d (dci %x)\n",nb_rb,eNB->frame_parms.N_RB_UL,((DCI0_10MHz_TDD_1_6_t*)UL_dci)->rballoc,*(uint32_t *)UL_dci);
      ((DCI0_10MHz_TDD_1_6_t*)UL_dci)->mcs     = mcs;
      ((DCI0_10MHz_TDD_1_6_t*)UL_dci)->ndi     = ndi;
      ((DCI0_10MHz_TDD_1_6_t*)UL_dci)->TPC     = 0;
      ((DCI0_10MHz_TDD_1_6_t*)UL_dci)->cqi_req = cqi_flag&1;
      ((DCI0_10MHz_TDD_1_6_t*)UL_dci)->cshift  = 0;
      ((DCI0_10MHz_TDD_1_6_t*)UL_dci)->dai     = 1;
    } else {
      ((DCI0_10MHz_FDD_t*)UL_dci)->type    = 0;
      ((DCI0_10MHz_FDD_t*)UL_dci)->rballoc = computeRIV(eNB->frame_parms.N_RB_UL,first_rb,nb_rb);// 12 RBs from position 8
      //printf("nb_rb %d/%d, rballoc %d (dci %x)\n",nb_rb,eNB->frame_parms.N_RB_UL,((DCI0_10MHz_FDD_t*)UL_dci)->rballoc,*(uint32_t *)UL_dci);
      ((DCI0_10MHz_FDD_t*)UL_dci)->mcs     = mcs;
      ((DCI0_10MHz_FDD_t*)UL_dci)->ndi     = ndi;
      ((DCI0_10MHz_FDD_t*)UL_dci)->TPC     = 0;
      ((DCI0_10MHz_FDD_t*)UL_dci)->cqi_req = cqi_flag&1;
      ((DCI0_10MHz_FDD_t*)UL_dci)->cshift  = 0;
    }

    break;

  case 100:
    if (eNB->frame_parms.frame_type == TDD) {
      ((DCI0_20MHz_TDD_1_6_t*)UL_dci)->type    = 0;
      ((DCI0_20MHz_TDD_1_6_t*)UL_dci)->rballoc = computeRIV(eNB->frame_parms.N_RB_UL,first_rb,nb_rb);// 12 RBs from position 8
      //      printf("nb_rb %d/%d, rballoc %d (dci %x)\n",nb_rb,eNB->frame_parms.N_RB_UL,((DCI0_20MHz_TDD_1_6_t*)UL_dci)->rballoc,*(uint32_t *)UL_dci);
      ((DCI0_20MHz_TDD_1_6_t*)UL_dci)->mcs     = mcs;
      ((DCI0_20MHz_TDD_1_6_t*)UL_dci)->ndi     = ndi;
      ((DCI0_20MHz_TDD_1_6_t*)UL_dci)->TPC     = 0;
      ((DCI0_20MHz_TDD_1_6_t*)UL_dci)->cqi_req = cqi_flag&1;
      ((DCI0_20MHz_TDD_1_6_t*)UL_dci)->cshift  = 0;
      ((DCI0_20MHz_TDD_1_6_t*)UL_dci)->dai     = 1;
    } else {
      ((DCI0_20MHz_FDD_t*)UL_dci)->type    = 0;
      ((DCI0_20MHz_FDD_t*)UL_dci)->rballoc = computeRIV(eNB->frame_parms.N_RB_UL,first_rb,nb_rb);// 12 RBs from position 8
      //   printf("nb_rb %d/%d, rballoc %d (dci %x) (UL_dci %p)\n",nb_rb,eNB->frame_parms.N_RB_UL,((DCI0_20MHz_FDD_t*)UL_dci)->rballoc,*(uint32_t *)UL_dci,(void*)UL_dci);
      ((DCI0_20MHz_FDD_t*)UL_dci)->mcs     = mcs;
      ((DCI0_20MHz_FDD_t*)UL_dci)->ndi     = ndi;
      ((DCI0_20MHz_FDD_t*)UL_dci)->TPC     = 0;
      ((DCI0_20MHz_FDD_t*)UL_dci)->cqi_req = cqi_flag&1;
      ((DCI0_20MHz_FDD_t*)UL_dci)->cshift  = 0;
    }

    break;

  default:
    break;
  }

}

167
168
extern void eNB_fep_full(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc);
extern void eNB_fep_full_2thread(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc);
knopp's avatar
knopp committed
169

170
171
int main(int argc, char **argv)
{
172
173
174
175
176
177

  char c;
  int i,j,aa,u;

  int aarx,aatx;
  double channelx,channely;
178
  double sigma2, sigma2_dB=10,SNR,SNR2,snr0=-2.0,snr1,SNRmeas,rate,saving_bler=0;
knopp's avatar
   
knopp committed
179
  double input_snr_step=.2,snr_int=30;
180
181
182
183
184
  double blerr;

  int **txdata;

  LTE_DL_FRAME_PARMS *frame_parms;
185
186
187
188
189
190
  double s_re0[30720],s_im0[30720],r_re0[30720],r_im0[30720];
  double s_re1[30720],s_im1[30720],r_re1[30720],r_im1[30720];
  double *s_re[2]={s_re0,s_re1};
  double *s_im[2]={s_im0,s_im1};
  double *r_re[2]={r_re0,r_re1};
  double *r_im[2]={r_im0,r_im1};
191
192
  double forgetting_factor=0.0; //in [0,1] 0 means a new channel every time, 1 means keep the same channel
  double iqim=0.0;
gauthier's avatar
gauthier committed
193
  uint8_t extended_prefix_flag=0;
194
195
196
197
198
199
  int cqi_flag=0,cqi_error,cqi_errors,ack_errors,cqi_crc_falsepositives,cqi_crc_falsenegatives;
  int ch_realization;
  int eNB_id = 0;
  int chMod = 0 ;
  int UE_id = 0;
  unsigned char nb_rb=25,first_rb=0,mcs=0,round=0,bundling_flag=1;
200
  //unsigned char l;
201
202
203
204
205
206
207
208
209
210

  unsigned char awgn_flag = 0 ;
  SCM_t channel_model=Rice1;


  unsigned char *input_buffer,harq_pid;
  unsigned short input_buffer_length;
  unsigned int ret;
  unsigned int coded_bits_per_codeword,nsymb;
  int subframe=3;
211
  unsigned int tx_lev=0,tx_lev_dB,trials,errs[4]= {0,0,0,0},round_trials[4]= {0,0,0,0};
212
  uint8_t transmission_mode=1,n_rx=1;
213

214
  FILE *bler_fd=NULL;
215
  char bler_fname[512];
216

217
218
  FILE *time_meas_fd=NULL;
  char time_meas_fname[256];
219

220
221
222
  FILE *input_fdUL=NULL,*trch_out_fdUL=NULL;
  //  unsigned char input_file=0;
  char input_val_str[50],input_val_str2[50];
223

224
  //  FILE *rx_frame_file;
225
  FILE *csv_fdUL=NULL;
226

227
  /*
228
  FILE *fperen=NULL;
229
230
  char fperen_name[512];

231
  FILE *fmageren=NULL;
232
  char fmageren_name[512];
233

234
  FILE *flogeren=NULL;
235
  char flogeren_name[512];
236
  */
237
238
239
240

  /* FILE *ftxlev;
     char ftxlev_name[512];
  */
241

242
243
244
  char csv_fname[512];
  int n_frames=5000;
  int n_ch_rlz = 1;
245
246
  int abstx = 0;
  int hold_channel=0;
247
248
  channel_desc_t *UE2eNB;

249
  //uint8_t control_only_flag = 0;
250
251
  int delay = 0;
  double maxDoppler = 0.0;
gauthier's avatar
gauthier committed
252
  uint8_t srs_flag = 0;
253

gauthier's avatar
gauthier committed
254
  uint8_t N_RB_DL=25,osf=1;
255

gauthier's avatar
gauthier committed
256
257
258
259
  uint8_t cyclic_shift = 0;
  uint8_t cooperation_flag = 0; //0 no cooperation, 1 delay diversity, 2 Alamouti
  uint8_t beta_ACK=0,beta_RI=0,beta_CQI=2;
  uint8_t tdd_config=3,frame_type=FDD;
260

gauthier's avatar
gauthier committed
261
  uint8_t N0=30;
262
263
264
265
266
267
268
  double tx_gain=1.0;
  double cpu_freq_GHz;
  int avg_iter,iter_trials;

  uint32_t UL_alloc_pdu;
  int s,Kr,Kr_bytes;
  int dump_perf=0;
269
  int test_perf=0;
270
271
  int dump_table =0;

272
273
  double effective_rate=0.0;
  char channel_model_input[10];
274

275
  uint8_t max_turbo_iterations=4;
276
  uint8_t parallel_flag=0;
277
  int nb_rb_set = 0;
278

279
  int threequarter_fs=0;
knopp's avatar
knopp committed
280
281
  int ndi;

knopp's avatar
   
knopp committed
282
283
  opp_enabled=1; // to enable the time meas

284
  cpu_freq_GHz = (double)get_cpu_freq_GHz();
285
  cpuf = cpu_freq_GHz;
286
287
288
289

  printf("Detected cpu_freq %f GHz\n",cpu_freq_GHz);

  logInit();
Calisson's avatar
Calisson committed
290
291
292
293
294
  /*
  // enable these lines if you need debug info
  // however itti will catch all signals, so ctrl-c won't work anymore
  // alternatively you can disable ITTI completely in CMakeLists.txt
  itti_init(TASK_MAX, THREAD_MAX, MESSAGES_ID_MAX, tasks_info, messages_info, messages_definition_xml, NULL);
295
  set_comp_log(PHY,LOG_DEBUG,LOG_MED,1);
Calisson's avatar
Calisson committed
296
297
  set_glog(LOG_DEBUG,LOG_MED);
  */
298

299
  while ((c = getopt (argc, argv, "hapZEbm:n:Y:X:x:s:w:e:q:d:D:O:c:r:i:f:y:c:oA:C:R:g:N:l:S:T:QB:PI:LF")) != -1) {
300
301
302
303
304
    switch (c) {
    case 'a':
      channel_model = AWGN;
      chMod = 1;
      break;
305

306
307
308
    case 'b':
      bundling_flag = 0;
      break;
309

310
311
312
    case 'd':
      delay = atoi(optarg);
      break;
313

314
315
316
    case 'D':
      maxDoppler = atoi(optarg);
      break;
317

318
319
320
    case 'm':
      mcs = atoi(optarg);
      break;
321

322
323
324
    case 'n':
      n_frames = atoi(optarg);
      break;
325

326
327
    case 'Y':
      n_ch_rlz = atoi(optarg);
328
329
      break;

330
331
    case 'X':
      abstx= atoi(optarg);
332
333
      break;

334
    case 'g':
335
      sprintf(channel_model_input,optarg,10);
336

337
      switch((char)*optarg) {
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
      case 'A':
        channel_model=SCM_A;
        chMod = 2;
        break;

      case 'B':
        channel_model=SCM_B;
        chMod = 3;
        break;

      case 'C':
        channel_model=SCM_C;
        chMod = 4;
        break;

      case 'D':
        channel_model=SCM_D;
        chMod = 5;
        break;

      case 'E':
        channel_model=EPA;
        chMod = 6;
        break;

      case 'F':
        channel_model=EVA;
        chMod = 7;
        break;

      case 'G':
        channel_model=ETU;
        chMod = 8;
        break;

373
      case 'H':
374
375
376
377
        channel_model=Rayleigh8;
        chMod = 9;
        break;

378
      case 'I':
379
380
381
382
        channel_model=Rayleigh1;
        chMod = 10;
        break;

383
      case 'J':
384
385
386
387
        channel_model=Rayleigh1_corr;
        chMod = 11;
        break;

388
      case 'K':
389
390
391
392
        channel_model=Rayleigh1_anticorr;
        chMod = 12;
        break;

393
      case 'L':
394
395
396
397
        channel_model=Rice8;
        chMod = 13;
        break;

398
      case 'M':
399
400
401
402
        channel_model=Rice1;
        chMod = 14;
        break;

403
      case 'N':
404
405
406
407
        channel_model=AWGN;
        chMod = 1;
        break;

408
      default:
409
        printf("Unsupported channel model!\n");
410
411
        exit(-1);
        break;
412
      }
413

414
      break;
415

416
    case 's':
knopp's avatar
   
knopp committed
417
418
      snr0 = atof(optarg);
      break;
419

knopp's avatar
   
knopp committed
420
421
422
    case 'w':
      snr_int = atof(optarg);
      break;
423

knopp's avatar
   
knopp committed
424
425
    case 'e':
      input_snr_step= atof(optarg);
426
      break;
427

428
429
    case 'x':
      transmission_mode=atoi(optarg);
430

431
      if ((transmission_mode!=1) &&
432
          (transmission_mode!=2)) {
433
        printf("Unsupported transmission mode %d\n",transmission_mode);
434
        exit(-1);
435
      }
436

437
      break;
438

439
440
441
    case 'y':
      n_rx = atoi(optarg);
      break;
442

443
444
445
    case 'S':
      subframe = atoi(optarg);
      break;
446

447
448
449
450
    case 'T':
      tdd_config=atoi(optarg);
      frame_type=TDD;
      break;
451

452
453
454
    case 'p':
      extended_prefix_flag=1;
      break;
455

456
457
    case 'r':
      nb_rb = atoi(optarg);
458
      nb_rb_set = 1;
459
      break;
460

461
462
463
    case 'f':
      first_rb = atoi(optarg);
      break;
464

465
466
467
    case 'c':
      cyclic_shift = atoi(optarg);
      break;
468

469
470
471
472
    case 'E':
      threequarter_fs=1;
      break;

473
474
475
    case 'N':
      N0 = atoi(optarg);
      break;
476

477
478
479
480
481
482
    case 'o':
      srs_flag = 1;
      break;

    case 'i':
      input_fdUL = fopen(optarg,"r");
483
      printf("Reading in %s (%p)\n",optarg,input_fdUL);
484

485
      if (input_fdUL == (FILE*)NULL) {
486
        printf("Unknown file %s\n",optarg);
487
        exit(-1);
488
      }
489

490
491
      //      input_file=1;
      break;
492

493
494
    case 'A':
      beta_ACK = atoi(optarg);
495

496
      if (beta_ACK>15) {
497
498
        printf("beta_ack must be in (0..15)\n");
        exit(-1);
499
      }
500

501
      break;
502

503
504
    case 'C':
      beta_CQI = atoi(optarg);
505

506
      if ((beta_CQI>15)||(beta_CQI<2)) {
507
508
        printf("beta_cqi must be in (2..15)\n");
        exit(-1);
509
      }
510

511
      break;
512

513
514
    case 'R':
      beta_RI = atoi(optarg);
515

516
      if ((beta_RI>15)||(beta_RI<2)) {
517
518
        printf("beta_ri must be in (0..13)\n");
        exit(-1);
519
      }
520

521
      break;
522

523
524
525
    case 'Q':
      cqi_flag=1;
      break;
526

527
528
529
    case 'B':
      N_RB_DL=atoi(optarg);
      break;
530

531
532
    case 'P':
      dump_perf=1;
533
      opp_enabled=1;
534
      break;
535

536
537
538
539
    case 'O':
      test_perf=atoi(optarg);
      //print_perf =1;
      break;
540

541
    case 'L':
542
      parallel_flag=1;
543
      break;
544

545
546
547
    case 'I':
      max_turbo_iterations=atoi(optarg);
      break;
548

549
550
551
552
    case 'F':
      xforms=1;
      break;

553
554
555
    case 'Z':
      dump_table = 1;
      break;
556

557
558
    case 'h':
    default:
559
560
      printf("%s -h(elp) -a(wgn on) -m mcs -n n_frames -s snr0 -t delay_spread -p (extended prefix on) -r nb_rb -f first_rb -c cyclic_shift -o (srs on) -g channel_model [A:M] Use 3GPP 25.814 SCM-A/B/C/D('A','B','C','D') or 36-101 EPA('E'), EVA ('F'),ETU('G') models (ignores delay spread and Ricean factor), Rayghleigh8 ('H'), Rayleigh1('I'), Rayleigh1_corr('J'), Rayleigh1_anticorr ('K'), Rice8('L'), Rice1('M'), -d Channel delay, -D maximum Doppler shift \n",
             argv[0]);
561
562
563
564
      exit(1);
      break;
    }
  }
565

566
  lte_param_init(1,
Xiwen JIANG's avatar
Xiwen JIANG committed
567
                 1, 
568
569
570
571
572
573
574
		 n_rx,
		 1,
		 extended_prefix_flag,
		 frame_type,
		 0,
		 tdd_config,
		 N_RB_DL,
575
		 threequarter_fs,
576
577
		 osf,
		 0);
578

Calisson's avatar
Calisson committed
579
580
581
582
583
  // for a call to phy_reset_ue later we need PHY_vars_UE_g allocated and pointing to UE
  PHY_vars_UE_g = (PHY_VARS_UE***)malloc(sizeof(PHY_VARS_UE**));
  PHY_vars_UE_g[0] = (PHY_VARS_UE**) malloc(sizeof(PHY_VARS_UE*));
  PHY_vars_UE_g[0][0] = UE;

584
  if (nb_rb_set == 0)
585
    nb_rb = eNB->frame_parms.N_RB_UL;
586

587
  printf("1 . rxdataF_comp[0] %p\n",eNB->pusch_vars[0]->rxdataF_comp[0][0]);
588
  printf("Setting mcs = %d\n",mcs);
589
  printf("n_frames = %d\n", n_frames);
590

knopp's avatar
   
knopp committed
591
  snr1 = snr0+snr_int;
592
593
  printf("SNR0 %f, SNR1 %f\n",snr0,snr1);

594
  frame_parms = &eNB->frame_parms;
595

596
  txdata = UE->common_vars.txdata;
597

598
  nsymb = (eNB->frame_parms.Ncp == NORMAL) ? 14 : 12;
599
600


601
  sprintf(bler_fname,"ULbler_mcs%d_nrb%d_ChannelModel%d_nsim%d.csv",mcs,nb_rb,chMod,n_frames);
602
  bler_fd = fopen(bler_fname,"w");
603
604
605
606
  if (bler_fd==NULL) {
    fprintf(stderr,"Problem creating file %s\n",bler_fname);
    exit(-1);
  }
607

608
  fprintf(bler_fd,"#SNR;mcs;nb_rb;TBS;rate;errors[0];trials[0];errors[1];trials[1];errors[2];trials[2];errors[3];trials[3]\n");
609
610

  if (test_perf != 0) {
611
612
613
614
    char hostname[1024];
    hostname[1023] = '\0';
    gethostname(hostname, 1023);
    printf("Hostname: %s\n", hostname);
615
616
617
618
    //char dirname[FILENAME_MAX];
    //sprintf(dirname, "%s//SIMU/USER/pre-ci-logs-%s", getenv("OPENAIR_TARGETS"),hostname);
    //mkdir(dirname, 0777);
    sprintf(time_meas_fname,"time_meas_prb%d_mcs%d_antrx%d_channel%s_tx%d.csv",
619
            N_RB_DL,mcs,n_rx,channel_model_input,transmission_mode);
620
    time_meas_fd = fopen(time_meas_fname,"w");
621
622
623
624
    if (time_meas_fd==NULL) {
      fprintf(stderr,"Cannot create file %s!\n",time_meas_fname);
      exit(-1);
    }
625
  }
626
627
628

  if(abstx) {
    // CSV file
629
630
    sprintf(csv_fname,"EULdataout_tx%d_mcs%d_nbrb%d_chan%d_nsimus%d_eren.m",transmission_mode,mcs,nb_rb,chMod,n_frames);
    csv_fdUL = fopen(csv_fname,"w");
631
632
633
634
    if (csv_fdUL == NULL) {
      fprintf(stderr,"Problem opening file %s\n",csv_fname);
      exit(-1);
    }
635
636
    fprintf(csv_fdUL,"data_all%d=[",mcs);
  }
637

638

639
640
641
642
643
644
  if (xforms==1) {
    fl_initialize (&argc, argv, NULL, 0, 0);
    form_enb = create_lte_phy_scope_enb();
    sprintf (title, "LTE PHY SCOPE eNB");
    fl_show_form (form_enb->lte_phy_scope_enb, FL_PLACE_HOTSPOT, FL_FULLBORDER, title);
  }
645

Bilel's avatar
Bilel committed
646
  UE->pdcch_vars[0][0]->crnti = 14;
647

648
  UE->frame_parms.soundingrs_ul_config_common.enabled_flag = srs_flag;
649
  UE->frame_parms.soundingrs_ul_config_common.srs_BandwidthConfig = 2;
650
651
652
653
  UE->frame_parms.soundingrs_ul_config_common.srs_SubframeConfig = 3;
  UE->soundingrs_ul_config_dedicated[eNB_id].srsConfigDedicatedSetup = srs_flag;
  UE->soundingrs_ul_config_dedicated[eNB_id].duration = 1;
  UE->soundingrs_ul_config_dedicated[eNB_id].srs_ConfigIndex = 2;
654
655
656
  UE->soundingrs_ul_config_dedicated[eNB_id].srs_Bandwidth = 0;
  UE->soundingrs_ul_config_dedicated[eNB_id].transmissionComb = 0;
  UE->soundingrs_ul_config_dedicated[eNB_id].freqDomainPosition = 0;
657
  UE->soundingrs_ul_config_dedicated[eNB_id].cyclicShift = 0;
658

659
  eNB->frame_parms.soundingrs_ul_config_common.enabled_flag = srs_flag;
660
  eNB->frame_parms.soundingrs_ul_config_common.srs_BandwidthConfig = 2;
661
662
663
664
  eNB->frame_parms.soundingrs_ul_config_common.srs_SubframeConfig = 3;
  eNB->soundingrs_ul_config_dedicated[UE_id].srsConfigDedicatedSetup = srs_flag;
  eNB->soundingrs_ul_config_dedicated[UE_id].duration = 1;
  eNB->soundingrs_ul_config_dedicated[UE_id].srs_ConfigIndex = 2;
665
666
667
  eNB->soundingrs_ul_config_dedicated[UE_id].srs_Bandwidth = 0;
  eNB->soundingrs_ul_config_dedicated[UE_id].transmissionComb = 0;
  eNB->soundingrs_ul_config_dedicated[UE_id].freqDomainPosition = 0;
668
669
  eNB->soundingrs_ul_config_dedicated[UE_id].cyclicShift = 0;

670
  eNB->cooperation_flag = cooperation_flag;
671

672
673
674
675
676
677
  eNB->pusch_config_dedicated[UE_id].betaOffset_ACK_Index = beta_ACK;
  eNB->pusch_config_dedicated[UE_id].betaOffset_RI_Index  = beta_RI;
  eNB->pusch_config_dedicated[UE_id].betaOffset_CQI_Index = beta_CQI;
  UE->pusch_config_dedicated[eNB_id].betaOffset_ACK_Index = beta_ACK;
  UE->pusch_config_dedicated[eNB_id].betaOffset_RI_Index  = beta_RI;
  UE->pusch_config_dedicated[eNB_id].betaOffset_CQI_Index = beta_CQI;
Florian Kaltenberger's avatar
Florian Kaltenberger committed
678

679
  UE->ul_power_control_dedicated[eNB_id].deltaMCS_Enabled = 1;
680

681
682
683
684
685
  // disable periodic cqi/ri reporting
  UE->cqi_report_config[eNB_id].CQI_ReportPeriodic.ri_ConfigIndex = -1;
  UE->cqi_report_config[eNB_id].CQI_ReportPeriodic.cqi_PMI_ConfigIndex = -1;


686
687
  printf("PUSCH Beta : ACK %f, RI %f, CQI %f\n",(double)beta_ack[beta_ACK]/8,(double)beta_ri[beta_RI]/8,(double)beta_cqi[beta_CQI]/8);

688
689
  UE2eNB = new_channel_desc_scm(eNB->frame_parms.nb_antennas_tx,
                                UE->frame_parms.nb_antennas_rx,
690
                                channel_model,
691
692
				N_RB2sampling_rate(eNB->frame_parms.N_RB_UL),
				N_RB2channel_bandwidth(eNB->frame_parms.N_RB_UL),
693
694
695
696
697
698
699
                                forgetting_factor,
                                delay,
                                0);
  // set Doppler
  UE2eNB->max_Doppler = maxDoppler;

  // NN: N_RB_UL has to be defined in ulsim
700
701
  eNB->ulsch[0] = new_eNB_ulsch(max_turbo_iterations,N_RB_DL,0);
  UE->ulsch[0]   = new_ue_ulsch(N_RB_DL,0);
702

703
  if (parallel_flag == 1) {
704
705
    extern void init_fep_thread(PHY_VARS_eNB *, pthread_attr_t *);
    extern void init_td_thread(PHY_VARS_eNB *, pthread_attr_t *);
706
707
708
    init_fep_thread(eNB,NULL);
    init_td_thread(eNB,NULL);
  }
709
  // Create transport channel structures for 2 transport blocks (MIMO)
710
  for (i=0; i<2; i++) {
711
    eNB->dlsch[0][i] = new_eNB_dlsch(1,8,1827072,N_RB_DL,0,&eNB->frame_parms);
712
    UE->dlsch[subframe&1][0][i]  = new_ue_dlsch(1,8,1827072,MAX_TURBO_ITERATIONS,N_RB_DL,0);
713

714
    if (!eNB->dlsch[0][i]) {
715
716
717
      printf("Can't get eNB dlsch structures\n");
      exit(-1);
    }
718

719
    if (!UE->dlsch[subframe&1][0][i]) {
720
721
722
      printf("Can't get ue dlsch structures\n");
      exit(-1);
    }
723

724
    eNB->dlsch[0][i]->rnti = 14;
725
    UE->dlsch[subframe&1][0][i]->rnti   = 14;
726

727
  } 
728

729
730
  UE->dlsch_SI[0]  = new_ue_dlsch(1,1,1827072,MAX_TURBO_ITERATIONS,N_RB_DL,0);
  UE->dlsch_ra[0]  = new_ue_dlsch(1,1,1827072,MAX_TURBO_ITERATIONS,N_RB_DL,0);
731

732
733
734
735
736
737
738
739
740
741
742
  UE->measurements.rank[0] = 0;
  UE->transmission_mode[0] = 2;
  UE->pucch_config_dedicated[0].tdd_AckNackFeedbackMode = bundling_flag == 1 ? bundling : multiplexing;
  eNB->transmission_mode[0] = 2;
  eNB->pucch_config_dedicated[0].tdd_AckNackFeedbackMode = bundling_flag == 1 ? bundling : multiplexing;
  UE->frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled = 1;
  eNB->frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled = 1;
  UE->frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = 0;
  eNB->frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = 0;
  UE->frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = 0;
  eNB->frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = 0;
743
744


knopp's avatar
knopp committed
745
  UE->mac_enabled=0;
746
  
knopp's avatar
knopp committed
747
748
  eNB_rxtx_proc_t *proc_rxtx   = &eNB->proc.proc_rxtx[subframe&1];
  UE_rxtx_proc_t *proc_rxtx_ue = &UE->proc.proc_rxtx[subframe&1];
knopp's avatar
knopp committed
749
750
  proc_rxtx->frame_rx=1;
  proc_rxtx->subframe_rx=subframe;
751

knopp's avatar
knopp committed
752
753
  proc_rxtx->frame_tx=pdcch_alloc2ul_frame(&eNB->frame_parms,1,subframe);
  proc_rxtx->subframe_tx=pdcch_alloc2ul_subframe(&eNB->frame_parms,subframe);
754

knopp's avatar
knopp committed
755
756
757
758
  proc_rxtx_ue->frame_tx = proc_rxtx->frame_rx;
  proc_rxtx_ue->frame_rx = proc_rxtx->frame_tx;
  proc_rxtx_ue->subframe_tx = proc_rxtx->subframe_rx;
  proc_rxtx_ue->subframe_rx = proc_rxtx->subframe_tx;
knopp's avatar
   
knopp committed
759

760
  printf("Init UL hopping UE\n");
761
  init_ul_hopping(&UE->frame_parms);
762
  printf("Init UL hopping eNB\n");
763
  init_ul_hopping(&eNB->frame_parms);
764
765


766
  UE->dlsch[subframe&1][0][0]->harq_ack[ul_subframe2pdcch_alloc_subframe(&eNB->frame_parms,subframe)].send_harq_status = 1;
767

knopp's avatar
knopp committed
768
769
  UE->ulsch_Msg3_active[eNB_id] = 0;
  UE->ul_power_control_dedicated[eNB_id].accumulationEnabled=1;
knopp's avatar
knopp committed
770
  /*
771
  generate_ue_ulsch_params_from_dci((void *)&UL_alloc_pdu,
772
                                    14,
knopp's avatar
knopp committed
773
                                    proc_rxtx->subframe_tx,
774
                                    format0,
775
                                    UE,
knopp's avatar
knopp committed
776
				    proc_rxtx_ue,
777
778
779
780
781
782
                                    SI_RNTI,
                                    0,
                                    P_RNTI,
                                    CBA_RNTI,
                                    0,
                                    srs_flag);
783
784
785

  //  printf("RIV %d\n",UL_alloc_pdu.rballoc);

knopp's avatar
knopp committed
786
  generate_eNB_ulsch_params_from_dci(eNB,proc_rxtx,
787
				     (void *)&UL_alloc_pdu,
788
789
790
                                     14,
                                     format0,
                                     0,
791
				     SI_RNTI,
792
793
794
795
                                     0,
                                     P_RNTI,
                                     CBA_RNTI,
                                     srs_flag);
knopp's avatar
knopp committed
796
  */
797

798
799
  coded_bits_per_codeword = nb_rb * (12 * get_Qm_ul(mcs)) * nsymb;

800
  if (cqi_flag == 1) coded_bits_per_codeword-=UE->ulsch[0]->O;
801
802
803
804

  rate = (double)dlsch_tbs25[get_I_TBS(mcs)][nb_rb-1]/(coded_bits_per_codeword);

  printf("Rate = %f (mod %d), coded bits %d\n",rate,get_Qm_ul(mcs),coded_bits_per_codeword);
805
806


807
808
809

  for (ch_realization=0; ch_realization<n_ch_rlz; ch_realization++) {

810
811
812
813
814
815
    /*
      if(abstx){
      int ulchestim_f[300*12];
      int ulchestim_t[2*(frame_parms->ofdm_symbol_size)];
      }
    */
816
817

    if(abstx) {
818
819
820
      printf("**********************Channel Realization Index = %d **************************\n", ch_realization);
      saving_bler=1;
    }
821

822

knopp's avatar
   
knopp committed
823
    //    if ((subframe>5) || (subframe < 4))
824
    //      UE->frame++;
825
826

    for (SNR=snr0; SNR<snr1; SNR+=input_snr_step) {
827
828
829
830
831
832
833
834
835
836
837
838
839
      errs[0]=0;
      errs[1]=0;
      errs[2]=0;
      errs[3]=0;
      round_trials[0] = 0;
      round_trials[1] = 0;
      round_trials[2] = 0;
      round_trials[3] = 0;
      cqi_errors=0;
      ack_errors=0;
      cqi_crc_falsepositives=0;
      cqi_crc_falsenegatives=0;
      round=0;
840

841
842
      //randominit(0);

knopp's avatar
   
knopp committed
843

knopp's avatar
knopp committed
844
      harq_pid = subframe2harq_pid(&UE->frame_parms,proc_rxtx_ue->frame_tx,subframe);
845
      input_buffer_length = UE->ulsch[0]->harq_processes[harq_pid]->TBS/8;
knopp's avatar
knopp committed
846
      input_buffer = (unsigned char *)memalign(32,input_buffer_length+64);
847
      //      printf("UL frame %d/subframe %d, harq_pid %d\n",UE->frame,subframe,harq_pid);
848
      if (input_fdUL == NULL) {
849

850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870

        if (n_frames == 1) {
          trch_out_fdUL= fopen("ulsch_trchUL.txt","w");

          for (i=0; i<input_buffer_length; i++) {
            input_buffer[i] = taus()&0xff;

            for (j=0; j<8; j++)
              fprintf(trch_out_fdUL,"%d\n",(input_buffer[i]>>(7-j))&1);
          }

          fclose(trch_out_fdUL);
        } else {
          for (i=0; i<input_buffer_length; i++)
            input_buffer[i] = taus()&0xff;
        }
      } else {
        n_frames=1;
        i=0;

        while (!feof(input_fdUL)) {
871
          ret=fscanf(input_fdUL,"%s %s",input_val_str,input_val_str2);//&input_val1,&input_val2);
872
          if (ret != 2) printf("ERROR: error reading file\n");
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894

          if ((i%4)==0) {
            ((short*)txdata[0])[i/2] = (short)((1<<15)*strtod(input_val_str,NULL));
            ((short*)txdata[0])[(i/2)+1] = (short)((1<<15)*strtod(input_val_str2,NULL));

            if ((i/4)<100)
              printf("sample %d => %e + j%e (%d +j%d)\n",i/4,strtod(input_val_str,NULL),strtod(input_val_str2,NULL),((short*)txdata[0])[i/4],((short*)txdata[0])[(i/4)+1]);//1,input_val2,);
          }

          i++;

          if (i>(FRAME_LENGTH_SAMPLES))
            break;
        }

        printf("Read in %d samples\n",i/4);
        //      write_output("txsig0UL.m","txs0", txdata[0],2*frame_parms->samples_per_tti,1,1);
        //    write_output("txsig1.m","txs1", txdata[1],FRAME_LENGTH_COMPLEX_SAMPLES,1,1);
        tx_lev = signal_energy(&txdata[0][0],
                               OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES);
        tx_lev_dB = (unsigned int) dB_fixed(tx_lev);

895
896
      }

897
898
      avg_iter = 0;
      iter_trials=0;
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
      reset_meas(&UE->phy_proc_tx);
      reset_meas(&UE->ofdm_mod_stats);
      reset_meas(&UE->ulsch_modulation_stats);
      reset_meas(&UE->ulsch_encoding_stats);
      reset_meas(&UE->ulsch_interleaving_stats);
      reset_meas(&UE->ulsch_rate_matching_stats);
      reset_meas(&UE->ulsch_turbo_encoding_stats);
      reset_meas(&UE->ulsch_segmentation_stats);
      reset_meas(&UE->ulsch_multiplexing_stats);

      reset_meas(&eNB->phy_proc_rx);
      reset_meas(&eNB->ofdm_demod_stats);
      reset_meas(&eNB->ulsch_channel_estimation_stats);
      reset_meas(&eNB->ulsch_freq_offset_estimation_stats);
      reset_meas(&eNB->rx_dft_stats);
      reset_meas(&eNB->ulsch_decoding_stats);
      reset_meas(&eNB->ulsch_turbo_decoding_stats);
      reset_meas(&eNB->ulsch_deinterleaving_stats);
      reset_meas(&eNB->ulsch_demultiplexing_stats);
      reset_meas(&eNB->ulsch_rate_unmatching_stats);
      reset_meas(&eNB->ulsch_tc_init_stats);
      reset_meas(&eNB->ulsch_tc_alpha_stats);
      reset_meas(&eNB->ulsch_tc_beta_stats);
      reset_meas(&eNB->ulsch_tc_gamma_stats);
      reset_meas(&eNB->ulsch_tc_ext_stats);
      reset_meas(&eNB->ulsch_tc_intl1_stats);
      reset_meas(&eNB->ulsch_tc_intl2_stats);
926

knopp's avatar
knopp committed
927
      // initialization 
928
929
      struct list time_vector_tx;
      initialize(&time_vector_tx);
930
931
932
933
934
935
936
      struct list time_vector_tx_ifft;
      initialize(&time_vector_tx_ifft);
      struct list time_vector_tx_mod;
      initialize(&time_vector_tx_mod);
      struct list time_vector_tx_enc;
      initialize(&time_vector_tx_enc);

937
938
      struct list time_vector_rx;
      initialize(&time_vector_rx);
939
940
941
942
943
944
      struct list time_vector_rx_fft;
      initialize(&time_vector_rx_fft);
      struct list time_vector_rx_demod;
      initialize(&time_vector_rx_demod);
      struct list time_vector_rx_dec;
      initialize(&time_vector_rx_dec);
945

knopp's avatar
knopp committed
946
      ndi=0;
947

948
      phy_reset_ue(0,0,0);
949
950
      UE->UE_mode[eNB_id]=PUSCH;

951
952
      for (trials = 0; trials<n_frames; trials++) {
        //      printf("*");
953
954
        //        UE->frame++;
        //        eNB->frame++;
knopp's avatar
knopp committed
955
	ndi = (1-ndi);
956
957
958
959
        fflush(stdout);
        round=0;

        while (round < 4) {
960
961
          eNB->ulsch[0]->harq_processes[harq_pid]->round=round;
          UE->ulsch[0]->harq_processes[harq_pid]->round=round;
knopp's avatar
knopp committed
962
	  //	  printf("Trial %d : Round %d (subframe %d, frame %d)\n",trials,round,proc_rxtx_ue->subframe_rx,proc_rxtx_ue->frame_rx);
963
964
965
          round_trials[round]++;


knopp's avatar
knopp committed
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
	  fill_ulsch_dci(eNB,(void*)&UL_alloc_pdu,first_rb,nb_rb,mcs,ndi,cqi_flag);

	  UE->ulsch_Msg3_active[eNB_id] = 0;
	  UE->ul_power_control_dedicated[eNB_id].accumulationEnabled=1;
	  generate_ue_ulsch_params_from_dci((void *)&UL_alloc_pdu,
					    14,
					    proc_rxtx->subframe_tx,
					    format0,
					    UE,
					    proc_rxtx_ue,
					    SI_RNTI,
					    0,
					    P_RNTI,
					    CBA_RNTI,
					    0,
					    srs_flag);

	  generate_eNB_ulsch_params_from_dci(eNB,proc_rxtx,
					     (void *)&UL_alloc_pdu,
					     14,
					     format0,
					     0,
					     SI_RNTI,
					     0,
					     P_RNTI,
					     CBA_RNTI,
					     srs_flag);
	  eNB->ulsch[0]->harq_processes[harq_pid]->subframe_scheduling_flag = 1;
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012

          /////////////////////
          if (abstx) {
            if (trials==0 && round==0 && SNR==snr0) { //generate a new channel
              hold_channel = 0;
              flagMag=0;
            } else {
              hold_channel = 1;
              flagMag = 1;
            }
          } else {
            hold_channel = 0;
            flagMag=1;
          }

          ///////////////////////////////////////

          if (input_fdUL == NULL) {

knopp's avatar
knopp committed
1013
1014
1015
1016
1017
1018
	    eNB->proc.frame_rx = 1;
	    eNB->proc.subframe_rx = subframe;
	    proc_rxtx_ue->frame_tx = proc_rxtx->frame_rx;
	    proc_rxtx_ue->frame_rx = proc_rxtx->frame_tx;
	    proc_rxtx_ue->subframe_tx = proc_rxtx->subframe_rx;
	    proc_rxtx_ue->subframe_rx = proc_rxtx->subframe_tx;
1019

knopp's avatar
knopp committed
1020
	    phy_procedures_UE_TX(UE,proc_rxtx_ue,0,0,normal_txrx,no_relay);
1021

knopp's avatar
knopp committed
1022
	    /*
1023
            if (srs_flag)
1024
              generate_srs_tx(UE,0,AMP,subframe);
1025

knopp's avatar
knopp committed
1026
            generate_drs_pusch(UE,proc_rxtx_ue,0,
1027
                               AMP,subframe,
1028
1029
                               UE->ulsch[0]->harq_processes[harq_pid]->first_rb,
                               UE->ulsch[0]->harq_processes[harq_pid]->nb_rb,
1030
1031
1032
                               0);

            if ((cqi_flag == 1) && (n_frames == 1) ) {
1033
1034
1035
              printf("CQI information (O %d) %d %d\n",UE->ulsch[0]->O,
                     UE->ulsch[0]->o[0],UE->ulsch[0]->o[1]);
              print_CQI(UE->ulsch[0]->o,UE->ulsch[0]->uci_format,UE->frame_parms.N_RB_DL,0);
1036
1037
            }

1038
            UE->ulsch[0]->o_ACK[0] = taus()&1;
1039

1040
            start_meas(&UE->ulsch_encoding_stats);
1041
1042

            if (ulsch_encoding(input_buffer,
1043
                               UE,
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
                               harq_pid,
                               eNB_id,
                               2, // transmission mode
                               control_only_flag,
                               1// Nbundled
                              )==-1) {
              printf("ulsim.c Problem with ulsch_encoding\n");
              exit(-1);
            }