ulsim.c 64.6 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
45
#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"

46
47
#include "unitary_defs.h"

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

50
51
52
53
PHY_VARS_eNB *eNB;
PHY_VARS_UE *UE;


Florian Kaltenberger's avatar
Florian Kaltenberger committed
54

55

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

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
61
node_desc_t *enb_data[NUMBER_OF_eNB_MAX];
62
63
64
node_desc_t *ue_data[NUMBER_OF_UE_MAX];
//double sinr_bler_map[MCS_COUNT][2][16];

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

68
int xforms=0;
69
70
71
FD_lte_phy_scope_enb *form_enb;
char title[255];

72
73
74
75
76
77
78
79
/*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
80
81
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

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;
  }

}

extern void eNB_fep_full(PHY_VARS_eNB *eNB);
166
extern void eNB_fep_full_2thread(PHY_VARS_eNB *eNB);
knopp's avatar
knopp committed
167

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

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

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

  int **txdata;

  LTE_DL_FRAME_PARMS *frame_parms;
183
184
185
186
187
188
  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};
189
190
  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
191
  uint8_t extended_prefix_flag=0;
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
  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;
  unsigned char l;

  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;
209
  unsigned int tx_lev=0,tx_lev_dB,trials,errs[4]= {0,0,0,0},round_trials[4]= {0,0,0,0};
210
  uint8_t transmission_mode=1,n_rx=1;
211

212
  FILE *bler_fd=NULL;
213
  char bler_fname[512];
214

215
216
  FILE *time_meas_fd=NULL;
  char time_meas_fname[256];
217

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

222
  //  FILE *rx_frame_file;
223
  FILE *csv_fdUL=NULL;
224

225
  /*
226
  FILE *fperen=NULL;
227
228
  char fperen_name[512];

229
  FILE *fmageren=NULL;
230
  char fmageren_name[512];
231

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

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

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

gauthier's avatar
gauthier committed
247
  uint8_t control_only_flag = 0;
248
249
  int delay = 0;
  double maxDoppler = 0.0;
gauthier's avatar
gauthier committed
250
  uint8_t srs_flag = 0;
251

gauthier's avatar
gauthier committed
252
  uint8_t N_RB_DL=25,osf=1;
253

gauthier's avatar
gauthier committed
254
255
256
257
  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;
258

gauthier's avatar
gauthier committed
259
  uint8_t N0=30;
260
261
262
263
264
265
266
  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;
267
  int test_perf=0;
268
269
  int dump_table =0;

270
271
  double effective_rate=0.0;
  char channel_model_input[10];
272

273
  uint8_t max_turbo_iterations=4;
274
  uint8_t parallel_flag=0;
275
  int nb_rb_set = 0;
276

277
  int threequarter_fs=0;
knopp's avatar
knopp committed
278
279
  int ndi;

knopp's avatar
   
knopp committed
280
281
  opp_enabled=1; // to enable the time meas

282
  cpu_freq_GHz = (double)get_cpu_freq_GHz();
283
284
285
286
287
288

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


  logInit();

289
  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) {
290
291
292
293
294
    switch (c) {
    case 'a':
      channel_model = AWGN;
      chMod = 1;
      break;
295

296
297
298
    case 'b':
      bundling_flag = 0;
      break;
299

300
301
302
    case 'd':
      delay = atoi(optarg);
      break;
303

304
305
306
    case 'D':
      maxDoppler = atoi(optarg);
      break;
307

308
309
310
    case 'm':
      mcs = atoi(optarg);
      break;
311

312
313
314
    case 'n':
      n_frames = atoi(optarg);
      break;
315

316
317
    case 'Y':
      n_ch_rlz = atoi(optarg);
318
319
      break;

320
321
    case 'X':
      abstx= atoi(optarg);
322
323
      break;

324
    case 'g':
325
      sprintf(channel_model_input,optarg,10);
326

327
      switch((char)*optarg) {
328
329
330
331
332
333
334
335
336
337
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
      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;

363
      case 'H':
364
365
366
367
        channel_model=Rayleigh8;
        chMod = 9;
        break;

368
      case 'I':
369
370
371
372
        channel_model=Rayleigh1;
        chMod = 10;
        break;

373
      case 'J':
374
375
376
377
        channel_model=Rayleigh1_corr;
        chMod = 11;
        break;

378
      case 'K':
379
380
381
382
        channel_model=Rayleigh1_anticorr;
        chMod = 12;
        break;

383
      case 'L':
384
385
386
387
        channel_model=Rice8;
        chMod = 13;
        break;

388
      case 'M':
389
390
391
392
        channel_model=Rice1;
        chMod = 14;
        break;

393
      case 'N':
394
395
396
397
        channel_model=AWGN;
        chMod = 1;
        break;

398
      default:
399
        printf("Unsupported channel model!\n");
400
401
        exit(-1);
        break;
402
      }
403

404
      break;
405

406
    case 's':
knopp's avatar
   
knopp committed
407
408
      snr0 = atof(optarg);
      break;
409

knopp's avatar
   
knopp committed
410
411
412
    case 'w':
      snr_int = atof(optarg);
      break;
413

knopp's avatar
   
knopp committed
414
415
    case 'e':
      input_snr_step= atof(optarg);
416
      break;
417

418
419
    case 'x':
      transmission_mode=atoi(optarg);
420

421
      if ((transmission_mode!=1) &&
422
          (transmission_mode!=2)) {
423
        printf("Unsupported transmission mode %d\n",transmission_mode);
424
        exit(-1);
425
      }
426

427
      break;
428

429
430
431
    case 'y':
      n_rx = atoi(optarg);
      break;
432

433
434
435
    case 'S':
      subframe = atoi(optarg);
      break;
436

437
438
439
440
    case 'T':
      tdd_config=atoi(optarg);
      frame_type=TDD;
      break;
441

442
443
444
    case 'p':
      extended_prefix_flag=1;
      break;
445

446
447
    case 'r':
      nb_rb = atoi(optarg);
448
      nb_rb_set = 1;
449
      break;
450

451
452
453
    case 'f':
      first_rb = atoi(optarg);
      break;
454

455
456
457
    case 'c':
      cyclic_shift = atoi(optarg);
      break;
458

459
460
461
462
    case 'E':
      threequarter_fs=1;
      break;

463
464
465
    case 'N':
      N0 = atoi(optarg);
      break;
466

467
468
469
470
471
472
    case 'o':
      srs_flag = 1;
      break;

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

475
      if (input_fdUL == (FILE*)NULL) {
476
        printf("Unknown file %s\n",optarg);
477
        exit(-1);
478
      }
479

480
481
      //      input_file=1;
      break;
482

483
484
    case 'A':
      beta_ACK = atoi(optarg);
485

486
      if (beta_ACK>15) {
487
488
        printf("beta_ack must be in (0..15)\n");
        exit(-1);
489
      }
490

491
      break;
492

493
494
    case 'C':
      beta_CQI = atoi(optarg);
495

496
      if ((beta_CQI>15)||(beta_CQI<2)) {
497
498
        printf("beta_cqi must be in (2..15)\n");
        exit(-1);
499
      }
500

501
      break;
502

503
504
    case 'R':
      beta_RI = atoi(optarg);
505

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

511
      break;
512

513
514
515
    case 'Q':
      cqi_flag=1;
      break;
516

517
518
519
    case 'B':
      N_RB_DL=atoi(optarg);
      break;
520

521
522
    case 'P':
      dump_perf=1;
523
      opp_enabled=1;
524
      break;
525

526
527
528
529
    case 'O':
      test_perf=atoi(optarg);
      //print_perf =1;
      break;
530

531
    case 'L':
532
      parallel_flag=1;
533
      break;
534

535
536
537
    case 'I':
      max_turbo_iterations=atoi(optarg);
      break;
538

539
540
541
542
    case 'F':
      xforms=1;
      break;

543
544
545
    case 'Z':
      dump_table = 1;
      break;
546

547
548
    case 'h':
    default:
549
550
      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]);
551
552
553
554
      exit(1);
      break;
    }
  }
555

556
  lte_param_init(1,
Xiwen JIANG's avatar
Xiwen JIANG committed
557
                 1, 
558
559
560
561
562
563
564
		 n_rx,
		 1,
		 extended_prefix_flag,
		 frame_type,
		 0,
		 tdd_config,
		 N_RB_DL,
565
		 threequarter_fs,
566
567
		 osf,
		 0);
568

569
  if (nb_rb_set == 0)
570
    nb_rb = eNB->frame_parms.N_RB_UL;
571

572
  printf("1 . rxdataF_comp[0] %p\n",eNB->pusch_vars[0]->rxdataF_comp[0][0]);
573
  printf("Setting mcs = %d\n",mcs);
574
  printf("n_frames = %d\n", n_frames);
575

knopp's avatar
   
knopp committed
576
  snr1 = snr0+snr_int;
577
578
  printf("SNR0 %f, SNR1 %f\n",snr0,snr1);

579
  frame_parms = &eNB->frame_parms;
580

581
  txdata = UE->common_vars.txdata;
582

583

584

585
  nsymb = (eNB->frame_parms.Ncp == NORMAL) ? 14 : 12;
586
587


588
  sprintf(bler_fname,"ULbler_mcs%d_nrb%d_ChannelModel%d_nsim%d.csv",mcs,nb_rb,chMod,n_frames);
589
  bler_fd = fopen(bler_fname,"w");
590
591
592
593
  if (bler_fd==NULL) {
    fprintf(stderr,"Problem creating file %s\n",bler_fname);
    exit(-1);
  }
594

595
  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");
596
597

  if (test_perf != 0) {
598
599
600
601
    char hostname[1024];
    hostname[1023] = '\0';
    gethostname(hostname, 1023);
    printf("Hostname: %s\n", hostname);
602
603
604
605
    //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",
606
            N_RB_DL,mcs,n_rx,channel_model_input,transmission_mode);
607
    time_meas_fd = fopen(time_meas_fname,"w");
608
609
610
611
    if (time_meas_fd==NULL) {
      fprintf(stderr,"Cannot create file %s!\n",time_meas_fname);
      exit(-1);
    }
612
  }
613
614
615

  if(abstx) {
    // CSV file
616
617
    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");
618
619
620
621
    if (csv_fdUL == NULL) {
      fprintf(stderr,"Problem opening file %s\n",csv_fname);
      exit(-1);
    }
622
623
    fprintf(csv_fdUL,"data_all%d=[",mcs);
  }
624

625

626
627
628
629
630
631
  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);
  }
632

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

635
636
637
638
639
  UE->frame_parms.soundingrs_ul_config_common.srs_BandwidthConfig = 2;
  UE->frame_parms.soundingrs_ul_config_common.srs_SubframeConfig = 7;
  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;
640

641
642
  eNB->frame_parms.soundingrs_ul_config_common.srs_BandwidthConfig = 2;
  eNB->frame_parms.soundingrs_ul_config_common.srs_SubframeConfig = 7;
643

644
645
646
647
648
649
  eNB->soundingrs_ul_config_dedicated[UE_id].srs_ConfigIndex = 1;
  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;
  eNB->cooperation_flag = cooperation_flag;
  //  eNB->eNB_UE_stats[0].SRS_parameters = UE->SRS_parameters;
650

651
652
653
654
655
656
  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
657

658
  UE->ul_power_control_dedicated[eNB_id].deltaMCS_Enabled = 1;
659

660
661
  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);

662
663
  UE2eNB = new_channel_desc_scm(eNB->frame_parms.nb_antennas_tx,
                                UE->frame_parms.nb_antennas_rx,
664
                                channel_model,
665
666
				N_RB2sampling_rate(eNB->frame_parms.N_RB_UL),
				N_RB2channel_bandwidth(eNB->frame_parms.N_RB_UL),
667
668
669
670
671
672
673
                                forgetting_factor,
                                delay,
                                0);
  // set Doppler
  UE2eNB->max_Doppler = maxDoppler;

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

677
678
679
680
  if (parallel_flag == 1) {
    init_fep_thread(eNB,NULL);
    init_td_thread(eNB,NULL);
  }
681
  // Create transport channel structures for 2 transport blocks (MIMO)
682
  for (i=0; i<2; i++) {
683
    eNB->dlsch[0][i] = new_eNB_dlsch(1,8,1827072,N_RB_DL,0,&eNB->frame_parms);
684
    UE->dlsch[0][i]  = new_ue_dlsch(1,8,1827072,MAX_TURBO_ITERATIONS,N_RB_DL,0);
685

686
    if (!eNB->dlsch[0][i]) {
687
688
689
      printf("Can't get eNB dlsch structures\n");
      exit(-1);
    }
690

691
    if (!UE->dlsch[0][i]) {
692
693
694
      printf("Can't get ue dlsch structures\n");
      exit(-1);
    }
695

696
697
    eNB->dlsch[0][i]->rnti = 14;
    UE->dlsch[0][i]->rnti   = 14;
698

699
  } 
700

701

702
703


704
705
706
707
708
709
710
711
712
713
714
  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;
715
716


knopp's avatar
knopp committed
717
  UE->mac_enabled=0;
718
  
knopp's avatar
knopp committed
719
720
  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
721
722
  proc_rxtx->frame_rx=1;
  proc_rxtx->subframe_rx=subframe;
723

knopp's avatar
knopp committed
724
725
  proc_rxtx->frame_tx=pdcch_alloc2ul_frame(&eNB->frame_parms,1,subframe);
  proc_rxtx->subframe_tx=pdcch_alloc2ul_subframe(&eNB->frame_parms,subframe);
726

knopp's avatar
knopp committed
727
728
729
730
  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
731

732
  printf("Init UL hopping UE\n");
733
  init_ul_hopping(&UE->frame_parms);
734
  printf("Init UL hopping eNB\n");
735
  init_ul_hopping(&eNB->frame_parms);
736
737


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

knopp's avatar
knopp committed
740
741
  UE->ulsch_Msg3_active[eNB_id] = 0;
  UE->ul_power_control_dedicated[eNB_id].accumulationEnabled=1;
knopp's avatar
knopp committed
742
  /*
743
  generate_ue_ulsch_params_from_dci((void *)&UL_alloc_pdu,
744
                                    14,
knopp's avatar
knopp committed
745
                                    proc_rxtx->subframe_tx,
746
                                    format0,
747
                                    UE,
knopp's avatar
knopp committed
748
				    proc_rxtx_ue,
749
750
751
752
753
754
                                    SI_RNTI,
                                    0,
                                    P_RNTI,
                                    CBA_RNTI,
                                    0,
                                    srs_flag);
755
756
757

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

knopp's avatar
knopp committed
758
  generate_eNB_ulsch_params_from_dci(eNB,proc_rxtx,
759
				     (void *)&UL_alloc_pdu,
760
761
762
                                     14,
                                     format0,
                                     0,
763
				     SI_RNTI,
764
765
766
767
                                     0,
                                     P_RNTI,
                                     CBA_RNTI,
                                     srs_flag);
knopp's avatar
knopp committed
768
  */
