int main(int argc, char **argv) { pbch_mib_t mib; int n; if (argc < 3) { usage(argv[0]); exit(-1); } parse_args(argc,argv); if (base_init()) { fprintf(stderr, "Error initializing receiver\n"); exit(-1); } n = filesource_read(&fsrc, input_buffer, FLEN); lte_fft_run_sf(&fft, input_buffer, fft_buffer); if (fmatlab) { fprintf(fmatlab, "outfft="); vec_sc_prod_cfc(fft_buffer, 1000.0, fft_buffer, CP_NSYMB(cell.cp) * cell.nof_prb * RE_X_RB); vec_fprint_c(fmatlab, fft_buffer, CP_NSYMB(cell.cp) * cell.nof_prb * RE_X_RB); fprintf(fmatlab, ";\n"); vec_sc_prod_cfc(fft_buffer, 0.001, fft_buffer, CP_NSYMB(cell.cp) * cell.nof_prb * RE_X_RB); } /* Get channel estimates for each port */ chest_ce_sf(&chest, fft_buffer, ce, 0); INFO("Decoding PBCH\n", 0); n = pbch_decode(&pbch, fft_buffer, ce, &mib); base_free(); if (n < 0) { fprintf(stderr, "Error decoding PBCH\n"); exit(-1); } else if (n == 0) { printf("Could not decode PBCH\n"); exit(-1); } else { if (mib.nof_ports == 2 && mib.nof_prb == 50 && mib.phich_length == PHICH_NORM && mib.phich_resources == R_1 && mib.sfn == 28) { pbch_mib_fprint(stdout, &mib, cell.id); printf("This is the signal.1.92M.dat file\n"); exit(0); } else { pbch_mib_fprint(stdout, &mib, cell.id); printf("This is an unknown file\n"); exit(-1); } } }
int decode_pbch(void *uhd, cf_t *buffer, ue_celldetect_result_t *found_cell, uint32_t nof_frames_total, pbch_mib_t *mib) { ue_mib_t uemib; int n; bzero(mib, sizeof(pbch_mib_t)); uint32_t nof_frames = 0; uint32_t flen = MIB_FRAME_SIZE; if (ue_mib_init(&uemib, found_cell->cell_id, found_cell->cp)) { fprintf(stderr, "Error initiating PBCH decoder\n"); return LIBLTE_ERROR; } INFO("Setting sampling frequency 1.92 MHz for PBCH decoding\n", 0); cuhd_set_rx_srate(uhd, 1920000.0); INFO("Starting receiver...\n", 0); cuhd_start_rx_stream(uhd); do { if (cuhd_recv(uhd, buffer, flen, 1)<0) { fprintf(stderr, "Error receiving from USRP\n"); return LIBLTE_ERROR; } INFO("Calling ue_mib_decode() %d/%d\n", nof_frames, nof_frames_total); n = ue_mib_decode(&uemib, buffer, flen, mib); if (n == LIBLTE_ERROR || n == LIBLTE_ERROR_INVALID_INPUTS) { fprintf(stderr, "Error calling ue_mib_decode()\n"); return LIBLTE_ERROR; } if (n == MIB_FRAME_UNALIGNED) { printf("Realigning frame\n"); if (cuhd_recv(uhd, buffer, flen/2, 1)<0) { fprintf(stderr, "Error receiving from USRP\n"); return LIBLTE_ERROR; } } nof_frames++; } while (n != MIB_FOUND && nof_frames < 2*nof_frames_total); if (n == MIB_FOUND) { printf("\n\nMIB decoded in %d ms (%d half frames)\n", nof_frames*5, nof_frames); pbch_mib_fprint(stdout, mib, found_cell->cell_id); } else { printf("\nCould not decode MIB\n"); } cuhd_stop_rx_stream(uhd); cuhd_flush_buffer(uhd); ue_mib_free(&uemib); return LIBLTE_SUCCESS; }
int main(int argc, char **argv) { pbch_t pbch; pbch_mib_t mib_tx, mib_rx; int i, j; cf_t *ce[MAX_PORTS]; int nof_re; cf_t *sf_symbols[MAX_PORTS]; parse_args(argc,argv); nof_re = 2 * CPNORM_NSYMB * cell.nof_prb * RE_X_RB; /* 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; } sf_symbols[i] = malloc(sizeof(cf_t) * nof_re); if (!sf_symbols[i]) { perror("malloc"); exit(-1); } } if (pbch_init(&pbch, cell)) { fprintf(stderr, "Error creating PBCH object\n"); exit(-1); } mib_tx.nof_ports = cell.nof_ports; mib_tx.nof_prb = 50; mib_tx.phich_length = PHICH_EXT; mib_tx.phich_resources = R_1_6; mib_tx.sfn = 124; pbch_encode(&pbch, &mib_tx, sf_symbols); /* combine outputs */ for (i=1;i<cell.nof_ports;i++) { for (j=0;j<nof_re;j++) { sf_symbols[0][j] += sf_symbols[i][j]; } } pbch_decode_reset(&pbch); if (1 != pbch_decode(&pbch, sf_symbols[0], ce, &mib_rx)) { printf("Error decoding\n"); exit(-1); } pbch_free(&pbch); for (i=0;i<cell.nof_ports;i++) { free(ce[i]); free(sf_symbols[i]); } if (!memcmp(&mib_tx, &mib_rx, sizeof(pbch_mib_t))) { printf("OK\n"); exit(0); } else { pbch_mib_fprint(stdout, &mib_rx); exit(-1); } }