diff --git a/srslte/include/srslte/phch/prach.h b/srslte/include/srslte/phch/prach.h index 346447e8b..69c79aea2 100644 --- a/srslte/include/srslte/phch/prach.h +++ b/srslte/include/srslte/phch/prach.h @@ -65,6 +65,7 @@ typedef struct SRSLTE_API { uint32_t N_cs; // Cyclic shift size uint32_t N_seq; // Preamble length float T_seq; // Preamble length in seconds + float T_tot; // Total sequence length in seconds uint32_t N_cp; // Cyclic prefix length // Generated tables diff --git a/srslte/include/srslte/utils/vector.h b/srslte/include/srslte/utils/vector.h index 7d6c04cba..74cd60172 100644 --- a/srslte/include/srslte/utils/vector.h +++ b/srslte/include/srslte/utils/vector.h @@ -163,7 +163,7 @@ SRSLTE_API void srslte_vec_max_fff(float *x, float *y, float *z, uint32_t len); /* quantify vector of floats or int16 and convert to uint8_t */ SRSLTE_API void srslte_vec_quant_fuc(float *in, uint8_t *out, float gain, float offset, float clip, uint32_t len); -SRSLTE_API void srslte_vec_quant_suc(int16_t *in, uint8_t *out, int16_t norm, int16_t offset, int16_t clip, uint32_t len); +SRSLTE_API void srslte_vec_quant_suc(int16_t *in, uint8_t *out, float gain, int16_t offset, int16_t clip, uint32_t len); /* magnitude of each vector element */ SRSLTE_API void srslte_vec_abs_cf(cf_t *x, float *abs, uint32_t len); diff --git a/srslte/lib/common/phy_common.c b/srslte/lib/common/phy_common.c index 35bd04d34..e4a7d8d20 100644 --- a/srslte/lib/common/phy_common.c +++ b/srslte/lib/common/phy_common.c @@ -407,7 +407,7 @@ struct lte_band lte_bands[SRSLTE_NOF_LTE_BANDS] = { {30, 2350, 9770, 27660, 45, SRSLTE_BAND_GEO_AREA_NAR}, {31, 462.5, 9870, 27760, 10, SRSLTE_BAND_GEO_AREA_CALA}, {32, 1452, 9920, 0, 0, SRSLTE_BAND_GEO_AREA_EMEA}, - {64, 0, 10359, 10359, 0, SRSLTE_BAND_GEO_AREA_ALL}, + {64, 0, 10359, 27809, 0, SRSLTE_BAND_GEO_AREA_ALL}, {65, 2110, 65536, 131072, 90, SRSLTE_BAND_GEO_AREA_ALL}, {66, 2110, 66436, 131972, 90, SRSLTE_BAND_GEO_AREA_NAR}, {67, 738, 67336, 0, 0, SRSLTE_BAND_GEO_AREA_EMEA}, @@ -441,7 +441,7 @@ float get_fd(struct lte_band *band, uint32_t dl_earfcn) { float get_fu(struct lte_band *band, uint32_t ul_earfcn) { if (ul_earfcn >= band->ul_earfcn_offset) { - return band->fd_low_mhz + band->duplex_mhz + 0.1*(ul_earfcn - band->ul_earfcn_offset); + return band->fd_low_mhz - band->duplex_mhz + 0.1*(ul_earfcn - band->ul_earfcn_offset); } else { return 0.0; } @@ -478,7 +478,7 @@ float srslte_band_fu(uint32_t ul_earfcn) { fprintf(stderr, "Invalid UL_EARFCN=%d\n", ul_earfcn); } i--; - while(i > 0 && lte_bands[i].dl_earfcn_offset>ul_earfcn) { + while(i > 0 && (lte_bands[i].ul_earfcn_offset>ul_earfcn || lte_bands[i].ul_earfcn_offset == 0)) { i--; } return get_fu(<e_bands[i], ul_earfcn); @@ -493,7 +493,7 @@ uint32_t srslte_band_ul_earfcn(uint32_t dl_earfcn) { while(i > 0 && lte_bands[i].dl_earfcn_offset>dl_earfcn) { i--; } - return lte_bands[i].ul_earfcn_offset + (lte_bands[i].dl_earfcn_offset-dl_earfcn); + return lte_bands[i].ul_earfcn_offset + (dl_earfcn-lte_bands[i].dl_earfcn_offset); } int srslte_band_get_fd_band_all(uint32_t band, srslte_earfcn_t *earfcn, uint32_t max_elems) { diff --git a/srslte/lib/fec/viterbi.c b/srslte/lib/fec/viterbi.c index 0e15de2a9..0eb2e6d0a 100644 --- a/srslte/lib/fec/viterbi.c +++ b/srslte/lib/fec/viterbi.c @@ -287,11 +287,10 @@ int srslte_viterbi_decode_s(srslte_viterbi_t *q, int16_t *symbols, uint8_t *data int16_t max = -INT16_MAX; for (int i=0;i max) { - max = symbols[i]; + max = abs(symbols[i]); } } - - srslte_vec_quant_suc(symbols, q->symbols_uc, q->gain_quant/max, 127, 255, len); + srslte_vec_quant_suc(symbols, q->symbols_uc, (float) q->gain_quant/max, 127, 255, len); return srslte_viterbi_decode_uc(q, q->symbols_uc, data, frame_length); } diff --git a/srslte/lib/phch/prach.c b/srslte/lib/phch/prach.c index a29475380..61a851705 100644 --- a/srslte/lib/phch/prach.c +++ b/srslte/lib/phch/prach.c @@ -461,6 +461,7 @@ int srslte_prach_init(srslte_prach_t *p, p->N_seq = prach_Tseq[p->f]*p->N_ifft_ul/2048; p->N_cp = prach_Tcp[p->f]*p->N_ifft_ul/2048; p->T_seq = prach_Tseq[p->f]*SRSLTE_LTE_TS; + p->T_tot = (prach_Tseq[p->f]+prach_Tcp[p->f])*SRSLTE_LTE_TS; ret = SRSLTE_SUCCESS; } else { diff --git a/srslte/lib/phch/ra.c b/srslte/lib/phch/ra.c index f2164ec1b..678b61cc9 100644 --- a/srslte/lib/phch/ra.c +++ b/srslte/lib/phch/ra.c @@ -167,8 +167,8 @@ int srslte_ra_ul_dci_to_grant_prb_allocation(srslte_ra_ul_dci_t *dci, srslte_ra_ grant->freq_hopping = 1; } - if (grant->n_prb[0] + grant->L_prb < nof_prb && - grant->n_prb[1] + grant->L_prb < nof_prb) + if (grant->n_prb[0] + grant->L_prb <= nof_prb && + grant->n_prb[1] + grant->L_prb <= nof_prb) { return SRSLTE_SUCCESS; } else { @@ -252,6 +252,7 @@ int srslte_ra_ul_dci_to_grant(srslte_ra_ul_dci_t *dci, uint32_t nof_prb, uint32_ return SRSLTE_ERROR; } } else { + printf("Error computing UL PRB allocation\n"); return SRSLTE_ERROR; } return SRSLTE_SUCCESS; diff --git a/srslte/lib/ue/ue_dl.c b/srslte/lib/ue/ue_dl.c index bd98802c0..f75c69fa2 100644 --- a/srslte/lib/ue/ue_dl.c +++ b/srslte/lib/ue/ue_dl.c @@ -394,9 +394,11 @@ static int dci_blind_search(srslte_ue_dl_t *q, dci_blind_search_t *search_space, // If searching for Format1A but found Format0 save it for later if (dci_msg->format == SRSLTE_DCI_FORMAT0 && search_space->format == SRSLTE_DCI_FORMAT1A) { - q->pending_ul_dci_rnti = crc_rem; - memcpy(&q->pending_ul_dci_msg, dci_msg, sizeof(srslte_dci_msg_t)); - memcpy(&q->last_location_ul, &search_space->loc[i], sizeof(srslte_dci_location_t)); + if (!q->pending_ul_dci_rnti) { + q->pending_ul_dci_rnti = crc_rem; + memcpy(&q->pending_ul_dci_msg, dci_msg, sizeof(srslte_dci_msg_t)); + memcpy(&q->last_location_ul, &search_space->loc[i], sizeof(srslte_dci_location_t)); + } // Else if we found it, save location and leave } else if (dci_msg->format == search_space->format) { ret = 1; diff --git a/srslte/lib/utils/vector.c b/srslte/lib/utils/vector.c index b609eef17..334600200 100644 --- a/srslte/lib/utils/vector.c +++ b/srslte/lib/utils/vector.c @@ -714,12 +714,12 @@ void srslte_vec_quant_fuc(float *in, uint8_t *out, float gain, float offset, flo } } -void srslte_vec_quant_suc(int16_t *in, uint8_t *out, int16_t norm, int16_t offset, int16_t clip, uint32_t len) { +void srslte_vec_quant_suc(int16_t *in, uint8_t *out, float gain, int16_t offset, int16_t clip, uint32_t len) { int i; int16_t tmp; for (i=0;i clip)