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; }
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; }