int main(int argc, char **argv) { int n; void *uhd; ue_celldetect_t s; ue_celldetect_result_t found_cells[3]; cf_t *buffer; int nof_freqs; lte_earfcn_t channels[MAX_EARFCN]; uint32_t freq; pbch_mib_t mib; parse_args(argc, argv); printf("Opening UHD device...\n"); if (cuhd_open(uhd_args, &uhd)) { fprintf(stderr, "Error opening uhd\n"); exit(-1); } cuhd_set_rx_gain(uhd, uhd_gain); nof_freqs = lte_band_get_fd_band(band, channels, earfcn_start, earfcn_end, MAX_EARFCN); if (nof_freqs < 0) { fprintf(stderr, "Error getting EARFCN list\n"); exit(-1); } buffer = vec_malloc(sizeof(cf_t) * 96000); if (!buffer) { perror("malloc"); return LIBLTE_ERROR; } if (ue_celldetect_init(&s)) { fprintf(stderr, "Error initiating UE sync module\n"); exit(-1); } if (threshold > 0) { ue_celldetect_set_threshold(&s, threshold); } if (nof_frames_total > 0) { ue_celldetect_set_nof_frames_total(&s, nof_frames_total); } if (nof_frames_detected > 0) { ue_celldetect_set_nof_frames_detected(&s, nof_frames_detected); } for (freq=0;freq<nof_freqs;freq+=10) { /* set uhd_freq */ cuhd_set_rx_freq(uhd, (double) channels[freq].fd * MHZ); cuhd_rx_wait_lo_locked(uhd); usleep(10000); INFO("Set uhd_freq to %.3f MHz\n", (double) channels[freq].fd * MHZ/1000000); printf("[%3d/%d]: EARFCN %d Freq. %.2f MHz looking for PSS. \r", freq, nof_freqs, channels[freq].id, channels[freq].fd);fflush(stdout); if (VERBOSE_ISINFO()) { printf("\n"); } n = find_cell(uhd, &s, buffer, found_cells); if (n < 0) { fprintf(stderr, "Error searching cell\n"); exit(-1); } if (n == CS_CELL_DETECTED) { for (int i=0;i<3;i++) { if (found_cells[i].peak > threshold/2) { if (decode_pbch(uhd, buffer, &found_cells[i], nof_frames_total, &mib)) { fprintf(stderr, "Error decoding PBCH\n"); exit(-1); } } } } } ue_celldetect_free(&s); cuhd_close(uhd); exit(0); }
int main(int argc, char **argv) { int ret; cf_t *sf_buffer; iodev_t iodev; prog_args_t prog_args; lte_cell_t cell; ue_dl_t ue_dl; bool ue_dl_initiated = false; int64_t sf_cnt; uint32_t sf_idx; pbch_mib_t mib; bool printed_sib = false; uint32_t rlen; parse_args(&prog_args, argc, argv); if (iodev_init(&iodev, &prog_args.io_config)) { fprintf(stderr, "Error initiating input device\n"); exit(-1); } #ifndef DISABLE_GRAPHICS if (!prog_args.disable_plots) { init_plots(); } #endif /* Setup SIGINT handler */ printf("\n --- Press Ctrl+C to exit --- \n"); signal(SIGINT, sigintHandler); /* Initialize frame and subframe counters */ sf_cnt = 0; sf_idx = 0; /* Main loop */ while (!go_exit && (sf_cnt < prog_args.nof_subframes || prog_args.nof_subframes == -1)) { ret = iodev_receive(&iodev, &sf_buffer); if (ret < 0) { fprintf(stderr, "Error reading from input device (%d)\n", ret); break; } /* iodev_receive returns 1 if successfully read 1 aligned subframe */ if (ret == 1) { if (!ue_dl_initiated) { if (iodev_isUSRP(&iodev)) { cell = ue_sync_get_cell(&iodev.sframe); mib = ue_sync_get_mib(&iodev.sframe); } else { cell.id = prog_args.cell_id_file; cell.cp = CPNORM; cell.nof_ports = 1; // TODO: Use prog_args cell.nof_prb = prog_args.nof_prb_file; mib.phich_resources = R_1; mib.phich_length = PHICH_NORM; } if (ue_dl_init(&ue_dl, cell, mib.phich_resources, mib.phich_length, 1234)) { fprintf(stderr, "Error initiating UE downlink processing module\n"); exit(-1); } pdsch_set_rnti(&ue_dl.pdsch, prog_args.rnti); ue_dl_initiated = true; } else { if (iodev_isUSRP(&iodev)) { sf_idx = ue_sync_get_sfidx(&iodev.sframe); } rlen = ue_dl_receive(&ue_dl, sf_buffer, data, sf_idx, ue_sync_get_mib(&iodev.sframe).sfn, prog_args.rnti); if (rlen < 0) { fprintf(stderr, "\nError running receiver\n");fflush(stdout); exit(-1); } if (prog_args.rnti == SIRNTI && !printed_sib && rlen > 0) { printf("\n\nDecoded SIB1 Message: "); vec_fprint_hex(stdout, data, rlen); printf("\n");fflush(stdout); printed_sib = true; } if (!(sf_cnt % 10)) { printf("Cell ID: %3d, RSSI: %+.2f dBm, CFO: %+.4f KHz, SFO: %+.4f Khz, TimeOffset: %4d, Errors: %4d/%4d, BLER: %.1e\r", cell.id, 20*log10f(agc_get_rssi(&iodev.sframe.agc)), iodev.sframe.cur_cfo * 15, iodev.sframe.mean_time_offset / 5, iodev.sframe.peak_idx, (int) ue_dl.pkt_errors, (int) ue_dl.pkts_total, (float) ue_dl.pkt_errors / ue_dl.pkts_total); fflush(stdout); if (VERBOSE_ISINFO()) { printf("\n"); } } #ifndef DISABLE_GRAPHICS if (!prog_args.disable_plots && sf_idx == 5) { do_plots(&ue_dl, sf_idx); } #endif } if (iodev_isfile(&iodev)) { sf_idx++; if (sf_idx == NSUBFRAMES_X_FRAME) { sf_idx = 0; } } } if (prog_args.nof_subframes > 0) { sf_cnt++; } if (iodev_isfile(&iodev)) { usleep(5000); } } if (ue_dl_initiated) { ue_dl_free(&ue_dl); } iodev_free(&iodev); printf("\nBye\n"); exit(0); }
int main(int argc, char **argv) { cf_t *input_buffer, *sf_symbols = NULL; int frame_cnt; ue_sync_t s; int pos; pss_synch_t pss; float peak; struct timeval t[3]; float mean_ce_time=0; bool signal_detected; lte_fft_t fft; lte_cell_t cell; bzero(&cell, sizeof(lte_cell_t)); parse_args(argc, argv); #ifndef DISABLE_GRAPHICS if (!disable_plots) { init_plots(); } #endif input_init(); if (ue_sync_init(&s, cuhd_set_rx_srate, cuhd_recv_wrapper, uhd)) { fprintf(stderr, "Error initiating UE sync module\n"); exit(-1); } ue_sync_pbch_enable(&s, true); signal_detected = true; frame_cnt = 0; mean_ce_time=0; uint32_t valid_frames=0; //uint32_t unaligned = 0; while (frame_cnt < nof_frames || nof_frames == -1) { int n = ue_sync_get_buffer(&s, &input_buffer); if (n < 0) { fprintf(stderr, "Error calling sync work()\n"); exit(-1); } if (n == 1 && ue_sync_get_sfidx(&s) == 0) { if (signal_detected) { cell = ue_sync_get_cell(&s); pss_synch_init_fft(&pss, SF_LEN(lte_symbol_sz(cell.nof_prb), cell.cp), lte_symbol_sz(cell.nof_prb)); pss_synch_set_N_id_2(&pss, cell.id%3); sf_symbols = vec_malloc(SLOT_LEN_RE(cell.nof_prb, cell.cp) * sizeof(cf_t)); if (!sf_symbols) { perror("malloc"); exit(-1); } lte_fft_init(&fft, cell.cp, cell.nof_prb); signal_detected = false; } mean_ce_time = (float) (mean_ce_time + (float) t[0].tv_usec * valid_frames) / (valid_frames+1); valid_frames++; #ifndef DISABLE_GRAPHICS if (!disable_plots && !(valid_frames % 5) && sf_symbols) { /* Run FFT for the second slot */ lte_fft_run_slot(&fft, input_buffer, sf_symbols); int i; int nof_re = SLOT_LEN_RE(cell.nof_prb, cell.cp); for (i = 0; i < nof_re; i++) { tmp_plot[i] = 10 * log10f(cabsf(sf_symbols[i])); if (isinf(tmp_plot[i])) { tmp_plot[i] = -80; } } plot_real_setNewData(&poutfft, tmp_plot, nof_re); } #endif pos = pss_synch_find_pss(&pss, input_buffer, &peak, NULL); /*if (pos > 962 || pos < 958) { unaligned++; } */ printf("CELL_ID: %3d CFO: %+.4f KHz, SFO: %+.4f Khz, TimeOffset: %4d, Exec: %3.2f\r", cell.id, ue_sync_get_cfo(&s)/1000, ue_sync_get_sfo(&s)/1000, pos, s.mean_exec_time); fflush(stdout); if (VERBOSE_ISINFO()) { printf("\n"); } } frame_cnt++; } printf("\nBye\n"); exit(0); }
int main(int argc, char **argv) { int frame_cnt, valid_frames; int freq; int cell_id; sync_t sfind, strack; float max_peak_to_avg; float sfo; int find_idx, track_idx, last_found; enum sync_state state; int n; filesink_t fs; if (argc < 3) { usage(argv[0]); exit(-1); } parse_args(argc,argv); if (base_init(FLEN)) { fprintf(stderr, "Error initializing memory\n"); exit(-1); } if (sync_init(&sfind, FLEN)) { fprintf(stderr, "Error initiating PSS/SSS\n"); exit(-1); } sync_pss_det_peak_to_avg(&sfind); if (sync_init(&strack, track_len)) { fprintf(stderr, "Error initiating PSS/SSS\n"); exit(-1); } sync_pss_det_peak_to_avg(&strack); nof_bands = lte_band_get_fd_band(band, channels, earfcn_start, earfcn_end, MAX_EARFCN); printf("RSSI scan: %d freqs in band %d, RSSI threshold %.2f dBm\n", nof_bands, band, rssi_threshold); n = rssi_scan(); if (n == -1) { exit(-1); } printf("\nDone. Starting PSS search on %d channels\n", n); usleep(500000); INFO("Setting sampling frequency %.2f MHz\n", (float) SAMP_FREQ/MHZ); cuhd_set_rx_srate(uhd, SAMP_FREQ); cuhd_set_rx_gain(uhd, uhd_gain); print_to_matlab(); filesink_init(&fs, "test.dat", COMPLEX_FLOAT_BIN); freq=0; state = INIT; find_idx = 0; max_peak_to_avg = 0; last_found = 0; frame_cnt = 0; while(freq<nof_bands) { /* scan only bands above rssi_threshold */ if (!IS_SIGNAL(freq)) { INFO("[%3d/%d]: Skipping EARFCN %d %.2f MHz RSSI %.2f dB\n", freq, nof_bands, channels[freq].id, channels[freq].fd,10*log10f(rssi[freq]) + 30); freq++; } else { if (state == TRACK || state == FIND) { cuhd_recv(uhd, &input_buffer[FLEN], FLEN, 1); } switch(state) { case INIT: DEBUG("Stopping receiver...\n",0); cuhd_stop_rx_stream(uhd); /* set freq */ cuhd_set_rx_freq(uhd, (double) channels[freq].fd * MHZ); cuhd_rx_wait_lo_locked(uhd); DEBUG("Set freq to %.3f MHz\n", (double) channels[freq].fd); DEBUG("Starting receiver...\n",0); cuhd_start_rx_stream(uhd); /* init variables */ frame_cnt = 0; max_peak_to_avg = -99; cell_id = -1; /* receive first frame */ cuhd_recv(uhd, input_buffer, FLEN, 1); /* set find_threshold and go to FIND state */ sync_set_threshold(&sfind, find_threshold); sync_force_N_id_2(&sfind, -1); state = FIND; break; case FIND: /* find peak in all frame */ find_idx = sync_run(&sfind, &input_buffer[FLEN]); DEBUG("[%3d/%d]: PAR=%.2f\n", freq, nof_bands, sync_get_peak_to_avg(&sfind)); if (find_idx != -1) { /* if found peak, go to track and set lower threshold */ frame_cnt = -1; last_found = 0; sync_set_threshold(&strack, track_threshold); sync_force_N_id_2(&strack, sync_get_N_id_2(&sfind)); state = TRACK; INFO("[%3d/%d]: EARFCN %d Freq. %.2f MHz PSS found PAR %.2f dB\n", freq, nof_bands, channels[freq].id, channels[freq].fd, 10*log10f(sync_get_peak_to_avg(&sfind))); } else { if (frame_cnt >= nof_frames_find) { state = INIT; printf("[%3d/%d]: EARFCN %d Freq. %.2f MHz No PSS found\r", freq, nof_bands, channels[freq].id, channels[freq].fd, frame_cnt - last_found); if (VERBOSE_ISINFO()) { printf("\n"); } freq++; } } break; case TRACK: INFO("Tracking PSS find_idx %d offset %d\n", find_idx, find_idx + track_len); filesink_write(&fs, &input_buffer[FLEN+find_idx+track_len], track_len); track_idx = sync_run(&strack, &input_buffer[FLEN + find_idx - track_len]); p2a_v[frame_cnt] = sync_get_peak_to_avg(&strack); /* save cell id for the best peak-to-avg */ if (p2a_v[frame_cnt] > max_peak_to_avg) { max_peak_to_avg = p2a_v[frame_cnt]; cell_id = sync_get_cell_id(&strack); } if (track_idx != -1) { cfo_v[frame_cnt] = sync_get_cfo(&strack); last_found = frame_cnt; find_idx += track_idx - track_len; idx_v[frame_cnt] = find_idx; } else { idx_v[frame_cnt] = -1; cfo_v[frame_cnt] = 0.0; } /* if we missed to many PSS it is not a cell, next freq */ if (frame_cnt - last_found > max_track_lost) { INFO("\n[%3d/%d]: EARFCN %d Freq. %.2f MHz %d frames lost\n", freq, nof_bands, channels[freq].id, channels[freq].fd, frame_cnt - last_found); state = INIT; freq++; } else if (frame_cnt >= nof_frames_track) { state = DONE; } break; case DONE: cfo[freq] = mean_valid(idx_v, cfo_v, frame_cnt); p2a[freq] = mean_valid(idx_v, p2a_v, frame_cnt); valid_frames = preprocess_idx(idx_v, idx_valid, t, frame_cnt); sfo = sfo_estimate_period(idx_valid, t, valid_frames, FLEN_PERIOD); printf("\n[%3d/%d]: FOUND EARFCN %d Freq. %.2f MHz. " "PAR %2.2f dB, CFO=%+.2f KHz, SFO=%+2.3f KHz, CELL_ID=%3d\n", freq, nof_bands, channels[freq].id, channels[freq].fd, 10*log10f(p2a[freq]), cfo[freq] * 15, sfo / 1000, cell_id); state = INIT; freq++; break; } if (state == TRACK || (state == FIND && frame_cnt)) { memcpy(input_buffer, &input_buffer[FLEN], FLEN * sizeof(cf_t)); } frame_cnt++; } } print_to_matlab(); sync_free(&sfind); base_free(); printf("\n\nDone\n"); exit(0); }