ulsim.c 65.2 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

ghaddab's avatar
ghaddab committed
28
 *******************************************************************************/
29
30
31
32

/*! \file ulsim.c
 \brief Top-level DL simulator
 \author R. Knopp
33
 \date 2011 - 2014
34
35
36
37
38
39
40
 \version 0.1
 \company Eurecom
 \email: knopp@eurecom.fr
 \note
 \warning
*/

41
42
43
44
45
46
47
48
49
50
51
52
53
#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"

54
55
#include "unitary_defs.h"

56
57
#include "PHY/TOOLS/lte_phy_scope.h"

58
59
60
61
PHY_VARS_eNB *eNB;
PHY_VARS_UE *UE;


Florian Kaltenberger's avatar
Florian Kaltenberger committed
62

63

Florian Kaltenberger's avatar
Florian Kaltenberger committed
64
//#define MCS_COUNT 23//added for PHY abstraction
65
66
67
68

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
69
node_desc_t *enb_data[NUMBER_OF_eNB_MAX];
70
71
72
node_desc_t *ue_data[NUMBER_OF_UE_MAX];
//double sinr_bler_map[MCS_COUNT][2][16];

gauthier's avatar
gauthier committed
73
extern uint16_t beta_ack[16],beta_ri[16],beta_cqi[16];
74
75
//extern  char* namepointer_chMag ;

76
int xforms=0;
77
78
79
FD_lte_phy_scope_enb *form_enb;
char title[255];

