/* Encode UCI CQI/PMI as described in 5.2.2.6 of 36.212 */ int srslte_uci_encode_cqi_pusch(srslte_uci_cqi_pusch_t* q, srslte_pusch_cfg_t* cfg, uint8_t* cqi_data, uint32_t cqi_len, float beta, uint32_t Q_prime_ri, uint8_t* q_bits) { if (beta < 0) { ERROR("Error beta is reserved\n"); return -1; } uint32_t Q_prime = Q_prime_cqi(cfg, cqi_len, beta, Q_prime_ri); uint32_t Qm = srslte_mod_bits_x_symbol(cfg->grant.tb.mod); int ret = SRSLTE_ERROR; if (cqi_len <= 11) { ret = encode_cqi_short(q, cqi_data, cqi_len, q_bits, Q_prime * Qm); } else { ret = encode_cqi_long(q, cqi_data, cqi_len, q_bits, Q_prime * Qm); } if (ret) { return ret; } else { return (int)Q_prime; } }
/* Encode UCI CQI/PMI */ int srslte_uci_decode_cqi_pusch(srslte_uci_cqi_pusch_t *q, srslte_pusch_cfg_t *cfg, int16_t *q_bits, float beta, uint32_t Q_prime_ri, uint32_t cqi_len, uint8_t *cqi_data, bool *cqi_ack) { if (beta < 0) { fprintf(stderr, "Error beta is reserved\n"); return -1; } uint32_t Q_prime = Q_prime_cqi(cfg, cqi_len, beta, Q_prime_ri); int ret = SRSLTE_ERROR; if (cqi_len <= 11) { ret = decode_cqi_short(q, q_bits, Q_prime*cfg->grant.Qm, cqi_data, cqi_len); } else { ret = decode_cqi_long(q, q_bits, Q_prime*cfg->grant.Qm, cqi_data, cqi_len); if (ret == 1) { if (cqi_ack) { *cqi_ack = true; } ret = 0; } else if (ret == 0) { if (cqi_ack) { *cqi_ack = false; } } } if (ret) { return ret; } else { return (int) Q_prime; } return Q_prime; }