static void put_mib(srslte_enb_dl_t* q) { uint8_t bch_payload[SRSLTE_BCH_PAYLOAD_LEN]; uint32_t sf_idx = q->dl_sf.tti % 10; uint32_t sfn = q->dl_sf.tti / 10; if (sf_idx == 0) { srslte_pbch_mib_pack(&q->cell, sfn, bch_payload); srslte_pbch_encode(&q->pbch, bch_payload, q->sf_symbols, sfn % 4); } }
int main(int argc, char **argv) { srslte_pbch_t pbch; uint8_t bch_payload_tx[SRSLTE_BCH_PAYLOAD_LEN], bch_payload_rx[SRSLTE_BCH_PAYLOAD_LEN]; int i, j; cf_t *ce[SRSLTE_MAX_PORTS]; int nof_re; cf_t *slot1_symbols[SRSLTE_MAX_PORTS]; uint32_t nof_rx_ports; parse_args(argc,argv); nof_re = SRSLTE_SLOT_LEN_RE(cell.nof_prb, SRSLTE_CP_NORM); /* init memory */ for (i=0;i<cell.nof_ports;i++) { ce[i] = malloc(sizeof(cf_t) * nof_re); if (!ce[i]) { perror("malloc"); exit(-1); } for (j=0;j<nof_re;j++) { ce[i][j] = 1; } slot1_symbols[i] = malloc(sizeof(cf_t) * nof_re); if (!slot1_symbols[i]) { perror("malloc"); exit(-1); } } if (srslte_pbch_init(&pbch, cell)) { fprintf(stderr, "Error creating PBCH object\n"); exit(-1); } srand(time(NULL)); for (i=0;i<SRSLTE_BCH_PAYLOAD_LEN;i++) { bch_payload_tx[i] = rand()%2; } srslte_pbch_encode(&pbch, bch_payload_tx, slot1_symbols, 0); /* combine outputs */ for (i=1;i<cell.nof_ports;i++) { for (j=0;j<nof_re;j++) { slot1_symbols[0][j] += slot1_symbols[i][j]; } } srslte_pbch_decode_reset(&pbch); if (1 != srslte_pbch_decode(&pbch, slot1_symbols[0], ce, 0, bch_payload_rx, &nof_rx_ports, NULL)) { printf("Error decoding\n"); exit(-1); } srslte_pbch_free(&pbch); for (i=0;i<cell.nof_ports;i++) { free(ce[i]); free(slot1_symbols[i]); } printf("Tx ports: %d - Rx ports: %d\n", cell.nof_ports, nof_rx_ports); printf("Tx payload: "); srslte_vec_fprint_hex(stdout, bch_payload_tx, SRSLTE_BCH_PAYLOAD_LEN); printf("Rx payload: "); srslte_vec_fprint_hex(stdout, bch_payload_rx, SRSLTE_BCH_PAYLOAD_LEN); if (nof_rx_ports == cell.nof_ports && !memcmp(bch_payload_rx, bch_payload_tx, sizeof(uint8_t) * SRSLTE_BCH_PAYLOAD_LEN)) { printf("OK\n"); exit(0); } else { printf("Error\n"); exit(-1); } }