769

770
771
  coded_bits_per_codeword = nb_rb * (12 * get_Qm_ul(mcs)) * nsymb;

772
  if (cqi_flag == 1) coded_bits_per_codeword-=UE->ulsch[0]->O;
773
774
775
776

  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);
777
778


779
780
781

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

782
783
784
785
786
787
    /*
      if(abstx){
      int ulchestim_f[300*12];
      int ulchestim_t[2*(frame_parms->ofdm_symbol_size)];
      }
    */
788
789

    if(abstx) {
790
791
792
      printf("**********************Channel Realization Index = %d **************************\n", ch_realization);
      saving_bler=1;
    }
793

794

knopp's avatar
   
knopp committed
795
    //    if ((subframe>5) || (subframe < 4))
796
    //      UE->frame++;
797
798

    for (SNR=snr0; SNR<snr1; SNR+=input_snr_step) {
799
800
801
802
803
804
805
806
807
808
809
810
811
      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;
812

813
814
      //randominit(0);

knopp's avatar
   
knopp committed
815

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

822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842

        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)) {
843
          ret=fscanf(input_fdUL,"%s %s",input_val_str,input_val_str2);//&input_val1,&input_val2);
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865

          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);

866
867
      }

868
869
      avg_iter = 0;
      iter_trials=0;
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
      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);
