mirror of https://github.com/PentHertz/srsLTE.git
Fixed RV for SIB in pdsch_ue example
This commit is contained in:
parent
e36bd6a20f
commit
ceddb15deb
|
@ -307,8 +307,7 @@ int main(int argc, char **argv) {
|
||||||
case DECODE_SIB:
|
case DECODE_SIB:
|
||||||
/* We are looking for SI Blocks, search only in appropiate places */
|
/* We are looking for SI Blocks, search only in appropiate places */
|
||||||
if ((srslte_ue_sync_get_sfidx(&ue_sync) == 5 && (sfn%2)==0)) {
|
if ((srslte_ue_sync_get_sfidx(&ue_sync) == 5 && (sfn%2)==0)) {
|
||||||
n = srslte_ue_dl_decode_rnti_rv(&ue_dl, sf_buffer, data, srslte_ue_sync_get_sfidx(&ue_sync), SRSLTE_SIRNTI,
|
n = srslte_ue_dl_decode(&ue_dl, sf_buffer, data, sfn*10+srslte_ue_sync_get_sfidx(&ue_sync));
|
||||||
((int) ceilf((float)3*(((sfn)/2)%4)/2))%4);
|
|
||||||
if (n < 0) {
|
if (n < 0) {
|
||||||
fprintf(stderr, "Error decoding UE DL\n");fflush(stdout);
|
fprintf(stderr, "Error decoding UE DL\n");fflush(stdout);
|
||||||
return -1;
|
return -1;
|
||||||
|
|
|
@ -494,7 +494,7 @@ int main(int argc, char **argv) {
|
||||||
decode_pdsch = true;
|
decode_pdsch = true;
|
||||||
} else {
|
} else {
|
||||||
/* We are looking for SIB1 Blocks, search only in appropiate places */
|
/* We are looking for SIB1 Blocks, search only in appropiate places */
|
||||||
if ((srslte_ue_sync_get_sfidx(&ue_sync) == 5 && (sfn%8)==0)) {
|
if ((srslte_ue_sync_get_sfidx(&ue_sync) == 5 && (sfn%2)==0)) {
|
||||||
decode_pdsch = true;
|
decode_pdsch = true;
|
||||||
} else {
|
} else {
|
||||||
decode_pdsch = false;
|
decode_pdsch = false;
|
||||||
|
@ -502,28 +502,21 @@ int main(int argc, char **argv) {
|
||||||
}
|
}
|
||||||
if (decode_pdsch) {
|
if (decode_pdsch) {
|
||||||
INFO("Attempting DL decode SFN=%d\n", sfn);
|
INFO("Attempting DL decode SFN=%d\n", sfn);
|
||||||
if (prog_args.rnti != SRSLTE_SIRNTI) {
|
n = srslte_ue_dl_decode(&ue_dl,
|
||||||
n = srslte_ue_dl_decode(&ue_dl, &sf_buffer[prog_args.time_offset], data, srslte_ue_sync_get_sfidx(&ue_sync));
|
&sf_buffer[prog_args.time_offset],
|
||||||
} else {
|
data,
|
||||||
// RV for SIB1 is predefined
|
sfn*10+srslte_ue_sync_get_sfidx(&ue_sync));
|
||||||
uint32_t k = (sfn/2)%4;
|
|
||||||
uint32_t rv = ((uint32_t) ceilf((float)1.5*k))%4;
|
|
||||||
n = srslte_ue_dl_decode_rnti_rv(&ue_dl, &sf_buffer[prog_args.time_offset], data,
|
|
||||||
srslte_ue_sync_get_sfidx(&ue_sync),
|
|
||||||
SRSLTE_SIRNTI, rv);
|
|
||||||
|
|
||||||
/*
|
|
||||||
if (n>0) {
|
|
||||||
printf("Saving signal...\n");
|
|
||||||
srslte_ue_dl_save_signal(&ue_dl, &ue_dl.softbuffer, sfn*10+srslte_ue_sync_get_sfidx(&ue_sync), rv, prog_args.rnti);
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
if (n < 0) {
|
if (n < 0) {
|
||||||
// fprintf(stderr, "Error decoding UE DL\n");fflush(stdout);
|
// fprintf(stderr, "Error decoding UE DL\n");fflush(stdout);
|
||||||
} else if (n > 0) {
|
} else if (n > 0) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
printf("Saving signal...\n");
|
||||||
|
srslte_ue_dl_save_signal(&ue_dl, &ue_dl.softbuffer, sfn*10+srslte_ue_sync_get_sfidx(&ue_sync), rv, prog_args.rnti);
|
||||||
|
exit(-1);
|
||||||
|
*/
|
||||||
|
|
||||||
/* Send data if socket active */
|
/* Send data if socket active */
|
||||||
if (prog_args.net_port > 0) {
|
if (prog_args.net_port > 0) {
|
||||||
srslte_netsink_write(&net_sink, data, 1+(n-1)/8);
|
srslte_netsink_write(&net_sink, data, 1+(n-1)/8);
|
||||||
|
|
|
@ -141,21 +141,14 @@ SRSLTE_API void srslte_ue_dl_set_sample_offset(srslte_ue_dl_t * q,
|
||||||
SRSLTE_API int srslte_ue_dl_decode(srslte_ue_dl_t * q,
|
SRSLTE_API int srslte_ue_dl_decode(srslte_ue_dl_t * q,
|
||||||
cf_t *input,
|
cf_t *input,
|
||||||
uint8_t *data,
|
uint8_t *data,
|
||||||
uint32_t sf_idx);
|
uint32_t tti);
|
||||||
|
|
||||||
SRSLTE_API int srslte_ue_dl_decode_rnti(srslte_ue_dl_t * q,
|
SRSLTE_API int srslte_ue_dl_decode_rnti(srslte_ue_dl_t * q,
|
||||||
cf_t *input,
|
cf_t *input,
|
||||||
uint8_t *data,
|
uint8_t *data,
|
||||||
uint32_t sf_idx,
|
uint32_t tti,
|
||||||
uint16_t rnti);
|
uint16_t rnti);
|
||||||
|
|
||||||
SRSLTE_API int srslte_ue_dl_decode_rnti_rv(srslte_ue_dl_t * q,
|
|
||||||
cf_t *input,
|
|
||||||
uint8_t * data,
|
|
||||||
uint32_t sf_idx,
|
|
||||||
uint16_t rnti,
|
|
||||||
uint32_t rvidx);
|
|
||||||
|
|
||||||
SRSLTE_API bool srslte_ue_dl_decode_phich(srslte_ue_dl_t *q,
|
SRSLTE_API bool srslte_ue_dl_decode_phich(srslte_ue_dl_t *q,
|
||||||
uint32_t sf_idx,
|
uint32_t sf_idx,
|
||||||
uint32_t n_prb_lowest,
|
uint32_t n_prb_lowest,
|
||||||
|
|
|
@ -178,12 +178,8 @@ void srslte_ue_dl_set_sample_offset(srslte_ue_dl_t * q, float sample_offset) {
|
||||||
* - PDCCH decoding: Find DCI for RNTI given by previous call to srslte_ue_dl_set_rnti()
|
* - PDCCH decoding: Find DCI for RNTI given by previous call to srslte_ue_dl_set_rnti()
|
||||||
* - PDSCH decoding: Decode TB scrambling with RNTI given by srslte_ue_dl_set_rnti()
|
* - PDSCH decoding: Decode TB scrambling with RNTI given by srslte_ue_dl_set_rnti()
|
||||||
*/
|
*/
|
||||||
int srslte_ue_dl_decode(srslte_ue_dl_t *q, cf_t *input, uint8_t *data, uint32_t sf_idx) {
|
int srslte_ue_dl_decode(srslte_ue_dl_t *q, cf_t *input, uint8_t *data, uint32_t tti) {
|
||||||
return srslte_ue_dl_decode_rnti_rv(q, input, data, sf_idx, q->current_rnti, 0);
|
return srslte_ue_dl_decode_rnti(q, input, data, tti, q->current_rnti);
|
||||||
}
|
|
||||||
|
|
||||||
int srslte_ue_dl_decode_rnti(srslte_ue_dl_t *q, cf_t *input, uint8_t *data, uint32_t sf_idx, uint16_t rnti) {
|
|
||||||
return srslte_ue_dl_decode_rnti_rv(q, input, data, sf_idx, rnti, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int srslte_ue_dl_decode_fft_estimate(srslte_ue_dl_t *q, cf_t *input, uint32_t sf_idx, uint32_t *cfi) {
|
int srslte_ue_dl_decode_fft_estimate(srslte_ue_dl_t *q, cf_t *input, uint32_t sf_idx, uint32_t *cfi) {
|
||||||
|
@ -241,47 +237,86 @@ int srslte_ue_dl_cfg_grant(srslte_ue_dl_t *q, srslte_ra_dl_grant_t *grant, uint3
|
||||||
return srslte_pdsch_cfg(&q->pdsch_cfg, q->cell, grant, cfi, sf_idx, rvidx);
|
return srslte_pdsch_cfg(&q->pdsch_cfg, q->cell, grant, cfi, sf_idx, rvidx);
|
||||||
}
|
}
|
||||||
|
|
||||||
int srslte_ue_dl_decode_rnti_rv_packet(srslte_ue_dl_t *q, srslte_ra_dl_grant_t *grant, uint8_t *data,
|
int srslte_ue_dl_decode_rnti(srslte_ue_dl_t *q, cf_t *input, uint8_t *data, uint32_t tti, uint16_t rnti)
|
||||||
uint32_t cfi, uint32_t sf_idx, uint16_t rnti, uint32_t rvidx)
|
|
||||||
{
|
{
|
||||||
|
srslte_dci_msg_t dci_msg;
|
||||||
|
srslte_ra_dl_dci_t dci_unpacked;
|
||||||
|
srslte_ra_dl_grant_t grant;
|
||||||
int ret = SRSLTE_ERROR;
|
int ret = SRSLTE_ERROR;
|
||||||
|
uint32_t cfi;
|
||||||
|
|
||||||
|
uint32_t sf_idx = tti%10;
|
||||||
|
|
||||||
|
if ((ret = srslte_ue_dl_decode_fft_estimate(q, input, sf_idx, &cfi)) < 0) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (srslte_pdcch_extract_llr(&q->pdcch, q->sf_symbols, q->ce, srslte_chest_dl_get_noise_estimate(&q->chest), sf_idx, cfi)) {
|
||||||
|
fprintf(stderr, "Error extracting LLRs\n");
|
||||||
|
return SRSLTE_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
q->nof_detected++;
|
int found_dci = srslte_ue_dl_find_dl_dci(q, cfi, sf_idx, rnti, &dci_msg);
|
||||||
|
if (found_dci == 1) {
|
||||||
/* Setup PDSCH configuration for this CFI, SFIDX and RVIDX */
|
|
||||||
if (srslte_ue_dl_cfg_grant(q, grant, cfi, sf_idx, rvidx)) {
|
|
||||||
return SRSLTE_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (q->pdsch_cfg.rv == 0) {
|
|
||||||
srslte_softbuffer_rx_reset_tbs(&q->softbuffer, grant->mcs.tbs);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Uncoment next line to do ZF by default in pdsch_ue example
|
|
||||||
//float noise_estimate = 0;
|
|
||||||
float noise_estimate = srslte_chest_dl_get_noise_estimate(&q->chest);
|
|
||||||
|
|
||||||
if (q->pdsch_cfg.grant.mcs.mod > 0 && q->pdsch_cfg.grant.mcs.tbs >= 0) {
|
|
||||||
ret = srslte_pdsch_decode_rnti(&q->pdsch, &q->pdsch_cfg, &q->softbuffer,
|
|
||||||
q->sf_symbols, q->ce,
|
|
||||||
noise_estimate,
|
|
||||||
rnti, data);
|
|
||||||
|
|
||||||
if (ret == SRSLTE_ERROR) {
|
if (srslte_dci_msg_to_dl_grant(&dci_msg, rnti, q->cell.nof_prb, q->cell.nof_ports, &dci_unpacked, &grant)) {
|
||||||
q->pkt_errors++;
|
fprintf(stderr, "Error unpacking DCI\n");
|
||||||
} else if (ret == SRSLTE_ERROR_INVALID_INPUTS) {
|
return SRSLTE_ERROR;
|
||||||
fprintf(stderr, "Error calling srslte_pdsch_decode()\n");
|
}
|
||||||
} else if (ret == SRSLTE_SUCCESS) {
|
|
||||||
if (SRSLTE_VERBOSE_ISDEBUG()) {
|
/* ===== These lines of code are supposed to be MAC functionality === */
|
||||||
INFO("Decoded Message: ", 0);
|
|
||||||
srslte_vec_fprint_hex(stdout, data, q->pdsch_cfg.grant.mcs.tbs);
|
|
||||||
|
uint32_t rvidx = 0;
|
||||||
|
if (dci_unpacked.rv_idx < 0) {
|
||||||
|
uint32_t sfn = tti/10;
|
||||||
|
uint32_t k = (sfn/2)%4;
|
||||||
|
rvidx = ((uint32_t) ceilf((float)1.5*k))%4;
|
||||||
|
srslte_softbuffer_rx_reset_tbs(&q->softbuffer, grant.mcs.tbs);
|
||||||
|
} else {
|
||||||
|
rvidx = dci_unpacked.rv_idx;
|
||||||
|
srslte_softbuffer_rx_reset_tbs(&q->softbuffer, grant.mcs.tbs);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (srslte_ue_dl_cfg_grant(q, &grant, cfi, sf_idx, rvidx)) {
|
||||||
|
return SRSLTE_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ===== End of MAC functionality ========== */
|
||||||
|
|
||||||
|
q->nof_detected++;
|
||||||
|
|
||||||
|
// Uncoment next line to do ZF by default in pdsch_ue example
|
||||||
|
//float noise_estimate = 0;
|
||||||
|
float noise_estimate = srslte_chest_dl_get_noise_estimate(&q->chest);
|
||||||
|
|
||||||
|
if (q->pdsch_cfg.grant.mcs.mod > 0 && q->pdsch_cfg.grant.mcs.tbs >= 0) {
|
||||||
|
ret = srslte_pdsch_decode_rnti(&q->pdsch, &q->pdsch_cfg, &q->softbuffer,
|
||||||
|
q->sf_symbols, q->ce,
|
||||||
|
noise_estimate,
|
||||||
|
rnti, data);
|
||||||
|
|
||||||
|
if (ret == SRSLTE_ERROR) {
|
||||||
|
q->pkt_errors++;
|
||||||
|
} else if (ret == SRSLTE_ERROR_INVALID_INPUTS) {
|
||||||
|
fprintf(stderr, "Error calling srslte_pdsch_decode()\n");
|
||||||
|
} else if (ret == SRSLTE_SUCCESS) {
|
||||||
|
if (SRSLTE_VERBOSE_ISDEBUG()) {
|
||||||
|
INFO("Decoded Message: ", 0);
|
||||||
|
srslte_vec_fprint_hex(stdout, data, q->pdsch_cfg.grant.mcs.tbs);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
q->pkts_total++;
|
|
||||||
}
|
}
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
q->pkts_total++;
|
||||||
|
|
||||||
|
if (found_dci == 1 && ret == SRSLTE_SUCCESS) {
|
||||||
|
return q->pdsch_cfg.grant.mcs.tbs;
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t srslte_ue_dl_get_ncce(srslte_ue_dl_t *q) {
|
uint32_t srslte_ue_dl_get_ncce(srslte_ue_dl_t *q) {
|
||||||
return q->last_location.ncce;
|
return q->last_location.ncce;
|
||||||
|
@ -423,44 +458,6 @@ int srslte_ue_dl_find_dl_dci_type(srslte_ue_dl_t *q, uint32_t cfi, uint32_t sf_i
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int srslte_ue_dl_decode_rnti_rv(srslte_ue_dl_t *q, cf_t *input, uint8_t *data, uint32_t sf_idx, uint16_t rnti, uint32_t rvidx)
|
|
||||||
{
|
|
||||||
srslte_dci_msg_t dci_msg;
|
|
||||||
srslte_ra_dl_dci_t dci_unpacked;
|
|
||||||
srslte_ra_dl_grant_t grant;
|
|
||||||
int ret = SRSLTE_ERROR;
|
|
||||||
uint32_t cfi;
|
|
||||||
|
|
||||||
|
|
||||||
if ((ret = srslte_ue_dl_decode_fft_estimate(q, input, sf_idx, &cfi)) < 0) {
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (srslte_pdcch_extract_llr(&q->pdcch, q->sf_symbols, q->ce, srslte_chest_dl_get_noise_estimate(&q->chest), sf_idx, cfi)) {
|
|
||||||
fprintf(stderr, "Error extracting LLRs\n");
|
|
||||||
return SRSLTE_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
int found_dci = srslte_ue_dl_find_dl_dci(q, cfi, sf_idx, rnti, &dci_msg);
|
|
||||||
if (found_dci == 1) {
|
|
||||||
|
|
||||||
if (srslte_dci_msg_to_dl_grant(&dci_msg, rnti, q->cell.nof_prb, q->cell.nof_ports, &dci_unpacked, &grant)) {
|
|
||||||
fprintf(stderr, "Error unpacking DCI\n");
|
|
||||||
return SRSLTE_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = srslte_ue_dl_decode_rnti_rv_packet(q, &grant, data, cfi, sf_idx, rnti, rvidx);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (found_dci == 1 && ret == SRSLTE_SUCCESS) {
|
|
||||||
return q->pdsch_cfg.grant.mcs.tbs;
|
|
||||||
} else {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool srslte_ue_dl_decode_phich(srslte_ue_dl_t *q, uint32_t sf_idx, uint32_t n_prb_lowest, uint32_t n_dmrs)
|
bool srslte_ue_dl_decode_phich(srslte_ue_dl_t *q, uint32_t sf_idx, uint32_t n_prb_lowest, uint32_t n_dmrs)
|
||||||
{
|
{
|
||||||
uint8_t ack_bit;
|
uint8_t ack_bit;
|
||||||
|
|
Loading…
Reference in New Issue