initial_sync.c 19.8 KB
Newer Older
1 2 3 4 5
/*
 * 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
6
 * the OAI Public License, Version 1.1  (the "License"); you may not use this file
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
 * 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
/*! \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"
33 34 35
#include "PHY/defs_UE.h"
#include "PHY/phy_extern_ue.h"
#include "SCHED_UE/sched_UE.h"
36 37 38 39 40
#include "transport_proto_ue.h"
#include "PHY/MODULATION/modulation_UE.h"
#include "PHY/LTE_ESTIMATION/lte_estimation.h"
#include "PHY/LTE_REFSIG/lte_refsig.h"
#include "openair2/LAYER2/MAC/mac_proto.h"
41
#include "common_lib.h"
42 43
#include "PHY/INIT/phy_init.h"

44
extern openair0_config_t openair0_cfg[];
45

46
//#define DEBUG_INITIAL_SYNCH
47

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

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

66
  for (l=0; l<frame_parms->symbols_per_tti/2; l++) {
67
    slot_fep(ue,
68 69 70 71 72
             l,
             1,
             ue->rx_offset,
             0,
             1);
73
  }
74

75 76 77 78 79 80
  slot_fep(ue,
           0,
           2,
           ue->rx_offset,
           0,
           1);
81
  lte_ue_measurements(ue,
82 83 84
                      ue->rx_offset,
                      0,
                      0,
85 86 87
                      0,
                      0);

88 89
  if (ue->frame_parms.frame_type == TDD) {
    ue_rrc_measurements(ue,
90 91 92
                        2,
                        0);
  } else {
93
    ue_rrc_measurements(ue,
94 95
                        0,
                        0);
96
  }
97

98
#ifdef DEBUG_INITIAL_SYNCH
99
  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",
100 101 102 103 104 105 106 107 108
        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);
109
  LOG_I(PHY,"[UE %d] N0 %d dBm digital (%d, %d) dB, linear (%d, %d), avg noise power %d dB (%d lin)\n",
110 111 112 113 114 115 116 117
        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);
118 119
#endif
  pbch_decoded = 0;
120 121

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

130 131 132 133
    if ((pbch_tx_ant>0) && (pbch_tx_ant<=2)) {
      pbch_decoded = 1;
      break;
    }
134

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

143 144 145 146 147
    if ((pbch_tx_ant>0) && (pbch_tx_ant<=2)) {
      pbch_decoded = 1;
      break;
    }
  }
148

149
  if (pbch_decoded) {
Xiwen JIANG's avatar
Xiwen JIANG committed
150
    frame_parms->nb_antenna_ports_eNB = pbch_tx_ant;
151 152 153
    // set initial transmission mode to 1 or 2 depending on number of detected TX antennas
    // openair_daq_vars.dlsch_transmission_mode = (pbch_tx_ant>1) ? 2 : 1;
    // flip byte endian on 24-bits for MIB
154 155 156
    //    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;
157
    // now check for Bandwidth of Cell
158
    dummy = (ue->pbch_vars[0]->decoded_output[2]>>5)&7;
159

160
    switch (dummy) {
161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188
      case 0 :
        frame_parms->N_RB_DL = 6;
        break;

      case 1 :
        frame_parms->N_RB_DL = 15;
        break;

      case 2 :
        frame_parms->N_RB_DL = 25;
        break;

      case 3 :
        frame_parms->N_RB_DL = 50;
        break;

      case 4 :
        frame_parms->N_RB_DL = 75;
        break;

      case 5:
        frame_parms->N_RB_DL = 100;
        break;

      default:
        LOG_E(PHY,"[UE%d] Initial sync: PBCH decoding: Unknown N_RB_DL\n",ue->Mod_id);
        return -1;
        break;
189
    }
190

191
    // now check for PHICH parameters
192 193
    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;
194

195
    switch (dummy) {
196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219
      case 0:
        frame_parms->phich_config_common.phich_resource = oneSixth;
        sprintf(phich_resource,"1/6");
        break;

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

      case 2:
        frame_parms->phich_config_common.phich_resource = one;
        sprintf(phich_resource,"1");
        break;

      case 3:
        frame_parms->phich_config_common.phich_resource = two;
        sprintf(phich_resource,"2");
        break;

      default:
        LOG_E(PHY,"[UE%d] Initial sync: Unknown PHICH_DURATION\n",ue->Mod_id);
        return -1;
        break;
220
    }
221

222 223 224 225
    for(int i=0; i<RX_NB_TH; i++) {
      ue->proc.proc_rxtx[i].frame_rx =   (((ue->pbch_vars[0]->decoded_output[2]&3)<<6) + (ue->pbch_vars[0]->decoded_output[1]>>2))<<2;
      ue->proc.proc_rxtx[i].frame_rx =   (((ue->pbch_vars[0]->decoded_output[2]&3)<<6) + (ue->pbch_vars[0]->decoded_output[1]>>2))<<2;
      ue->proc.proc_rxtx[i].frame_tx = ue->proc.proc_rxtx[0].frame_rx;
226
    }
227

228
#ifdef DEBUG_INITIAL_SYNCH
229
    LOG_I(PHY,"[UE%d] Initial sync: pbch decoded sucessfully p %d, tx_ant %d, frame %d, N_RB_DL %d, phich_duration %d, phich_resource %s!\n",
230
          ue->Mod_id,
231
          frame_parms->nb_antenna_ports_eNB,
232
          pbch_tx_ant,
233
          ue->proc.proc_rxtx[0].frame_rx,
234 235 236
          frame_parms->N_RB_DL,
          frame_parms->phich_config_common.phich_duration,
          phich_resource);  //frame_parms->phich_config_common.phich_resource);
237 238
#endif
    return(0);
239
  } else {
240 241 242 243
    return(-1);
  }
}

244 245 246 247
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"};

248
int initial_sync(PHY_VARS_UE *ue, runmode_t mode) {
249
  int32_t sync_pos,sync_pos2,sync_pos_slot;
250 251 252 253
  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;
254
  LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
255 256
  int ret=-1;
  int aarx,rx_power=0;
257
  /*#ifdef OAI_USRP
258
  __m128i *rxdata128;
259
  #endif*/