897

knopp's avatar
knopp committed
898
      // initialization 
899
900
      struct list time_vector_tx;
      initialize(&time_vector_tx);
901
902
903
904
905
906
907
      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);

908
909
      struct list time_vector_rx;
      initialize(&time_vector_rx);
910
911
912
913
914
915
      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);
916

knopp's avatar
knopp committed
917
      ndi=0;
918
919
      for (trials = 0; trials<n_frames; trials++) {
        //      printf("*");
920
921
        //        UE->frame++;
        //        eNB->frame++;
knopp's avatar
knopp committed
922
	ndi = (1-ndi);
923
924
925
926
        fflush(stdout);
        round=0;

        while (round < 4) {
927
928
          eNB->ulsch[0]->harq_processes[harq_pid]->round=round;
          UE->ulsch[0]->harq_processes[harq_pid]->round=round;
knopp's avatar
knopp committed
929
	  //	  printf("Trial %d : Round %d (subframe %d, frame %d)\n",trials,round,proc_rxtx_ue->subframe_rx,proc_rxtx_ue->frame_rx);
930
931
932
          round_trials[round]++;


knopp's avatar
knopp committed
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
	  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;
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979

          /////////////////////
          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
980
981
982
983
984
985
	    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;
986

knopp's avatar
knopp committed
987
	    phy_procedures_UE_TX(UE,proc_rxtx_ue,0,0,normal_txrx,no_relay);
988

knopp's avatar
knopp committed
989
	    /*
990
            if (srs_flag)
991
              generate_srs_tx(UE,0,AMP,subframe);
992

knopp's avatar
knopp committed
993
            generate_drs_pusch(UE,proc_rxtx_ue,0,
994
                               AMP,subframe,
995
996
                               UE->ulsch[0]->harq_processes[harq_pid]->first_rb,
                               UE->ulsch[0]->harq_processes[harq_pid]->nb_rb,
997
998
999
                               0);

            if ((cqi_flag == 1) && (n_frames == 1) ) {
1000
1001
1002
              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);
1003
1004
            }

1005
            UE->ulsch[0]->o_ACK[0] = taus()&1;
1006

1007
            start_meas(&UE->ulsch_encoding_stats);
1008
1009

            if (ulsch_encoding(input_buffer,
1010
                               UE,
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
                               harq_pid,
                               eNB_id,
                               2, // transmission mode
                               control_only_flag,
                               1// Nbundled
                              )==-1) {
              printf("ulsim.c Problem with ulsch_encoding\n");
              exit(-1);
            }

1021
            stop_meas(&UE->ulsch_encoding_stats);
1022

1023
1024
            start_meas(&UE->ulsch_modulation_stats);
            ulsch_modulation(UE->common_vars.txdataF,AMP,
knopp's avatar
knopp committed
1025
                             proc_rxtx_ue->frame_tx,subframe,&UE->frame_parms,
1026
1027
                             UE->ulsch[0]);
            stop_meas(&UE->ulsch_modulation_stats);
knopp's avatar
knopp committed
1028
	    */
1029
1030
1031



knopp's avatar
knopp committed
1032
1033
1034

	    /*
	    for (aa=0; aa<1; aa++) {
1035
              if (frame_parms->Ncp == EXTENDED)
1036
1037
1038
                PHY_ofdm_mod(&UE->common_vars.txdataF[aa][subframe*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX],        // input
                             &txdata[aa][eNB->frame_parms.samples_per_tti*subframe],         // output
                             UE->frame_parms.ofdm_symbol_size,
1039
                             nsymb,                 // number of symbols
1040
                             UE->frame_parms.nb_prefix_samples,               // number of prefix samples
1041
1042
                             CYCLIC_PREFIX);
              else
1043
1044
                normal_prefix_mod(&UE->common_vars.txdataF[aa][subframe*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX],
                                  &txdata[aa][eNB->frame_parms.samples_per_tti*subframe],
1045
1046
1047
1048
                                  nsymb,
                                  frame_parms);


1049
1050
              apply_7_5_kHz(UE,UE->common_vars.txdata[aa],subframe<<1);
              apply_7_5_kHz(UE,UE->common_vars.txdata[aa],1+(subframe<<1));
1051

knopp's avatar
knopp committed
1052
*/
1053

knopp's avatar
knopp committed
1054
1055
1056
1057
1058
1059
1060
1061
	    tx_lev = signal_energy(&UE->common_vars.txdata[0][eNB->frame_parms.samples_per_tti*subframe],
				   eNB->frame_parms.samples_per_tti);
	    
	    
            if (n_frames==1) {
              write_output("txsigF0UL.m","txsF0", &UE->common_vars.txdataF[0][eNB->frame_parms.ofdm_symbol_size*nsymb*subframe],eNB->frame_parms.ofdm_symbol_size*nsymb,1,
                           1);
              //write_output("txsigF1.m","txsF1", UE->common_vars.txdataF[0],FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX,1,1);
1062
            }
knopp's avatar
knopp committed
1063
1064
1065
	    
	  }  // input_fd == NULL
	  
1066
1067
1068
          tx_lev_dB = (unsigned int) dB_fixed_times10(tx_lev);

          if (n_frames==1) {
1069
1070
            write_output("txsig0UL.m","txs0", &txdata[0][eNB->frame_parms.samples_per_tti*subframe],2*frame_parms->samples_per_tti,1,1);
            //        write_output("txsig1UL.m","txs1", &txdata[1][eNB->frame_parms.samples_per_tti*subframe],2*frame_parms->samples_per_tti,1,1);