Esempio n. 1
0
int srslte_sync_resize(srslte_sync_t *q, uint32_t frame_size, uint32_t max_offset, uint32_t fft_size) {

  int ret = SRSLTE_ERROR_INVALID_INPUTS;

  if (q                 != NULL         &&
      fft_size_isvalid(fft_size))
  {
    if (frame_size > q->max_frame_size) {
      fprintf(stderr, "Error in sync_resize(): frame_size must be lower than initialized\n");
      return SRSLTE_ERROR;
    }

    q->fft_size   = fft_size;
    q->frame_size = frame_size;
    q->max_offset = max_offset;

    if (srslte_pss_resize(&q->pss, q->max_offset, q->fft_size, 0)) {
      fprintf(stderr, "Error resizing PSS object\n");
      return SRSLTE_ERROR;
    }
    if (srslte_sss_resize(&q->sss, q->fft_size)) {
      fprintf(stderr, "Error resizing SSS object\n");
      return SRSLTE_ERROR;
    }

    if (srslte_cp_synch_resize(&q->cp_synch, q->fft_size)) {
      fprintf(stderr, "Error resizing CFO\n");
      return SRSLTE_ERROR;
    }

    if (srslte_cfo_resize(&q->cfo_corr_frame, q->frame_size)) {
      fprintf(stderr, "Error resizing CFO\n");
      return SRSLTE_ERROR;
    }

    if (srslte_cfo_resize(&q->cfo_corr_symbol, q->fft_size)) {
      fprintf(stderr, "Error resizing CFO\n");
      return SRSLTE_ERROR;
    }

    if (q->cfo_i_initiated) {
      for (int i=0;i<2;i++) {
        int offset=(i==0)?-1:1;
        if (srslte_pss_resize(&q->pss_i[i], q->max_offset, q->fft_size, offset)) {
          fprintf(stderr, "Error initializing PSS object\n");
        }
        for (int t=0;t<q->frame_size;t++) {
          q->cfo_i_corr[i][t] = cexpf(-2*_Complex_I*M_PI*offset*(float) t/q->fft_size);
        }
      }
    }

    // Update CFO tolerance
    srslte_sync_set_cfo_tol(q, q->current_cfo_tol);

    DEBUG("SYNC init with frame_size=%d, max_offset=%d and fft_size=%d\n", frame_size, max_offset, fft_size);

    ret = SRSLTE_SUCCESS;
  }  else {
    fprintf(stderr, "Invalid parameters frame_size: %d, fft_size: %d\n", frame_size, fft_size);
  }

  return ret;
}
Esempio n. 2
0
int srslte_ue_dl_set_cell(srslte_ue_dl_t *q, srslte_cell_t cell)
{
  int ret = SRSLTE_ERROR_INVALID_INPUTS;

  if (q               != NULL             &&
      srslte_cell_isvalid(&cell))
  {
    q->pkt_errors = 0;
    q->pkts_total = 0;
    q->pending_ul_dci_rnti = 0;
    q->sample_offset = 0;

    if (q->cell.id != cell.id || q->cell.nof_prb == 0) {
      if (q->cell.nof_prb != 0) {
        srslte_regs_free(&q->regs);
      }
      memcpy(&q->cell, &cell, sizeof(srslte_cell_t));
      if (srslte_regs_init(&q->regs, q->cell)) {
        fprintf(stderr, "Error resizing REGs\n");
        return SRSLTE_ERROR;
      }
      if (srslte_cfo_resize(&q->sfo_correct, q->cell.nof_prb*SRSLTE_NRE)) {
        fprintf(stderr, "Error resizing SFO correct\n");
        return SRSLTE_ERROR;
      }
      srslte_cfo_set_tol(&q->sfo_correct, 1e-5f/q->fft[0].symbol_sz);
      for (int port = 0; port < q->nof_rx_antennas; port++) {
        if (srslte_ofdm_rx_set_prb(&q->fft[port], q->cell.cp, q->cell.nof_prb)) {
          fprintf(stderr, "Error resizing FFT\n");
          return SRSLTE_ERROR;
        }
      }
      if (srslte_chest_dl_set_cell(&q->chest, q->cell)) {
        fprintf(stderr, "Error resizing channel estimator\n");
        return SRSLTE_ERROR;
      }
      if (srslte_pcfich_set_cell(&q->pcfich, &q->regs, q->cell)) {
        fprintf(stderr, "Error resizing PCFICH object\n");
        return SRSLTE_ERROR;
      }
      if (srslte_phich_set_cell(&q->phich, &q->regs, q->cell)) {
        fprintf(stderr, "Error resizing PHICH object\n");
        return SRSLTE_ERROR;
      }

      if (srslte_pdcch_set_cell(&q->pdcch, &q->regs, q->cell)) {
        fprintf(stderr, "Error resizing PDCCH object\n");
        return SRSLTE_ERROR;
      }

      if (srslte_pdsch_set_cell(&q->pdsch, q->cell)) {
        fprintf(stderr, "Error creating PDSCH object\n");
        return SRSLTE_ERROR;
      }
      q->current_rnti = 0;
    }
    ret = SRSLTE_SUCCESS;
  } else {
    fprintf(stderr, "Invalid cell properties ue_dl: Id=%d, Ports=%d, PRBs=%d\n",
            cell.id, cell.nof_ports, cell.nof_prb);
  }
  return ret;
}