initial_sync.c 21.2 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/*
 * 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
 */

22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/*! \file PHY/LTE_TRANSPORT/initial_sync.c
* \brief Routines for initial UE synchronization procedure (PSS,SSS,PBCH and frame format detection)
* \author R. Knopp, F. Kaltenberger
* \date 2011
* \version 0.1
* \company Eurecom
* \email: knopp@eurecom.fr,kaltenberger@eurecom.fr
* \note
* \warning
*/
#include "PHY/types.h"
#include "PHY/defs.h"
#include "PHY/extern.h"
#include "SCHED/defs.h"
#include "SCHED/extern.h"
#include "defs.h"
#include "extern.h"
39

40

41
42
#include "common_lib.h"
extern openair0_config_t openair0_cfg[];
43

44
//#define DEBUG_INITIAL_SYNCH
45

46
47
int pbch_detection(PHY_VARS_UE *ue, runmode_t mode) 
{
48

49
50
51
52
  uint8_t l,pbch_decoded,frame_mod4,pbch_tx_ant,dummy;
  LTE_DL_FRAME_PARMS *frame_parms=&ue->frame_parms;
  char phich_resource[6];
  
53
#ifdef DEBUG_INITIAL_SYNCH
54
55
  LOG_I(PHY,"[UE%d] Initial sync: starting PBCH detection (rx_offset %d)\n",ue->Mod_id,
        ue->rx_offset);
56
57
#endif

58
59
  for (l=0; l<frame_parms->symbols_per_tti/2; l++) {

60
    slot_fep(ue,
61
62
	     l,
	     0,
63
	     ue->rx_offset,
64
65
66
67
	     0,
	     1);
  }  
  for (l=0; l<frame_parms->symbols_per_tti/2; l++) {
68

69
    slot_fep(ue,
70
71
	     l,
	     1,
72
	     ue->rx_offset,
73
74
75
	     0,
	     1);
  }  
76
  slot_fep(ue,
77
78
	   0,
	   2,
79
	   ue->rx_offset,
80
81
	   0,
	   1);
82

83
84
  lte_ue_measurements(ue,
		      ue->rx_offset,
85
		      0,
86
		      0,0);
87
88
  
  
89
90
  if (ue->frame_parms.frame_type == TDD) {
    ue_rrc_measurements(ue,
91
			2,
92
93
94
			0);
  }
  else {
95
    ue_rrc_measurements(ue,
96
97
98
			0,
			0);
  }
99
#ifdef DEBUG_INITIAL_SYNCH
100
  LOG_I(PHY,"[UE %d] RX RSSI %d dBm, digital (%d, %d) dB, linear (%d, %d), avg rx power %d dB (%d lin), RX gain %d dB\n",
101
102
103
104
105
106
107
108
109
        ue->Mod_id,
        ue->measurements.rx_rssi_dBm[0] - ((ue->frame_parms.nb_antennas_rx==2) ? 3 : 0),
        ue->measurements.rx_power_dB[0][0],
        ue->measurements.rx_power_dB[0][1],
        ue->measurements.rx_power[0][0],
        ue->measurements.rx_power[0][1],
        ue->measurements.rx_power_avg_dB[0],
        ue->measurements.rx_power_avg[0],
        ue->rx_total_gain_dB);
110

111
  LOG_I(PHY,"[UE %d] N0 %d dBm digital (%d, %d) dB, linear (%d, %d), avg noise power %d dB (%d lin)\n",
112
113
114
115
116
117
118
119
        ue->Mod_id,
        ue->measurements.n0_power_tot_dBm,
        ue->measurements.n0_power_dB[0],
        ue->measurements.n0_power_dB[1],
        ue->measurements.n0_power[0],
        ue->measurements.n0_power[1],
        ue->measurements.n0_power_avg_dB,
        ue->measurements.n0_power_avg);
120
#endif
121

122
  pbch_decoded = 0;
123
124

  for (frame_mod4=0; frame_mod4<4; frame_mod4++) {
125
126
    pbch_tx_ant = rx_pbch(&ue->common_vars,
                          ue->pbch_vars[0],
127
128
129
                          frame_parms,
                          0,
                          SISO,
130
                          ue->high_speed_flag,
131
132
                          frame_mod4);

133
134
135
136
    if ((pbch_tx_ant>0) && (pbch_tx_ant<=2)) {
      pbch_decoded = 1;
      break;
    }
137

138
139
    pbch_tx_ant = rx_pbch(&ue->common_vars,
                          ue->pbch_vars[0],
140
141
142
                          frame_parms,
                          0,
                          ALAMOUTI,
143
                          ue->high_speed_flag,
144
145
                          frame_mod4);

146
147
148
149
150
    if ((pbch_tx_ant>0) && (pbch_tx_ant<=2)) {
      pbch_decoded = 1;
      break;
    }
  }
151
152


153
  if (pbch_decoded) {
154

Xiwen JIANG's avatar
Xiwen JIANG committed
155
    frame_parms->nb_antenna_ports_eNB = pbch_tx_ant;
156

157
158
159
    // set initial transmission mode to 1 or 2 depending on number of detected TX antennas
    frame_parms->mode1_flag = (pbch_tx_ant==1);
    // openair_daq_vars.dlsch_transmission_mode = (pbch_tx_ant>1) ? 2 : 1;
160

161
162

    // flip byte endian on 24-bits for MIB
163
164
165
    //    dummy = ue->pbch_vars[0]->decoded_output[0];
    //    ue->pbch_vars[0]->decoded_output[0] = ue->pbch_vars[0]->decoded_output[2];
    //    ue->pbch_vars[0]->decoded_output[2] = dummy;
166
167

    // now check for Bandwidth of Cell
168
    dummy = (ue->pbch_vars[0]->decoded_output[2]>>5)&7;
169

170
    switch (dummy) {
171
172

    case 0 :
173
174
      frame_parms->N_RB_DL = 6;
      break;
175
176

    case 1 :
177
178
      frame_parms->N_RB_DL = 15;
      break;
179
180

    case 2 :
181
182
      frame_parms->N_RB_DL = 25;
      break;
183
184

    case 3 :
185
186
      frame_parms->N_RB_DL = 50;
      break;
187
188

    case 4 :
189
190
      frame_parms->N_RB_DL = 75;
      break;
191

192
193
194
    case 5:
      frame_parms->N_RB_DL = 100;
      break;
195

196
    default:
197
      LOG_E(PHY,"[UE%d] Initial sync: PBCH decoding: Unknown N_RB_DL\n",ue->Mod_id);
198
199
200
      return -1;
      break;
    }
201

202

203
    // now check for PHICH parameters
204
205
    frame_parms->phich_config_common.phich_duration = (PHICH_DURATION_t)((ue->pbch_vars[0]->decoded_output[2]>>4)&1);
    dummy = (ue->pbch_vars[0]->decoded_output[2]>>2)&3;
206

207
208
209
210
211
    switch (dummy) {
    case 0:
      frame_parms->phich_config_common.phich_resource = oneSixth;
      sprintf(phich_resource,"1/6");
      break;
212

213
214
215
216
    case 1:
      frame_parms->phich_config_common.phich_resource = half;
      sprintf(phich_resource,"1/2");
      break;
217

218
219
220
221
    case 2:
      frame_parms->phich_config_common.phich_resource = one;
      sprintf(phich_resource,"1");
      break;
222

223
224
225
226
    case 3:
      frame_parms->phich_config_common.phich_resource = two;
      sprintf(phich_resource,"2");
      break;
227

228
    default:
229
      LOG_E(PHY,"[UE%d] Initial sync: Unknown PHICH_DURATION\n",ue->Mod_id);
230
231
232
      return -1;
      break;
    }
233

234
235
236
237
238
    ue->proc.proc_rxtx[0].frame_rx =   (((ue->pbch_vars[0]->decoded_output[2]&3)<<6) + (ue->pbch_vars[0]->decoded_output[1]>>2))<<2;
    ue->proc.proc_rxtx[0].frame_rx += frame_mod4;

    ue->proc.proc_rxtx[1].frame_rx =   (((ue->pbch_vars[0]->decoded_output[2]&3)<<6) + (ue->pbch_vars[0]->decoded_output[1]>>2))<<2;
    ue->proc.proc_rxtx[1].frame_rx += frame_mod4;
239

240
241
#ifndef USER_MODE
    // one frame delay
242
243
    ue->proc.proc_rxtx[0].frame_rx ++;
    ue->proc.proc_rxtx[1].frame_rx ++;
244
#endif
245
246
    ue->proc.proc_rxtx[0].frame_tx = ue->proc.proc_rxtx[0].frame_rx;
    ue->proc.proc_rxtx[1].frame_tx = ue->proc.proc_rxtx[1].frame_rx;
247
248
#ifdef DEBUG_INITIAL_SYNCH
    LOG_I(PHY,"[UE%d] Initial sync: pbch decoded sucessfully mode1_flag %d, tx_ant %d, frame %d, N_RB_DL %d, phich_duration %d, phich_resource %s!\n",
249
          ue->Mod_id,
250
251
          frame_parms->mode1_flag,
          pbch_tx_ant,
252
          ue->proc.proc_rxtx[0].frame_rx,
253
254
255
          frame_parms->N_RB_DL,
          frame_parms->phich_config_common.phich_duration,
          phich_resource);  //frame_parms->phich_config_common.phich_resource);
256
257
#endif
    return(0);
258
  } else {
259
260
    return(-1);
  }
261

262
263
}