80
81
82
83
84
85
86
87
/*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
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
167
168
169
170
171
172
173

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);
174
extern void eNB_fep_full_2thread(PHY_VARS_eNB *eNB);
knopp's avatar
knopp committed
175

176
177
int main(int argc, char **argv)
{
178
179
180
181
182
183

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

  int aarx,aatx;
  double channelx,channely;
184
  double sigma2, sigma2_dB=10,SNR,SNR2,snr0=-2.0,snr1,SNRmeas,rate,saving_bler=0;
knopp's avatar
   
knopp committed
185
  double input_snr_step=.2,snr_int=30;
186
187
188
189
190
191
192
193
  double blerr;

  int **txdata;

  LTE_DL_FRAME_PARMS *frame_parms;
  double **s_re,**s_im,**r_re,**r_im;
  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
194
  uint8_t extended_prefix_flag=0;
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
  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;
212
  unsigned int tx_lev=0,tx_lev_dB,trials,errs[4]= {0,0,0,0},round_trials[4]= {0,0,0,0};
213
  uint8_t transmission_mode=1,n_rx=1;
214

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

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

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

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

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

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

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

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

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

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

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

gauthier's avatar
gauthier committed
257
258
259
260
  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;
261

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

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

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

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

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

285
  cpu_freq_GHz = (double)get_cpu_freq_GHz();
286
287
288
289
290
291

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


  logInit();

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

299
300
301
    case 'b':
      bundling_flag = 0;
      break;
302

303
304
305
    case 'd':
      delay = atoi(optarg);
      break;
306

307
308
309
    case 'D':
      maxDoppler = atoi(optarg);
      break;
310

311
312
313
    case 'm':
      mcs = atoi(optarg);
      break;
314

315
316
317
    case 'n':
      n_frames = atoi(optarg);
      break;
318

319
320
    case 'Y':
      n_ch_rlz = atoi(optarg);
321
322
      break;

323
324
    case 'X':
      abstx= atoi(optarg);
325
326
      break;

327
    case 'g':
328
      sprintf(channel_model_input,optarg,10);
329

330
      switch((char)*optarg) {
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
363
364
365
      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;

366
      case 'H':
367
368
369
370
        channel_model=Rayleigh8;
        chMod = 9;
        break;

371
      case 'I':
372
373
374
375
        channel_model=Rayleigh1;
        chMod = 10;
        break;

376
      case 'J':
377
378
379
380
        channel_model=Rayleigh1_corr;
        chMod = 11;
        break;

381
      case 'K':
382
383
384
385
        channel_model=Rayleigh1_anticorr;
        chMod = 12;
        break;

386
      case 'L':
387
388
389
390
        channel_model=Rice8;
        chMod = 13;
        break;

391
      case 'M':
392
393
394
395
        channel_model=Rice1;
        chMod = 14;
        break;

396
      case 'N':
397
398
399
400
        channel_model=AWGN;
        chMod = 1;
        break;

401
      default:
402
        printf("Unsupported channel model!\n");
403
404
        exit(-1);
        break;
405
      }
406

407
      break;
408

409
    case 's':
knopp's avatar
   
knopp committed
410
411
      snr0 = atof(optarg);
      break;
412

knopp's avatar
   
knopp committed
413
414
415
    case 'w':
      snr_int = atof(optarg);
      break;
416

knopp's avatar
   
knopp committed
417
418
    case 'e':
      input_snr_step= atof(optarg);
419
      break;
420

421
422
    case 'x':
      transmission_mode=atoi(optarg);
423

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

430
      break;
431

432
433
434
    case 'y':
      n_rx = atoi(optarg);
      break;
435

436
437
438
    case 'S':
      subframe = atoi(optarg);
      break;
439

440
441
442
443
    case 'T':
      tdd_config=atoi(optarg);
      frame_type=TDD;
      break;
444

445
446
447
    case 'p':
      extended_prefix_flag=1;
      break;
448

449
450
    case 'r':
      nb_rb = atoi(optarg);
451
      nb_rb_set = 1;
452
      break;
453

454
455
456
    case 'f':
      first_rb = atoi(optarg);
      break;
457

458
459
460
    case 'c':
      cyclic_shift = atoi(optarg);
      break;
461

462
463
464
465
    case 'E':
      threequarter_fs=1;
      break;

466
467
468
    case 'N':
      N0 = atoi(optarg);
      break;
469

470
471
472
473
474
475
    case 'o':
      srs_flag = 1;
      break;

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

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

483
484
      //      input_file=1;
      break;
485

486
487
    case 'A':
      beta_ACK = atoi(optarg);
488

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

494
      break;
495

496
497
    case 'C':
      beta_CQI = atoi(optarg);
498

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

504
      break;
505

506
507
    case 'R':
      beta_RI = atoi(optarg);
508

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

514
      break;
515

516
517
518
    case 'Q':
      cqi_flag=1;
      break;
519

520
521
522
    case 'B':
      N_RB_DL=atoi(optarg);
      break;
523

524
525
    case 'P':
      dump_perf=1;
526
      opp_enabled=1;
527
      break;
528

529
530
531
532
    case 'O':
      test_perf=atoi(optarg);
      //print_perf =1;
      break;
533

534
    case 'L':
535
      parallel_flag=1;
536
      break;
537

538
539
540
    case 'I':
      max_turbo_iterations=atoi(optarg);
      break;
541

542
543
544
545
    case 'F':
      xforms=1;
      break;

546
547
548
    case 'Z':
      dump_table = 1;
      break;
549

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

559
560
561
562
563
564
565
566
  lte_param_init(1,
		 n_rx,
		 1,
		 extended_prefix_flag,
		 frame_type,
		 0,
		 tdd_config,
		 N_RB_DL,
567
		 threequarter_fs,
568
569
		 osf,
		 0);
570

571
  if (nb_rb_set == 0)
572
    nb_rb = eNB->frame_parms.N_RB_UL;
573

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

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

581
  frame_parms = &eNB->frame_parms;
582

583
  txdata = UE->common_vars.txdata;
584

585

586
587
588
589
590
591
592
  s_re = malloc(2*sizeof(double*));
  s_im = malloc(2*sizeof(double*));
  r_re = malloc(2*sizeof(double*));
  r_im = malloc(2*sizeof(double*));
  //  r_re0 = malloc(2*sizeof(double*));
  //  r_im0 = malloc(2*sizeof(double*));

593
  nsymb = (eNB->frame_parms.Ncp == NORMAL) ? 14 : 12;
594
595


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

603
  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");
604
605

  if (test_perf != 0) {
606
607
608
609
    char hostname[1024];
    hostname[1023] = '\0';
    gethostname(hostname, 1023);
    printf("Hostname: %s\n", hostname);
610
611
612
613
    //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",
614
            N_RB_DL,mcs,n_rx,channel_model_input,transmission_mode);
615
    time_meas_fd = fopen(time_meas_fname,"w");
616
617
618
619
    if (time_meas_fd==NULL) {
      fprintf(stderr,"Cannot create file %s!\n",time_meas_fname);
      exit(-1);
    }
620
  }
621
622
623

  if(abstx) {
    // CSV file
624
625
    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");
626
627
628
629
    if (csv_fdUL == NULL) {
      fprintf(stderr,"Problem opening file %s\n",csv_fname);
      exit(-1);
    }
630
631
    fprintf(csv_fdUL,"data_all%d=[",mcs);
  }
632

633
  for (i=0; i<2; i++) {
634
635
636
637
638
639
640
    s_re[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
    s_im[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
    r_re[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
    r_im[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
  }


641
642
643
644
645
646
  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);
  }
647

648
  UE->pdcch_vars[0]->crnti = 14;
649

650
651
652
653
654
  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;
655

656
657
  eNB->frame_parms.soundingrs_ul_config_common.srs_BandwidthConfig = 2;
  eNB->frame_parms.soundingrs_ul_config_common.srs_SubframeConfig = 7;
658

659
660
661
662
663
664
  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;
665

666
667
668
669
670
671
  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
672

673
  UE->ul_power_control_dedicated[eNB_id].deltaMCS_Enabled = 1;
674

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

677
678
  UE2eNB = new_channel_desc_scm(eNB->frame_parms.nb_antennas_tx,
                                UE->frame_parms.nb_antennas_rx,
679
                                channel_model,
680
681
				N_RB2sampling_rate(eNB->frame_parms.N_RB_UL),
				N_RB2channel_bandwidth(eNB->frame_parms.N_RB_UL),
682
683
684
685
686
687
688
                                forgetting_factor,
                                delay,
                                0);
  // set Doppler
  UE2eNB->max_Doppler = maxDoppler;

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

692
  if (parallel_flag == 1) init_fep_thread(eNB,&eNB->proc.attr_fep);
693

694
  // Create transport channel structures for 2 transport blocks (MIMO)
695
  for (i=0; i<2; i++) {
696
697
    eNB->dlsch[0][i] = new_eNB_dlsch(1,8,1827072,N_RB_DL,0);
    UE->dlsch[0][i]  = new_ue_dlsch(1,8,1827072,MAX_TURBO_ITERATIONS,N_RB_DL,0);
698

699
    if (!eNB->dlsch[0][i]) {
700
701
702
      printf("Can't get eNB dlsch structures\n");
      exit(-1);
    }
703

704
    if (!UE->dlsch[0][i]) {
705
706
707
      printf("Can't get ue dlsch structures\n");
      exit(-1);
    }
708

709
710
    eNB->dlsch[0][i]->rnti = 14;
    UE->dlsch[0][i]->rnti   = 14;
711

712
  } 
713

714
715
716



717
718
719
720
721
722
723
724
725
726
727
728
  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;

knopp's avatar
knopp committed
729
730

  UE->mac_enabled=0;
731
  
knopp's avatar
knopp committed
732
733
  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
734
735
  proc_rxtx->frame_rx=1;
  proc_rxtx->subframe_rx=subframe;
736

knopp's avatar
knopp committed
737
738
  proc_rxtx->frame_tx=pdcch_alloc2ul_frame(&eNB->frame_parms,1,subframe);
  proc_rxtx->subframe_tx=pdcch_alloc2ul_subframe(&eNB->frame_parms,subframe);
739

knopp's avatar
knopp committed
740
741
742
743
  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
744

745
  printf("Init UL hopping UE\n");
746
  init_ul_hopping(&UE->frame_parms);
747
  printf("Init UL hopping eNB\n");
748
  init_ul_hopping(&eNB->frame_parms);
749

750

751
  UE->dlsch[0][0]->harq_ack[ul_subframe2pdcch_alloc_subframe(&eNB->frame_parms,subframe)].send_harq_status = 1;
knopp's avatar
   
knopp committed
752

knopp's avatar
knopp committed
753
754
  UE->ulsch_Msg3_active[eNB_id] = 0;
  UE->ul_power_control_dedicated[eNB_id].accumulationEnabled=1;
knopp's avatar
knopp committed
755
  /*
756
  generate_ue_ulsch_params_from_dci((void *)&UL_alloc_pdu,
757
                                    14,
knopp's avatar
knopp committed
758
                                    proc_rxtx->subframe_tx,
759
                                    format0,
760
                                    UE,
knopp's avatar
knopp committed
761
				    proc_rxtx_ue,
762
763
764
765
766
767
                                    SI_RNTI,
                                    0,
                                    P_RNTI,
                                    CBA_RNTI,
                                    0,
                                    srs_flag);
768
769
770

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

knopp's avatar
knopp committed
771
  generate_eNB_ulsch_params_from_dci(eNB,proc_rxtx,
772
				     (void *)&UL_alloc_pdu,
773
774
775
                                     14,
                                     format0,
                                     0,
776
				     SI_RNTI,
777
778
779
780
                                     0,
                                     P_RNTI,
                                     CBA_RNTI,
                                     srs_flag);
knopp's avatar
knopp committed
781
  */
