示例#1
0
文件: ue_dl.c 项目: srsLTE/srsLTE
int srslte_ue_dl_init(srslte_ue_dl_t* q, cf_t* in_buffer[SRSLTE_MAX_PORTS], uint32_t max_prb, uint32_t nof_rx_antennas)
{
  int ret = SRSLTE_ERROR_INVALID_INPUTS;

  if (q != NULL && nof_rx_antennas <= SRSLTE_MAX_PORTS) {
    ret = SRSLTE_ERROR;

    bzero(q, sizeof(srslte_ue_dl_t));

    q->pending_ul_dci_count = 0;
    q->nof_rx_antennas      = nof_rx_antennas;
    q->mi_auto              = true;
    q->mi_manual_index      = 0;
    q->pregen_rnti          = 0;

    for (int j = 0; j < SRSLTE_MAX_PORTS; j++) {
      q->sf_symbols[j] = srslte_vec_malloc(MAX_SFLEN_RE * sizeof(cf_t));
      if (!q->sf_symbols[j]) {
        perror("malloc");
        goto clean_exit;
      }
    }

    for (int i = 0; i < nof_rx_antennas; i++) {
      if (srslte_ofdm_rx_init(&q->fft[i], SRSLTE_CP_NORM, in_buffer[i], q->sf_symbols[i], max_prb)) {
        ERROR("Error initiating FFT\n");
        goto clean_exit;
      }
    }

    if (srslte_ofdm_rx_init_mbsfn(&q->fft_mbsfn, SRSLTE_CP_EXT, in_buffer[0], q->sf_symbols[0], max_prb)) {
      ERROR("Error initiating FFT for MBSFN subframes \n");
      goto clean_exit;
    }
    srslte_ofdm_set_non_mbsfn_region(&q->fft_mbsfn, 2); // Set a default to init

    if (srslte_chest_dl_init(&q->chest, max_prb, nof_rx_antennas)) {
      ERROR("Error initiating channel estimator\n");
      goto clean_exit;
    }
    if (srslte_chest_dl_res_init(&q->chest_res, max_prb)) {
      ERROR("Error initiating channel estimator\n");
      goto clean_exit;
    }
    if (srslte_pcfich_init(&q->pcfich, nof_rx_antennas)) {
      ERROR("Error creating PCFICH object\n");
      goto clean_exit;
    }
    if (srslte_phich_init(&q->phich, nof_rx_antennas)) {
      ERROR("Error creating PHICH object\n");
      goto clean_exit;
    }

    if (srslte_pdcch_init_ue(&q->pdcch, max_prb, nof_rx_antennas)) {
      ERROR("Error creating PDCCH object\n");
      goto clean_exit;
    }

    if (srslte_pdsch_init_ue(&q->pdsch, max_prb, nof_rx_antennas)) {
      ERROR("Error creating PDSCH object\n");
      goto clean_exit;
    }

    if (srslte_pmch_init(&q->pmch, max_prb, nof_rx_antennas)) {
      ERROR("Error creating PMCH object\n");
      goto clean_exit;
    }

    ret = SRSLTE_SUCCESS;
  } else {
    ERROR("Invalid parameters\n");
  }

clean_exit:
  if (ret == SRSLTE_ERROR) {
    srslte_ue_dl_free(q);
  }
  return ret;
}
示例#2
0
int main(int argc, char** argv)
{

  srslte_chest_dl_res_t chest_dl_res;
  srslte_pdcch_t pdcch_tx, pdcch_rx;
  testcase_dci_t testcases[10];
  srslte_regs_t regs;
  int i;
  int nof_re;
  cf_t *slot_symbols[SRSLTE_MAX_PORTS];
  int nof_dcis;

  bzero(&testcases, sizeof(testcase_dci_t)*10);

  int ret = -1;

  parse_args(argc, argv);

  nof_re = SRSLTE_CP_NORM_NSYMB * cell.nof_prb * SRSLTE_NRE;

  if (test_dci_payload_size()) {
    exit(-1);
  }

  /* init memory */

  srslte_chest_dl_res_init(&chest_dl_res, cell.nof_prb);
  srslte_chest_dl_res_set_identity(&chest_dl_res);

  for (i = 0; i < SRSLTE_MAX_PORTS; i++) {
    slot_symbols[i] = malloc(sizeof(cf_t) * nof_re);
    if (!slot_symbols[i]) {
      perror("malloc");
      exit(-1);
    }
    bzero(slot_symbols[i], sizeof(cf_t) * nof_re);
  }

  if (srslte_regs_init(&regs, cell)) {
    ERROR("Error initiating regs\n");
    exit(-1);
  }

  if (srslte_pdcch_init_enb(&pdcch_tx, cell.nof_prb)) {
    ERROR("Error creating PDCCH object\n");
    exit(-1);
  }
  if (srslte_pdcch_set_cell(&pdcch_tx, &regs, cell)) {
    ERROR("Error setting cell in PDCCH object\n");
    exit(-1);
  }

  if (srslte_pdcch_init_ue(&pdcch_rx, cell.nof_prb, nof_rx_ant)) {
    ERROR("Error creating PDCCH object\n");
    exit(-1);
  }
  if (srslte_pdcch_set_cell(&pdcch_rx, &regs, cell)) {
    ERROR("Error setting cell in PDCCH object\n");
    exit(-1);
  }

  /* Resource allocate init */
  nof_dcis = 0;
  srslte_dci_dl_t dci;
  ZERO_OBJECT(dci);
  dci.pid                     = 5;
  dci.tb[0].mcs_idx           = 5;
  dci.tb[0].ndi               = 0;
  dci.tb[0].rv                = 1;
  dci.alloc_type              = SRSLTE_RA_ALLOC_TYPE0;
  dci.type0_alloc.rbg_bitmask = 0x5;
  dci.cif_present             = dci_cfg.cif_enabled;
  if (dci_cfg.cif_enabled) {
    dci.cif = (uint32_t)(random() & 0x7);
  }

  /* Format 1 Test case */
  if (cell.nof_ports == 1) {
    testcases[nof_dcis].dci_format = SRSLTE_DCI_FORMAT1;
    if (dci_cfg.cif_enabled) {
      dci.cif = (uint32_t)(random() & 0x7);
    }
    testcases[nof_dcis].ra_dl_tx = dci;
    nof_dcis++;

    /* Format 1 Test case */
    dci.tb[0].mcs_idx              = 15;
    testcases[nof_dcis].dci_format = SRSLTE_DCI_FORMAT1;
    if (dci_cfg.cif_enabled) {
      dci.cif = (uint32_t)(random() & 0x7);
    }
    testcases[nof_dcis].ra_dl_tx = dci;
    nof_dcis++;
  }

  /* Tx Diversity Test case */
  if (cell.nof_ports > 1) {
    dci.tb[1].mcs_idx              = 13;
    dci.tb[1].rv                   = 3;
    dci.tb[1].ndi                  = true;
    testcases[nof_dcis].dci_format = SRSLTE_DCI_FORMAT2A;
    if (dci_cfg.cif_enabled) {
      dci.cif = (uint32_t)(random() & 0x7);
    }
    testcases[nof_dcis].ra_dl_tx = dci;
    nof_dcis++;
  }

  /* CDD Spatial Multiplexing Test case */
  if (cell.nof_ports > 1) {
    dci.tb[1].mcs_idx              = 28;
    dci.tb[1].rv                   = 1;
    dci.tb[1].ndi                  = false;
    testcases[nof_dcis].dci_format = SRSLTE_DCI_FORMAT2;
    if (dci_cfg.cif_enabled) {
      dci.cif = (uint32_t)(random() & 0x7);
    }
    testcases[nof_dcis].ra_dl_tx = dci;
    nof_dcis++;
  }

  srslte_dci_cfg_t dci_cfg;
  ZERO_OBJECT(dci_cfg);

  srslte_dl_sf_cfg_t dl_sf;
  ZERO_OBJECT(dl_sf);
  dl_sf.cfi = cfi;

  for (int s=0;s<10;s++) {
    dl_sf.tti = s;
    printf("Encoding %d DCIs for sf_idx=%d\n", nof_dcis, s);
    /* Execute Rx */
    for (i=0;i<nof_dcis;i++) {
      testcases[i].ra_dl_tx.rnti   = (uint16_t) (1234 + i);
      testcases[i].ra_dl_tx.format = testcases[i].dci_format;

      srslte_dci_msg_pack_pdsch(&cell, &dl_sf, &dci_cfg, &testcases[i].ra_dl_tx, &testcases[i].dci_tx);
      srslte_dci_location_set(&testcases[i].dci_location, 0, (uint32_t) i);

      testcases[i].dci_tx.format   = testcases[i].dci_format;
      testcases[i].dci_tx.location = testcases[i].dci_location;

      // Enable just 1 TB per default
      if (testcases[i].dci_format < SRSLTE_DCI_FORMAT2) {
        for (int j=1;j<SRSLTE_MAX_CODEWORDS;j++) {
          SRSLTE_DCI_TB_DISABLE(testcases[i].ra_dl_tx.tb[j]);
        }
      }

      if (srslte_pdcch_encode(&pdcch_tx, &dl_sf, &testcases[i].dci_tx, slot_symbols)) {
        ERROR("Error encoding DCI message\n");
        goto quit;
      }
    }

    /* Execute 'Rx' */
    if (srslte_pdcch_extract_llr(&pdcch_rx, &dl_sf, &chest_dl_res, slot_symbols)) {
      ERROR("Error extracting LLRs\n");
      goto quit;
    }

    /* Decode DCIs */
    for (i=0;i<nof_dcis;i++) {
      testcases[i].dci_rx.format   = testcases[i].dci_format;
      testcases[i].dci_rx.location = testcases[i].dci_location;
      if (srslte_pdcch_decode_msg(&pdcch_rx, &dl_sf, &dci_cfg, &testcases[i].dci_rx)) {
        ERROR("Error decoding DCI message\n");
        goto quit;
      }
      if (srslte_dci_msg_unpack_pdsch(&cell, &dl_sf, &dci_cfg, &testcases[i].dci_rx, &testcases[i].ra_dl_rx)) {
        ERROR("Error unpacking DCI message\n");
        goto quit;
      }
      if (testcases[i].dci_rx.rnti >= 1234 && testcases[i].dci_rx.rnti < 1234 + nof_dcis) {
        testcases[i].dci_rx.rnti -= 1234;
      } else {
        printf("Received invalid DCI CRC %d\n", testcases[i].dci_rx.rnti);
        goto quit;
      }
    }

    /* Compare Tx and Rx */
    for (i = 0; i < nof_dcis; i++) {
      if (memcmp(testcases[i].dci_tx.payload, testcases[i].dci_rx.payload, testcases[i].dci_tx.nof_bits)) {
        printf("Error in DCI %d: Received data does not match\n", i);
        goto quit;
      }
#if SRSLTE_DCI_HEXDEBUG
      // Ignore Hex str
    bzero(testcases[i].ra_dl_rx.hex_str, sizeof(testcases[i].ra_dl_rx.hex_str));
    testcases[i].ra_dl_rx.nof_bits = 0;
#endif
      // Ignore DCI location
      testcases[i].ra_dl_rx.location = testcases[i].ra_dl_tx.location;
      // Ignore cw_idx
      for (int j=0;j<SRSLTE_MAX_CODEWORDS;j++) {
        testcases[i].ra_dl_rx.tb[j].cw_idx = testcases[i].ra_dl_tx.tb[j].cw_idx;
      }
      if (memcmp(&testcases[i].ra_dl_tx, &testcases[i].ra_dl_rx, sizeof(srslte_dci_dl_t))) {
        uint8_t *x=(uint8_t*) &testcases[i].ra_dl_rx;
        uint8_t *y=(uint8_t*) &testcases[i].ra_dl_tx;
        for (int j=0;j<sizeof(srslte_dci_dl_t);j++) {
          if (x[j] != y[j]) {
            printf("error in byte %d, rx=%d, tx=%d\n", j, x[j], y[j]);
          }
        }
        printf("tx: "); srslte_vec_fprint_byte(stdout, (uint8_t*) &testcases[i].ra_dl_tx, sizeof(srslte_dci_dl_t));
        printf("rx: "); srslte_vec_fprint_byte(stdout, (uint8_t*) &testcases[i].ra_dl_rx, sizeof(srslte_dci_dl_t));
        printf("Error in RA %d: Received data does not match\n", i);
        printf("     Field    |    Tx    |    Rx    \n");
        printf("--------------+----------+----------\n");
        if (testcases[i].ra_dl_tx.cif) {
          printf("          cif | %8d | %8d\n", testcases[i].ra_dl_tx.cif, testcases[i].ra_dl_rx.cif);
        }
        printf(" harq_process | %8d | %8d\n", testcases[i].ra_dl_tx.pid, testcases[i].ra_dl_rx.pid);
        printf("      mcs_idx | %8d | %8d\n", testcases[i].ra_dl_tx.tb[0].mcs_idx, testcases[i].ra_dl_rx.tb[0].mcs_idx);
        printf("       rv_idx | %8d | %8d\n", testcases[i].ra_dl_tx.tb[0].rv, testcases[i].ra_dl_rx.tb[0].rv);
        printf("          ndi | %8d | %8d\n", testcases[i].ra_dl_tx.tb[0].ndi, testcases[i].ra_dl_rx.tb[0].ndi);
        printf("    mcs_idx_1 | %8d | %8d\n", testcases[i].ra_dl_tx.tb[1].mcs_idx, testcases[i].ra_dl_rx.tb[1].mcs_idx);
        printf("     rv_idx_1 | %8d | %8d\n", testcases[i].ra_dl_tx.tb[1].rv, testcases[i].ra_dl_rx.tb[1].rv);
        printf("        ndi_1 | %8d | %8d\n", testcases[i].ra_dl_tx.tb[1].ndi, testcases[i].ra_dl_rx.tb[1].ndi);
        printf("   tb_cw_swap | %8d | %8d\n", testcases[i].ra_dl_tx.tb_cw_swap, testcases[i].ra_dl_rx.tb_cw_swap);
        printf("      sram_id | %8d | %8d\n", testcases[i].ra_dl_tx.sram_id, testcases[i].ra_dl_rx.sram_id);
        printf("        pinfo | %8d | %8d\n", testcases[i].ra_dl_tx.pinfo, testcases[i].ra_dl_rx.pinfo);
        printf("        pconf | %8d | %8d\n", testcases[i].ra_dl_tx.pconf, testcases[i].ra_dl_rx.pconf);
        printf(" power_offset | %8d | %8d\n", testcases[i].ra_dl_tx.power_offset, testcases[i].ra_dl_rx.power_offset);
        printf("    tpc_pucch | %8d | %8d\n", testcases[i].ra_dl_tx.tpc_pucch, testcases[i].ra_dl_rx.tpc_pucch);
        goto quit;
      }
    }
  }
  ret = 0;

quit: 
  srslte_pdcch_free(&pdcch_tx);
  srslte_pdcch_free(&pdcch_rx);
  srslte_chest_dl_res_free(&chest_dl_res);
  srslte_regs_free(&regs);

  for (i = 0; i < SRSLTE_MAX_PORTS; i++) {
    free(slot_symbols[i]);
  }
  if (ret) {
    printf("Error\n");
  } else {
    printf("Ok\n");
  }
  srslte_dft_exit();
  exit(ret);
}
示例#3
0
文件: ue_dl.c 项目: mfkiwl/srsLTE
int srslte_ue_dl_init(srslte_ue_dl_t *q,
                      cf_t *in_buffer[SRSLTE_MAX_PORTS],
                      uint32_t max_prb,
                      uint32_t nof_rx_antennas)
{
  int ret = SRSLTE_ERROR_INVALID_INPUTS; 
  
  if (q               != NULL             &&
      nof_rx_antennas <= SRSLTE_MAX_PORTS)
  {
    ret = SRSLTE_ERROR;
    
    bzero(q, sizeof(srslte_ue_dl_t));
   
    q->pdsch_pkt_errors = 0;
    q->pdsch_pkts_total = 0;
    q->pmch_pkt_errors = 0;
    q->pmch_pkts_total = 0;
    q->pending_ul_dci_rnti = 0; 
    q->sample_offset = 0; 
    q->nof_rx_antennas = nof_rx_antennas;

    for (int j = 0; j < SRSLTE_MAX_PORTS; j++) {
      q->sf_symbols_m[j] = srslte_vec_malloc(MAX_SFLEN_RE * sizeof(cf_t));
      if (!q->sf_symbols_m[j]) {
        perror("malloc");
        goto clean_exit;
      }
      for (uint32_t i=0;i<SRSLTE_MAX_PORTS;i++) {
        q->ce_m[i][j] = srslte_vec_malloc(MAX_SFLEN_RE * sizeof(cf_t));
        if (!q->ce_m[i][j]) {
          perror("malloc");
          goto clean_exit;
        }
        bzero(q->ce_m[i][j], MAX_SFLEN_RE * sizeof(cf_t));
      }
    }

    q->sf_symbols = q->sf_symbols_m[0];
    for (int i=0;i<SRSLTE_MAX_PORTS;i++) {
      q->ce[i] = q->ce_m[i][0];
    }

    for (int i = 0; i < nof_rx_antennas; i++) {
      if (srslte_ofdm_rx_init(&q->fft[i], SRSLTE_CP_NORM, in_buffer[i], q->sf_symbols_m[i], max_prb)) {
        fprintf(stderr, "Error initiating FFT\n");
        goto clean_exit;
      }
    }

    if (srslte_ofdm_rx_init_mbsfn(&q->fft_mbsfn, SRSLTE_CP_EXT, in_buffer[0], q->sf_symbols_m[0], max_prb)) {
      fprintf(stderr, "Error initiating FFT for MBSFN subframes \n");
      goto clean_exit;
    }
    srslte_ofdm_set_non_mbsfn_region(&q->fft_mbsfn, 2); // Set a default to init
    
    if (srslte_chest_dl_init(&q->chest, max_prb)) {
      fprintf(stderr, "Error initiating channel estimator\n");
      goto clean_exit;
    }
    if (srslte_pcfich_init(&q->pcfich, nof_rx_antennas)) {
      fprintf(stderr, "Error creating PCFICH object\n");
      goto clean_exit;
    }
    if (srslte_phich_init(&q->phich, nof_rx_antennas)) {
      fprintf(stderr, "Error creating PHICH object\n");
      goto clean_exit;
    }

    if (srslte_pdcch_init_ue(&q->pdcch, max_prb, nof_rx_antennas)) {
      fprintf(stderr, "Error creating PDCCH object\n");
      goto clean_exit;
    }

    if (srslte_pdsch_init_ue(&q->pdsch, max_prb, nof_rx_antennas)) {
      fprintf(stderr, "Error creating PDSCH object\n");
      goto clean_exit;
    }

    if (srslte_pmch_init_multi(&q->pmch, max_prb, nof_rx_antennas)) {
      fprintf(stderr, "Error creating PMCH object\n");
      goto clean_exit;
    }
    for (int i = 0; i < SRSLTE_MAX_TB; i++) {
      q->softbuffers[i] = srslte_vec_malloc(sizeof(srslte_softbuffer_rx_t));
      if (!q->softbuffers[i]) {
        fprintf(stderr, "Error allocating soft buffer\n");
        goto clean_exit;
      }

      if (srslte_softbuffer_rx_init(q->softbuffers[i], max_prb)) {
        fprintf(stderr, "Error initiating soft buffer\n");
        goto clean_exit;
      }
    }
    if (srslte_cfo_init(&q->sfo_correct, max_prb*SRSLTE_NRE)) {
      fprintf(stderr, "Error initiating SFO correct\n");
      goto clean_exit;
    }
    srslte_cfo_set_tol(&q->sfo_correct, 1e-5f/q->fft[0].symbol_sz);
    
    ret = SRSLTE_SUCCESS;
  } else {
    fprintf(stderr, "Invalid parametres\n");
  }

clean_exit: 
  if (ret == SRSLTE_ERROR) {
    srslte_ue_dl_free(q);
  }
  return ret;
}