260 261
  //  LOG_I(PHY,"**************************************************************\n");
  // First try FDD normal prefix
Raymond Knopp's avatar
 
Raymond Knopp committed
262 263
  frame_parms->Ncp=NORMAL;
  frame_parms->frame_type=FDD;
264
  frame_parms->nb_antenna_ports_eNB = 2;
265
  init_frame_parms(frame_parms,1);
kaltenbe's avatar
kaltenbe committed
266
  /*
bruno mongazon's avatar
bruno mongazon committed
267
  LOG_M("rxdata0.m","rxd0",ue->common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1);
kaltenbe's avatar
kaltenbe committed
268 269
  exit(-1);
  */
270
  sync_pos = lte_sync_time(ue->common_vars.rxdata,
271
                           frame_parms,
272
                           (int *)&ue->common_vars.eNb_id);
273

bruno mongazon's avatar
bruno mongazon committed
274
  //  LOG_M("rxdata1.m","rxd1",ue->common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1);
275 276 277 278 279 280
  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
281
  LOG_I(PHY,"[UE%d] Initial sync : Estimated PSS position %d, Nid2 %d\n",ue->Mod_id,sync_pos,ue->common_vars.eNb_id);
282 283 284 285 286 287
#endif
  // SSS detection
  // 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)
288
    ue->rx_offset = sync_pos2 - sync_pos_slot;
289
  else
290
    ue->rx_offset = FRAME_LENGTH_COMPLEX_SAMPLES + sync_pos2 - sync_pos_slot;
291

292
  if (((sync_pos2 - sync_pos_slot) >=0 ) &&
293
      ((sync_pos2 - sync_pos_slot) < ((FRAME_LENGTH_COMPLEX_SAMPLES-frame_parms->samples_per_tti/2)))) {
294
#ifdef DEBUG_INITIAL_SYNCH
295 296
    LOG_I(PHY,"Calling sss detection (FDD normal CP)\n");
#endif
297
    rx_sss(ue,&metric_fdd_ncp,&flip_fdd_ncp,&phase_fdd_ncp);
298
    frame_parms->nushift  = frame_parms->Nid_cell%6;
299

300
    if (flip_fdd_ncp==1)
301
      ue->rx_offset += (FRAME_LENGTH_COMPLEX_SAMPLES>>1);
302

303 304 305
    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);
bruno mongazon's avatar
bruno mongazon committed
306
    //   LOG_M("rxdata2.m","rxd2",ue->common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1);
307 308
#ifdef DEBUG_INITIAL_SYNCH
    LOG_I(PHY,"FDD Normal prefix: CellId %d metric %d, phase %d, flip %d, pbch %d\n",
309 310 311
          frame_parms->Nid_cell,metric_fdd_ncp,phase_fdd_ncp,flip_fdd_ncp,ret);