782

783
784
  coded_bits_per_codeword = nb_rb * (12 * get_Qm_ul(mcs)) * nsymb;

785
  if (cqi_flag == 1) coded_bits_per_codeword-=UE->ulsch[0]->O;
786
787
788
789

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


792
793
794

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

795
796
797
798
799
800
    /*
      if(abstx){
      int ulchestim_f[300*12];
      int ulchestim_t[2*(frame_parms->ofdm_symbol_size)];
      }
    */
801
802

    if(abstx) {
803
804
805
      printf("**********************Channel Realization Index = %d **************************\n", ch_realization);
      saving_bler=1;
    }
806

807

knopp's avatar
   
knopp committed
808
    //    if ((subframe>5) || (subframe < 4))
809
    //      UE->frame++;
810
811

    for (SNR=snr0; SNR<snr1; SNR+=input_snr_step) {
812
813
814
815
816
817
818
819
820
821
822
823
824
      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;
825

826
827
      //randominit(0);

knopp's avatar
   
knopp committed
828

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

835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855

        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)) {
856
          ret=fscanf(input_fdUL,"%s %s",input_val_str,input_val_str2);//&input_val1,&input_val2);
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878

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

879
880
      }

881
882
      avg_iter = 0;
      iter_trials=0;
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
      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);
