Fixed bug in pbch_encode

This commit is contained in:
Ismael Gomez 2016-07-11 23:32:25 +02:00
parent 8ee9b32c7a
commit c54481e0e1
6 changed files with 18 additions and 13 deletions

View File

@ -576,7 +576,7 @@ int main(int argc, char **argv) {
srslte_pbch_mib_pack(&cell, sfn, bch_payload);
if (sf_idx == 0) {
srslte_pbch_encode(&pbch, bch_payload, slot1_symbols);
srslte_pbch_encode(&pbch, bch_payload, slot1_symbols, nf%4);
}
srslte_pcfich_encode(&pcfich, cfi, sf_symbols, sf_idx);

View File

@ -98,7 +98,8 @@ SRSLTE_API int srslte_pbch_decode(srslte_pbch_t *q,
SRSLTE_API int srslte_pbch_encode(srslte_pbch_t *q,
uint8_t bch_payload[SRSLTE_BCH_PAYLOAD_LEN],
cf_t *slot1_symbols[SRSLTE_MAX_PORTS]);
cf_t *slot1_symbols[SRSLTE_MAX_PORTS],
uint32_t frame_idx);
SRSLTE_API void srslte_pbch_decode_reset(srslte_pbch_t *q);

View File

@ -35,6 +35,7 @@
#include "srslte/config.h"
#include "srslte/dft/dft_precoding.h"
#include "srslte/ch_estimation/chest_ul.h"
#include "srslte/utils/vector.h"
#include "srslte/utils/convolution.h"
@ -209,6 +210,11 @@ int srslte_chest_ul_estimate(srslte_chest_ul_t *q, cf_t *input, cf_t *ce,
return SRSLTE_ERROR;
}
if (!srslte_dft_precoding_valid_prb(nof_prb)) {
fprintf(stderr, "Error invalid nof_prb=%d\n", nof_prb);
return SRSLTE_ERROR_INVALID_INPUTS;
}
int nrefs_sym = nof_prb*SRSLTE_NRE;
int nrefs_sf = nrefs_sym*2;

View File

@ -177,7 +177,7 @@ void srslte_enb_dl_put_mib(srslte_enb_dl_t *q, uint32_t tti)
{
if ((tti%10) == 0) {
srslte_pbch_mib_pack(&q->cell, tti/10, q->bch_payload);
srslte_pbch_encode(&q->pbch, q->bch_payload, q->slot1_symbols);
srslte_pbch_encode(&q->pbch, q->bch_payload, q->slot1_symbols, ((tti/10)%4));
}
}

View File

@ -514,7 +514,7 @@ int srslte_pbch_decode(srslte_pbch_t *q, cf_t *slot1_symbols, cf_t *ce_slot1[SRS
/** Converts the MIB message to symbols mapped to SLOT #1 ready for transmission
*/
int srslte_pbch_encode(srslte_pbch_t *q, uint8_t bch_payload[SRSLTE_BCH_PAYLOAD_LEN], cf_t *slot1_symbols[SRSLTE_MAX_PORTS]) {
int srslte_pbch_encode(srslte_pbch_t *q, uint8_t bch_payload[SRSLTE_BCH_PAYLOAD_LEN], cf_t *slot1_symbols[SRSLTE_MAX_PORTS], uint32_t frame_idx) {
int i;
int nof_bits;
cf_t *x[SRSLTE_MAX_LAYERS];
@ -536,7 +536,9 @@ int srslte_pbch_encode(srslte_pbch_t *q, uint8_t bch_payload[SRSLTE_BCH_PAYLOAD_
}
memset(&x[q->cell.nof_ports], 0, sizeof(cf_t*) * (SRSLTE_MAX_LAYERS - q->cell.nof_ports));
if (q->frame_idx == 0) {
frame_idx=frame_idx%4;
if (frame_idx == 0) {
memcpy(q->data, bch_payload, sizeof(uint8_t) * SRSLTE_BCH_PAYLOAD_LEN);
/* encode & modulate */
@ -548,9 +550,9 @@ int srslte_pbch_encode(srslte_pbch_t *q, uint8_t bch_payload[SRSLTE_BCH_PAYLOAD_
srslte_rm_conv_tx(q->data_enc, SRSLTE_BCH_ENCODED_LEN, q->rm_b, 4 * nof_bits);
}
srslte_scrambling_b_offset(&q->seq, &q->rm_b[q->frame_idx * nof_bits],
q->frame_idx * nof_bits, nof_bits);
srslte_mod_modulate(&q->mod, &q->rm_b[q->frame_idx * nof_bits], q->d,
srslte_scrambling_b_offset(&q->seq, &q->rm_b[frame_idx * nof_bits],
frame_idx * nof_bits, nof_bits);
srslte_mod_modulate(&q->mod, &q->rm_b[frame_idx * nof_bits], q->d,
nof_bits);
/* layer mapping & precoding */
@ -566,10 +568,6 @@ int srslte_pbch_encode(srslte_pbch_t *q, uint8_t bch_payload[SRSLTE_BCH_PAYLOAD_
for (i = 0; i < q->cell.nof_ports; i++) {
srslte_pbch_put(q->symbols[i], slot1_symbols[i], q->cell);
}
q->frame_idx++;
if (q->frame_idx == 4) {
q->frame_idx = 0;
}
return SRSLTE_SUCCESS;
} else {
return SRSLTE_ERROR_INVALID_INPUTS;

View File

@ -114,7 +114,7 @@ int main(int argc, char **argv) {
bch_payload_tx[i] = rand()%2;
}
srslte_pbch_encode(&pbch, bch_payload_tx, slot1_symbols);
srslte_pbch_encode(&pbch, bch_payload_tx, slot1_symbols, 0);
/* combine outputs */
for (i=1;i<cell.nof_ports;i++) {