#endif
  } else {
312
#ifdef DEBUG_INITIAL_SYNCH
313
    LOG_I(PHY,"FDD Normal prefix: SSS error condition: sync_pos %d, sync_pos_slot %d\n", sync_pos, sync_pos_slot);
314 315 316 317 318
#endif
  }

  if (ret==-1) {
    // Now FDD extended prefix
Raymond Knopp's avatar
 
Raymond Knopp committed
319 320
    frame_parms->Ncp=EXTENDED;
    frame_parms->frame_type=FDD;
321
    init_frame_parms(frame_parms,1);
322

323 324 325 326
    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;
327

328 329
    // 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);
330

331
    if (sync_pos2 >= sync_pos_slot)
332
      ue->rx_offset = sync_pos2 - sync_pos_slot;
333
    else
334
      ue->rx_offset = FRAME_LENGTH_COMPLEX_SAMPLES + sync_pos2 - sync_pos_slot;
335

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

338 339
    if (((sync_pos2 - sync_pos_slot) >=0 ) &&
        ((sync_pos2 - sync_pos_slot) < ((FRAME_LENGTH_COMPLEX_SAMPLES-frame_parms->samples_per_tti/2)))) {
340
      rx_sss(ue,&metric_fdd_ecp,&flip_fdd_ecp,&phase_fdd_ecp);
341
      frame_parms->nushift  = frame_parms->Nid_cell%6;
342

343
      if (flip_fdd_ecp==1)
344
        ue->rx_offset += (FRAME_LENGTH_COMPLEX_SAMPLES>>1);
345

346 347 348
      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);
bruno mongazon's avatar
bruno mongazon committed
349
      //     LOG_M("rxdata3.m","rxd3",ue->common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1);
350 351
#ifdef DEBUG_INITIAL_SYNCH
      LOG_I(PHY,"FDD Extended prefix: CellId %d metric %d, phase %d, flip %d, pbch %d\n",
352
            frame_parms->Nid_cell,metric_fdd_ecp,phase_fdd_ecp,flip_fdd_ecp,ret);
353
#endif
354
    } else {
355
#ifdef DEBUG_INITIAL_SYNCH
356
      LOG_I(PHY,"FDD Extended prefix: SSS error condition: sync_pos %d, sync_pos_slot %d\n", sync_pos, sync_pos_slot);
357 358 359 360 361
#endif
    }

    if (ret==-1) {
      // Now TDD normal prefix
Raymond Knopp's avatar
 
Raymond Knopp committed
362 363
      frame_parms->Ncp=NORMAL;
      frame_parms->frame_type=TDD;
364
      frame_parms->tdd_config=1;
365 366 367
      init_frame_parms(frame_parms,1);

      if (sync_pos >= frame_parms->nb_prefix_samples)
368
        sync_pos2 = sync_pos - frame_parms->nb_prefix_samples;
369
      else
370
        sync_pos2 = sync_pos + FRAME_LENGTH_COMPLEX_SAMPLES - frame_parms->nb_prefix_samples;
371 372

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

378
      if (sync_pos2 >= sync_pos_slot)
379
        ue->rx_offset = sync_pos2 - sync_pos_slot;
380
      else
381
        ue->rx_offset = (FRAME_LENGTH_COMPLEX_SAMPLES>>1) + sync_pos2 - sync_pos_slot;
382

383
      rx_sss(ue,&metric_tdd_ncp,&flip_tdd_ncp,&phase_tdd_ncp);
384 385

      if (flip_tdd_ncp==1)
386
        ue->rx_offset += (FRAME_LENGTH_COMPLEX_SAMPLES>>1);
387 388

      frame_parms->nushift  = frame_parms->Nid_cell%6;
389 390 391
      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);
bruno mongazon's avatar
bruno mongazon committed
392
      //      LOG_M("rxdata4.m","rxd4",ue->common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1);
393
#ifdef DEBUG_INITIAL_SYNCH
394 395
      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);
396
#endif
397 398 399 400 401

      if (ret==-1) {
        // Now TDD extended prefix
        frame_parms->Ncp=EXTENDED;
        frame_parms->frame_type=TDD;
402
        frame_parms->tdd_config=1;
403 404 405 406 407 408 409 410 411 412 413 414
        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)
415
          ue->rx_offset = sync_pos2 - sync_pos_slot;
416
        else
417
          ue->rx_offset = (FRAME_LENGTH_COMPLEX_SAMPLES>>1) + sync_pos2 - sync_pos_slot;
418

419
        rx_sss(ue,&metric_tdd_ecp,&flip_tdd_ecp,&phase_tdd_ecp);
