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

633
  UE->pdcch_vars[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