264
265
266
267
char phich_string[13][4] = {"","1/6","","1/2","","","one","","","","","","two"};
char duplex_string[2][4] = {"FDD","TDD"};
char prefix_string[2][9] = {"NORMAL","EXTENDED"};

268
int initial_sync(PHY_VARS_UE *ue, runmode_t mode)
269
270
{

271
  int32_t sync_pos,sync_pos2,sync_pos_slot;
gauthier's avatar
gauthier committed
272
273
274
275
  int32_t metric_fdd_ncp=0,metric_fdd_ecp=0,metric_tdd_ncp=0,metric_tdd_ecp=0;
  uint8_t phase_fdd_ncp,phase_fdd_ecp,phase_tdd_ncp,phase_tdd_ecp;
  uint8_t flip_fdd_ncp,flip_fdd_ecp,flip_tdd_ncp,flip_tdd_ecp;
  //  uint16_t Nid_cell_fdd_ncp=0,Nid_cell_fdd_ecp=0,Nid_cell_tdd_ncp=0,Nid_cell_tdd_ecp=0;
276
  LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
277
278
  int ret=-1;
  int aarx,rx_power=0;
279
  /*#ifdef OAI_USRP
280
  __m128i *rxdata128;
281
  #endif*/
282
283
  //  LOG_I(PHY,"**************************************************************\n");
  // First try FDD normal prefix
knopp's avatar
   
knopp committed
284
285
  frame_parms->Ncp=NORMAL;
  frame_parms->frame_type=FDD;
286
  init_frame_parms(frame_parms,1);
Florian Kaltenberger's avatar
Florian Kaltenberger committed
287
  /*
288
  write_output("rxdata0.m","rxd0",ue->common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1);
Florian Kaltenberger's avatar
Florian Kaltenberger committed
289
290
  exit(-1);
  */
291
  sync_pos = lte_sync_time(ue->common_vars.rxdata,
292
                           frame_parms,
293
                           (int *)&ue->common_vars.eNb_id);
294

295
  //  write_output("rxdata1.m","rxd1",ue->common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1);
296
297
298
299
300
301
  if (sync_pos >= frame_parms->nb_prefix_samples)
    sync_pos2 = sync_pos - frame_parms->nb_prefix_samples;
  else
    sync_pos2 = sync_pos + FRAME_LENGTH_COMPLEX_SAMPLES - frame_parms->nb_prefix_samples;

#ifdef DEBUG_INITIAL_SYNCH
302
  LOG_I(PHY,"[UE%d] Initial sync : Estimated PSS position %d, Nid2 %d\n",ue->Mod_id,sync_pos,ue->common_vars.eNb_id);
303
304
305
#endif

  // SSS detection
306

307
308
309
310
  // PSS is hypothesized in last symbol of first slot in Frame
  sync_pos_slot = (frame_parms->samples_per_tti>>1) - frame_parms->ofdm_symbol_size - frame_parms->nb_prefix_samples;

  if (sync_pos2 >= sync_pos_slot)
311
    ue->rx_offset = sync_pos2 - sync_pos_slot;
312
  else
313
    ue->rx_offset = FRAME_LENGTH_COMPLEX_SAMPLES + sync_pos2 - sync_pos_slot;
314

315
  if (((sync_pos2 - sync_pos_slot) >=0 ) &&
316
      ((sync_pos2 - sync_pos_slot) < ((FRAME_LENGTH_COMPLEX_SAMPLES-frame_parms->samples_per_tti/2)))) {
317
#ifdef DEBUG_INITIAL_SYNCH
318
319
    LOG_I(PHY,"Calling sss detection (FDD normal CP)\n");
#endif
320
    rx_sss(ue,&metric_fdd_ncp,&flip_fdd_ncp,&phase_fdd_ncp);
321
    frame_parms->nushift  = frame_parms->Nid_cell%6;
322

323
    if (flip_fdd_ncp==1)
324
      ue->rx_offset += (FRAME_LENGTH_COMPLEX_SAMPLES>>1);
325

326
327
328
329
    init_frame_parms(&ue->frame_parms,1);
    lte_gold(frame_parms,ue->lte_gold_table[0],frame_parms->Nid_cell);
    ret = pbch_detection(ue,mode);
    //   write_output("rxdata2.m","rxd2",ue->common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1);
330
331
332

#ifdef DEBUG_INITIAL_SYNCH
    LOG_I(PHY,"FDD Normal prefix: CellId %d metric %d, phase %d, flip %d, pbch %d\n",
333
334
335
          frame_parms->Nid_cell,metric_fdd_ncp,phase_fdd_ncp,flip_fdd_ncp,ret);
#endif
  } else {
336
#ifdef DEBUG_INITIAL_SYNCH
337
    LOG_I(PHY,"FDD Normal prefix: SSS error condition: sync_pos %d, sync_pos_slot %d\n", sync_pos, sync_pos_slot);
338
339
340
341
342
343
344
#endif
  }


  if (ret==-1) {

    // Now FDD extended prefix
knopp's avatar
   
knopp committed
345
346
    frame_parms->Ncp=EXTENDED;
    frame_parms->frame_type=FDD;
347
    init_frame_parms(frame_parms,1);
348

349
350
351
352
    if (sync_pos < frame_parms->nb_prefix_samples)
      sync_pos2 = sync_pos + FRAME_LENGTH_COMPLEX_SAMPLES - frame_parms->nb_prefix_samples;
    else
      sync_pos2 = sync_pos - frame_parms->nb_prefix_samples;
353

354
355
    // PSS is hypothesized in last symbol of first slot in Frame
    sync_pos_slot = (frame_parms->samples_per_tti>>1) - frame_parms->ofdm_symbol_size - (frame_parms->nb_prefix_samples);
356

357
    if (sync_pos2 >= sync_pos_slot)
358
      ue->rx_offset = sync_pos2 - sync_pos_slot;
359
    else
360
      ue->rx_offset = FRAME_LENGTH_COMPLEX_SAMPLES + sync_pos2 - sync_pos_slot;
361

362
    //msg("nb_prefix_samples %d, rx_offset %d\n",frame_parms->nb_prefix_samples,ue->rx_offset);
363

364
365
366
    if (((sync_pos2 - sync_pos_slot) >=0 ) &&
        ((sync_pos2 - sync_pos_slot) < ((FRAME_LENGTH_COMPLEX_SAMPLES-frame_parms->samples_per_tti/2)))) {

367
      rx_sss(ue,&metric_fdd_ecp,&flip_fdd_ecp,&phase_fdd_ecp);
368
      frame_parms->nushift  = frame_parms->Nid_cell%6;
369

370
      if (flip_fdd_ecp==1)
371
        ue->rx_offset += (FRAME_LENGTH_COMPLEX_SAMPLES>>1);
372

373
374
375
376
      init_frame_parms(&ue->frame_parms,1);
      lte_gold(frame_parms,ue->lte_gold_table[0],frame_parms->Nid_cell);
      ret = pbch_detection(ue,mode);
      //     write_output("rxdata3.m","rxd3",ue->common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1);
377
378
#ifdef DEBUG_INITIAL_SYNCH
      LOG_I(PHY,"FDD Extended prefix: CellId %d metric %d, phase %d, flip %d, pbch %d\n",
379
            frame_parms->Nid_cell,metric_fdd_ecp,phase_fdd_ecp,flip_fdd_ecp,ret);
380
#endif
381
    } else {
382
#ifdef DEBUG_INITIAL_SYNCH
383
      LOG_I(PHY,"FDD Extended prefix: SSS error condition: sync_pos %d, sync_pos_slot %d\n", sync_pos, sync_pos_slot);
384
385
386
387
388
#endif
    }

    if (ret==-1) {
      // Now TDD normal prefix
knopp's avatar
   
knopp committed
389
390
      frame_parms->Ncp=NORMAL;
      frame_parms->frame_type=TDD;
391
392
393
      init_frame_parms(frame_parms,1);

      if (sync_pos >= frame_parms->nb_prefix_samples)
394
        sync_pos2 = sync_pos - frame_parms->nb_prefix_samples;
395
      else
396
        sync_pos2 = sync_pos + FRAME_LENGTH_COMPLEX_SAMPLES - frame_parms->nb_prefix_samples;
397
398

      // PSS is hypothesized in 2nd symbol of third slot in Frame (S-subframe)
399
400
401
402
403
      sync_pos_slot = frame_parms->samples_per_tti +
                      (frame_parms->ofdm_symbol_size<<1) +
                      frame_parms->nb_prefix_samples0 +
                      (frame_parms->nb_prefix_samples);

404
      if (sync_pos2 >= sync_pos_slot)
405
        ue->rx_offset = sync_pos2 - sync_pos_slot;
406
      else
407
        ue->rx_offset = (FRAME_LENGTH_COMPLEX_SAMPLES>>1) + sync_pos2 - sync_pos_slot;
408

409
      rx_sss(ue,&metric_tdd_ncp,&flip_tdd_ncp,&phase_tdd_ncp);
410
411

      if (flip_tdd_ncp==1)
412
        ue->rx_offset += (FRAME_LENGTH_COMPLEX_SAMPLES>>1);
413
414

      frame_parms->nushift  = frame_parms->Nid_cell%6;
415
      init_frame_parms(&ue->frame_parms,1);
416

417
418
419
      lte_gold(frame_parms,ue->lte_gold_table[0],frame_parms->Nid_cell);
      ret = pbch_detection(ue,mode);
      //      write_output("rxdata4.m","rxd4",ue->common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1);
420
421

#ifdef DEBUG_INITIAL_SYNCH
422
423
      LOG_I(PHY,"TDD Normal prefix: CellId %d metric %d, phase %d, flip %d, pbch %d\n",
            frame_parms->Nid_cell,metric_tdd_ncp,phase_tdd_ncp,flip_tdd_ncp,ret);
424
#endif
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441

      if (ret==-1) {
        // Now TDD extended prefix
        frame_parms->Ncp=EXTENDED;
        frame_parms->frame_type=TDD;
        init_frame_parms(frame_parms,1);
        sync_pos2 = sync_pos - frame_parms->nb_prefix_samples;

        if (sync_pos >= frame_parms->nb_prefix_samples)
          sync_pos2 = sync_pos - frame_parms->nb_prefix_samples;
        else
          sync_pos2 = sync_pos + FRAME_LENGTH_COMPLEX_SAMPLES - frame_parms->nb_prefix_samples;

        // PSS is hypothesized in 2nd symbol of third slot in Frame (S-subframe)
        sync_pos_slot = frame_parms->samples_per_tti + (frame_parms->ofdm_symbol_size<<1) + (frame_parms->nb_prefix_samples<<1);

        if (sync_pos2 >= sync_pos_slot)
442
          ue->rx_offset = sync_pos2 - sync_pos_slot;
443
        else
444
          ue->rx_offset = (FRAME_LENGTH_COMPLEX_SAMPLES>>1) + sync_pos2 - sync_pos_slot;
445

446
        rx_sss(ue,&metric_tdd_ecp,&flip_tdd_ecp,&phase_tdd_ecp);
447
448
449
        frame_parms->nushift  = frame_parms->Nid_cell%6;

        if (flip_tdd_ecp==1)
450
          ue->rx_offset += (FRAME_LENGTH_COMPLEX_SAMPLES>>1);
451

452
453
454
        init_frame_parms(&ue->frame_parms,1);
        lte_gold(frame_parms,ue->lte_gold_table[0],frame_parms->Nid_cell);
        ret = pbch_detection(ue,mode);
455

456
	//	write_output("rxdata5.m","rxd5",ue->common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1);
457
#ifdef DEBUG_INITIAL_SYNCH
458
459
        LOG_I(PHY,"TDD Extended prefix: CellId %d metric %d, phase %d, flip %d, pbch %d\n",
              frame_parms->Nid_cell,metric_tdd_ecp,phase_tdd_ecp,flip_tdd_ecp,ret);
460
461
462
463
#endif
      }
    }
  }
464

465
  /* Consider this is a false detection if the offset is > 1000 Hz */
Gabriel's avatar
Gabriel committed
466
  if( (abs(ue->common_vars.freq_offset) > 150) && (ret == 0) )
467
468
  {
	  ret=-1;
Cedric Roux's avatar
Cedric Roux committed
469
#if DISABLE_LOG_X
470
	  printf("Ignore MIB with high freq offset [%d Hz] estimation \n",ue->common_vars.freq_offset);
Cedric Roux's avatar
Cedric Roux committed
471
472
473
#else
	  LOG_E(HW, "Ignore MIB with high freq offset [%d Hz] estimation \n",ue->common_vars.freq_offset);
#endif
474
475
  }

476
477
  if (ret==0) {  // PBCH found so indicate sync to higher layers and configure frame parameters

478
    //#ifdef DEBUG_INITIAL_SYNCH
Cedric Roux's avatar
Cedric Roux committed
479
#if DISABLE_LOG_X
480
    printf("[UE%d] In synch, rx_offset %d samples\n",ue->Mod_id, ue->rx_offset);
Cedric Roux's avatar
Cedric Roux committed
481
482
483
#else
    LOG_I(PHY, "[UE%d] In synch, rx_offset %d samples\n",ue->Mod_id, ue->rx_offset);
#endif
484
    //#endif
485

486
    if (ue->UE_scan_carrier == 0) {
487
488
489
490
491
492
493
494
495

    #if UE_AUTOTEST_TRACE
      LOG_I(PHY,"[UE  %d] AUTOTEST Cell Sync : frame = %d, rx_offset %d, freq_offset %d \n",
              ue->Mod_id,
              ue->proc.proc_rxtx[0].frame_rx,
              ue->rx_offset,
              ue->common_vars.freq_offset );
    #endif

496
497
      if (ue->mac_enabled==1) {
	LOG_I(PHY,"[UE%d] Sending synch status to higher layers\n",ue->Mod_id);
Florian Kaltenberger's avatar
Florian Kaltenberger committed
498
	//mac_resynch();
499
	mac_xface->dl_phy_sync_success(ue->Mod_id,ue->proc.proc_rxtx[0].frame_rx,0,1);//ue->common_vars.eNb_id);
500
	ue->UE_mode[0] = PRACH;
Florian Kaltenberger's avatar
Florian Kaltenberger committed
501
502
      }
      else {
503
	ue->UE_mode[0] = PUSCH;
Florian Kaltenberger's avatar
Florian Kaltenberger committed
504
505
      }

506
507
      generate_pcfich_reg_mapping(frame_parms);
      generate_phich_reg_mapping(frame_parms);
Florian Kaltenberger's avatar
Florian Kaltenberger committed
508

509
510
511

      ue->pbch_vars[0]->pdu_errors_conseq=0;

512
    }
513

Cedric Roux's avatar
Cedric Roux committed
514
#if DISABLE_LOG_X
515
    printf("[UE %d] Frame %d RRC Measurements => rssi %3.1f dBm (dig %3.1f dB, gain %d), N0 %d dBm,  rsrp %3.1f dBm/RE, rsrq %3.1f dB\n",ue->Mod_id,
516
	  ue->proc.proc_rxtx[0].frame_rx,
517
518
519
520
521
522
	  10*log10(ue->measurements.rssi)-ue->rx_total_gain_dB,
	  10*log10(ue->measurements.rssi),
	  ue->rx_total_gain_dB,
	  ue->measurements.n0_power_tot_dBm,
	  10*log10(ue->measurements.rsrp[0])-ue->rx_total_gain_dB,
	  (10*log10(ue->measurements.rsrq[0])));
Cedric Roux's avatar
Cedric Roux committed
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543


    printf("[UE %d] Frame %d MIB Information => %s, %s, NidCell %d, N_RB_DL %d, PHICH DURATION %d, PHICH RESOURCE %s, TX_ANT %d\n",
	  ue->Mod_id,
	  ue->proc.proc_rxtx[0].frame_rx,
	  duplex_string[ue->frame_parms.frame_type],
	  prefix_string[ue->frame_parms.Ncp],
	  ue->frame_parms.Nid_cell,
	  ue->frame_parms.N_RB_DL,
	  ue->frame_parms.phich_config_common.phich_duration,
	  phich_string[ue->frame_parms.phich_config_common.phich_resource],
	  ue->frame_parms.nb_antenna_ports_eNB);
#else
    LOG_I(PHY, "[UE %d] Frame %d RRC Measurements => rssi %3.1f dBm (dig %3.1f dB, gain %d), N0 %d dBm,  rsrp %3.1f dBm/RE, rsrq %3.1f dB\n",ue->Mod_id,
	  ue->proc.proc_rxtx[0].frame_rx,
	  10*log10(ue->measurements.rssi)-ue->rx_total_gain_dB,
	  10*log10(ue->measurements.rssi),
	  ue->rx_total_gain_dB,
	  ue->measurements.n0_power_tot_dBm,
	  10*log10(ue->measurements.rsrp[0])-ue->rx_total_gain_dB,
	  (10*log10(ue->measurements.rsrq[0])));
544
545
    
    
Cedric Roux's avatar
Cedric Roux committed
546
    LOG_I(PHY, "[UE %d] Frame %d MIB Information => %s, %s, NidCell %d, N_RB_DL %d, PHICH DURATION %d, PHICH RESOURCE %s, TX_ANT %d\n",
547
	  ue->Mod_id,
548
	  ue->proc.proc_rxtx[0].frame_rx,
549
550
551
552
553
554
	  duplex_string[ue->frame_parms.frame_type],
	  prefix_string[ue->frame_parms.Ncp],
	  ue->frame_parms.Nid_cell,
	  ue->frame_parms.N_RB_DL,
	  ue->frame_parms.phich_config_common.phich_duration,
	  phich_string[ue->frame_parms.phich_config_common.phich_resource],
555
	  ue->frame_parms.nb_antenna_ports_eNB);
Cedric Roux's avatar
Cedric Roux committed
556
#endif
557

558
#if defined(OAI_USRP) || defined(EXMIMO) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
Cedric Roux's avatar
Cedric Roux committed
559
#  if DISABLE_LOG_X
560
    printf("[UE %d] Frame %d Measured Carrier Frequency %.0f Hz (offset %d Hz)\n",
561
	  ue->Mod_id,
562
	  ue->proc.proc_rxtx[0].frame_rx,
563
564
	  openair0_cfg[0].rx_freq[0]-ue->common_vars.freq_offset,
	  ue->common_vars.freq_offset);
Cedric Roux's avatar
Cedric Roux committed
565
566
567
568
569
570
571
#  else
    LOG_I(PHY, "[UE %d] Frame %d Measured Carrier Frequency %.0f Hz (offset %d Hz)\n",
	  ue->Mod_id,
	  ue->proc.proc_rxtx[0].frame_rx,
	  openair0_cfg[0].rx_freq[0]-ue->common_vars.freq_offset,
	  ue->common_vars.freq_offset);
#  endif
572
#endif
573
  } else {
574
#ifdef DEBUG_INITIAL_SYNC
575
576
    LOG_I(PHY,"[UE%d] Initial sync : PBCH not ok\n",ue->Mod_id);
    LOG_I(PHY,"[UE%d] Initial sync : Estimated PSS position %d, Nid2 %d\n",ue->Mod_id,sync_pos,ue->common_vars.eNb_id);
577
    /*      LOG_I(PHY,"[UE%d] Initial sync: (metric fdd_ncp %d (%d), metric fdd_ecp %d (%d), metric_tdd_ncp %d (%d), metric_tdd_ecp %d (%d))\n",
578
          ue->Mod_id,
579
580
581
582
          metric_fdd_ncp,Nid_cell_fdd_ncp,
          metric_fdd_ecp,Nid_cell_fdd_ecp,
          metric_tdd_ncp,Nid_cell_tdd_ncp,
          metric_tdd_ecp,Nid_cell_tdd_ecp);*/
583
    LOG_I(PHY,"[UE%d] Initial sync : Estimated Nid_cell %d, Frame_type %d\n",ue->Mod_id,
584
          frame_parms->Nid_cell,frame_parms->frame_type);
585
#endif
586

587
588
589
590
    ue->UE_mode[0] = NOT_SYNCHED;
    ue->pbch_vars[0]->pdu_errors_last=ue->pbch_vars[0]->pdu_errors;
    ue->pbch_vars[0]->pdu_errors++;
    ue->pbch_vars[0]->pdu_errors_conseq++;
591

592
593
  }

594
  // gain control
595
  if (ret!=0) { //we are not synched, so we cannot use rssi measurement (which is based on channel estimates)
596
597
    rx_power = 0;

598
599
    // do a measurement on the best guess of the PSS
    for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++)
600
      rx_power += signal_energy(&ue->common_vars.rxdata[aarx][sync_pos2],
601
602
603
604
				frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples);
    
    /*
    // do a measurement on the full frame
605
    for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++)
606
      rx_power += signal_energy(&ue->common_vars.rxdata[aarx][0],
607
				frame_parms->samples_per_tti*10);
608
    */
609
610

    // we might add a low-pass filter here later
611
    ue->measurements.rx_power_avg[0] = rx_power/frame_parms->nb_antennas_rx; 
612

613
    ue->measurements.rx_power_avg_dB[0] = dB_fixed(ue->measurements.rx_power_avg[0]);
614
615

#ifdef DEBUG_INITIAL_SYNCH
616
  LOG_I(PHY,"[UE%d] Initial sync : Estimated power: %d dB\n",ue->Mod_id,ue->measurements.rx_power_avg_dB[0] );
617
618
619
#endif

#ifndef OAI_USRP
620
621
#ifndef OAI_BLADERF 
#ifndef OAI_LMSSDR
622
  phy_adjust_gain(ue,ue->measurements.rx_power_avg_dB[0],0);
623
#endif
624
625
#endif
#endif
626

627
628
629
630
  }
  else {

#ifndef OAI_USRP
631
632
#ifndef OAI_BLADERF 
#ifndef OAI_LMSSDR
633
  phy_adjust_gain(ue,dB_fixed(ue->measurements.rssi),0);
634
#endif
635
636
#endif
#endif
637

638
639
  }

640
  //  exit_fun("debug exit");
641
642
  return ret;
}
643