int srslte_ue_dl_decode_mbsfn(srslte_ue_dl_t * q, uint8_t *data, uint32_t tti) { srslte_ra_dl_grant_t grant; int ret = SRSLTE_ERROR; uint32_t cfi; uint32_t sf_idx = tti%10; if ((ret = srslte_ue_dl_decode_fft_estimate_mbsfn(q, sf_idx, &cfi, SRSLTE_SF_MBSFN)) < 0) { return ret; } float noise_estimate = srslte_chest_dl_get_noise_estimate(&q->chest); // Uncoment next line to do ZF by default in pdsch_ue example //float noise_estimate = 0; grant.sf_type = SRSLTE_SF_MBSFN; grant.mcs[0].idx = 2; grant.tb_en[0] = true; grant.tb_en[1] = false; grant.nof_prb = q->pmch.cell.nof_prb; srslte_dl_fill_ra_mcs(&grant.mcs[0], grant.nof_prb); srslte_softbuffer_rx_reset_tbs(q->softbuffers[0], (uint32_t) grant.mcs[0].tbs); for(int j = 0; j < 2; j++){ for(int f = 0; f < grant.nof_prb; f++){ grant.prb_idx[j][f] = true; } } grant.Qm[0] = srslte_mod_bits_x_symbol(grant.mcs[0].mod); // redundancy version is set to 0 for the PMCH if (srslte_ue_dl_cfg_grant(q, &grant, cfi, sf_idx, SRSLTE_PMCH_RV, SRSLTE_MIMO_TYPE_SINGLE_ANTENNA)) { return SRSLTE_ERROR; } if (q->pmch_cfg.grant.mcs[0].mod > 0 && q->pmch_cfg.grant.mcs[0].tbs >= 0) { ret = srslte_pmch_decode_multi(&q->pmch, &q->pmch_cfg, q->softbuffers[0], q->sf_symbols_m, q->ce_m, noise_estimate, q->current_mbsfn_area_id, data); if (ret == SRSLTE_ERROR) { q->pmch_pkt_errors++; } else if (ret == SRSLTE_ERROR_INVALID_INPUTS) { fprintf(stderr, "Error calling srslte_pmch_decode()\n"); } } q->pmch_pkts_total++; if (ret == SRSLTE_SUCCESS) { return q->pmch_cfg.grant.mcs[0].tbs; } else { return 0; } }
int srslte_pmch_decode(srslte_pmch_t *q, srslte_pdsch_cfg_t *cfg, srslte_softbuffer_rx_t *softbuffer, cf_t *sf_symbols, cf_t *ce[SRSLTE_MAX_PORTS], float noise_estimate, uint16_t area_id, uint8_t *data) { cf_t *_sf_symbols[SRSLTE_MAX_PORTS]; cf_t *_ce[SRSLTE_MAX_PORTS][SRSLTE_MAX_PORTS]; _sf_symbols[0] = sf_symbols; for (int i=0;i<q->cell.nof_ports;i++) { _ce[i][0] = ce[i]; } return srslte_pmch_decode_multi(q, cfg, softbuffer, _sf_symbols, _ce, noise_estimate, area_id, data); }