910

knopp's avatar
knopp committed
911
      // initialization 
912
913
      struct list time_vector_tx;
      initialize(&time_vector_tx);
914
915
916
917
918
919
920
      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);

921
922
      struct list time_vector_rx;
      initialize(&time_vector_rx);
923
924
925
926
927
928
      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);
929

knopp's avatar
knopp committed
930
      ndi=0;
931
932
      for (trials = 0; trials<n_frames; trials++) {
        //      printf("*");
933
934
        //        UE->frame++;
        //        eNB->frame++;
knopp's avatar
knopp committed
935
	ndi = (1-ndi);
936
937
938
939
        fflush(stdout);
        round=0;

        while (round < 4) {
940
941
          eNB->ulsch[0]->harq_processes[harq_pid]->round=round;
          UE->ulsch[0]->harq_processes[harq_pid]->round=round;
knopp's avatar
knopp committed
942
	  //	  printf("Trial %d : Round %d (subframe %d, frame %d)\n",trials,round,proc_rxtx_ue->subframe_rx,proc_rxtx_ue->frame_rx);
943
944
945
          round_trials[round]++;


knopp's avatar
knopp committed
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
	  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;
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992

          /////////////////////
          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
993
994
995
996
997
998
	    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;
999

knopp's avatar
knopp committed
1000
	    phy_procedures_UE_TX(UE,proc_rxtx_ue,0,0,normal_txrx,no_relay);
1001

knopp's avatar
knopp committed
1002
	    /*
1003
            if (srs_flag)
1004
              generate_srs_tx(UE,0,AMP,subframe);
1005

knopp's avatar
knopp committed
1006
            generate_drs_pusch(UE,proc_rxtx_ue,0,
1007
                               AMP,subframe,
1008
1009
                               UE->ulsch[0]->harq_processes[harq_pid]->first_rb,
                               UE->ulsch[0]->harq_processes[harq_pid]->nb_rb,
1010
1011
1012
                               0);

            if ((cqi_flag == 1) && (n_frames == 1) ) {
1013
1014
1015
              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);
1016
1017
            }

1018
            UE->ulsch[0]->o_ACK[0] = taus()&1;
1019

1020
            start_meas(&UE->ulsch_encoding_stats);
1021
1022

            if (ulsch_encoding(input_buffer,
1023
                               UE,
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
                               harq_pid,
                               eNB_id,
                               2, // transmission mode
                               control_only_flag,
                               1// Nbundled
                              )==-1) {
              printf("ulsim.c Problem with ulsch_encoding\n");
              exit(-1);
            }

1034
            stop_meas(&UE->ulsch_encoding_stats);
1035

1036
1037
            start_meas(&UE->ulsch_modulation_stats);
            ulsch_modulation(UE->common_vars.txdataF,AMP,
knopp's avatar
knopp committed
1038
                             proc_rxtx_ue->frame_tx,subframe,&UE->frame_parms,
1039
1040
                             UE->ulsch[0]);
            stop_meas(&UE->ulsch_modulation_stats);
knopp's avatar
knopp committed
1041
	    */
1042
1043
1044



knopp's avatar
knopp committed
1045
1046
1047

	    /*
	    for (aa=0; aa<1; aa++) {
1048
              if (frame_parms->Ncp == EXTENDED)
1049
1050
1051
                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,
1052
                             nsymb,                 // number of symbols
1053
                             UE->frame_parms.nb_prefix_samples,               // number of prefix samples
1054
1055
                             CYCLIC_PREFIX);
              else
1056
1057
                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],
1058
1059
1060
                                  nsymb,
                                  frame_parms);

knopp's avatar
knopp committed
1061