420 421 422
        frame_parms->nushift  = frame_parms->Nid_cell%6;

        if (flip_tdd_ecp==1)
423
          ue->rx_offset += (FRAME_LENGTH_COMPLEX_SAMPLES>>1);
424

425 426 427
        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);
428
        //  LOG_M("rxdata5.m","rxd5",ue->common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1);
429
#ifdef DEBUG_INITIAL_SYNCH
430 431
        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);
432 433 434 435
#endif
      }
    }
  }
436

437
  /* Consider this is a false detection if the offset is > 1000 Hz */
438 439 440
  if( (abs(ue->common_vars.freq_offset) > 150) && (ret == 0) ) {
    ret=-1;
    LOG_E(HW, "Ignore MIB with high freq offset [%d Hz] estimation \n",ue->common_vars.freq_offset);
441 442
  }

443
  if (ret==0) {  // PBCH found so indicate sync to higher layers and configure frame parameters
Cedric Roux's avatar
Cedric Roux committed
444
    LOG_I(PHY, "[UE%d] In synch, rx_offset %d samples\n",ue->Mod_id, ue->rx_offset);
445

446
    if (ue->UE_scan_carrier == 0) {
447
#if UE_AUTOTEST_TRACE
448
      LOG_I(PHY,"[UE  %d] AUTOTEST Cell Sync : frame = %d, rx_offset %d, freq_offset %d \n",
449 450 451 452 453 454
            ue->Mod_id,
            ue->proc.proc_rxtx[0].frame_rx,
            ue->rx_offset,
            ue->common_vars.freq_offset );
#endif
      // send sync status to higher layers later when timing offset converge to target timing
455 456
      generate_pcfich_reg_mapping(frame_parms);
      generate_phich_reg_mapping(frame_parms);
457
      ue->pbch_vars[0]->pdu_errors_conseq=0;
458
    }
459

Cedric Roux's avatar
Cedric Roux committed
460
    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,
461 462 463 464 465 466 467
          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])));
Cedric Roux's avatar
Cedric Roux committed
468
    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",
469 470 471 472 473 474 475 476 477
          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);
Cedric Roux's avatar
Cedric Roux committed
478
    LOG_I(PHY, "[UE %d] Frame %d Measured Carrier Frequency %.0f Hz (offset %d Hz)\n",
479 480 481 482
          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);
483
  } else {
484
#ifdef DEBUG_INITIAL_SYNC
485 486
    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);
487
    /*      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",
488
          ue->Mod_id,
489 490 491 492
          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);*/
493
    LOG_I(PHY,"[UE%d] Initial sync : Estimated Nid_cell %d, Frame_type %d\n",ue->Mod_id,
494
          frame_parms->Nid_cell,frame_parms->frame_type);
495
#endif
496 497 498 499
    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++;
500 501
  }

502
  // gain control
503
  if (ret!=0) { //we are not synched, so we cannot use rssi measurement (which is based on channel estimates)
504 505
    rx_power = 0;

506 507
    // do a measurement on the best guess of the PSS
    for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++)
508
      rx_power += signal_energy(&ue->common_vars.rxdata[aarx][sync_pos2],
509
                                frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples);
510

511 512
    /*
    // do a measurement on the full frame
513
    for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++)
514
      rx_power += signal_energy(&ue->common_vars.rxdata[aarx][0],
515
        frame_parms->samples_per_tti*10);
516
    */
517
    // we might add a low-pass filter here later
518
    ue->measurements.rx_power_avg[0] = rx_power/frame_parms->nb_antennas_rx;
519
    ue->measurements.rx_power_avg_dB[0] = dB_fixed(ue->measurements.rx_power_avg[0]);
520
#ifdef DEBUG_INITIAL_SYNCH
521
    LOG_I(PHY,"[UE%d] Initial sync : Estimated power: %d dB\n",ue->Mod_id,ue->measurements.rx_power_avg_dB[0] );
522 523
#endif
#ifndef OAI_USRP
524
#ifndef OAI_BLADERF
525
#ifndef OAI_LMSSDR
526
    phy_adjust_gain(ue,ue->measurements.rx_power_avg_dB[0],0);
527
#endif
528 529
#endif
#endif
530
  } else {
531
#ifndef OAI_USRP
532
#ifndef OAI_BLADERF
533
#ifndef OAI_LMSSDR
534
    phy_adjust_gain(ue,dB_fixed(ue->measurements.rssi),0);
535
#endif
536 537 538 539
#endif
#endif
  }

540
  //  exit_fun("debug exit");
541 542
  return ret;
}
543