int main(int argc, char **argv) { int nf, sf_idx, N_id_2; cf_t pss_signal[PSS_LEN]; float sss_signal0[SSS_LEN]; // for subframe 0 float sss_signal5[SSS_LEN]; // for subframe 5 pbch_mib_t mib; ra_pdsch_t ra_dl; ra_prb_t prb_alloc; refsignal_t refs[NSLOTS_X_FRAME]; int i, n; char *data; cf_t *sf_symbols[MAX_PORTS]; dci_msg_t dci_msg; dci_location_t locations[NSUBFRAMES_X_FRAME][10]; #ifdef DISABLE_UHD if (argc < 3) { usage(argv[0]); exit(-1); } #endif parse_args(argc, argv); N_id_2 = cell.id % 3; sf_n_re = 2 * CPNORM_NSYMB * cell.nof_prb * RE_X_RB; sf_n_samples = 2 * SLOT_LEN(lte_symbol_sz(cell.nof_prb)); /* this *must* be called after setting slot_len_* */ base_init(); /* Generate PSS/SSS signals */ pss_generate(pss_signal, N_id_2); sss_generate(sss_signal0, sss_signal5, cell.id); /* Generate CRS signals */ for (i = 0; i < NSLOTS_X_FRAME; i++) { if (refsignal_init_LTEDL(&refs[i], 0, i, cell)) { fprintf(stderr, "Error initiating CRS slot=%d\n", i); return -1; } } mib.nof_ports = cell.nof_ports; mib.nof_prb = cell.nof_prb; mib.phich_length = PHICH_NORM; mib.phich_resources = R_1; mib.sfn = 0; for (i = 0; i < MAX_PORTS; i++) { // now there's only 1 port sf_symbols[i] = sf_buffer; } #ifndef DISABLE_UHD if (!output_file_name) { printf("Set TX rate: %.2f MHz\n", cuhd_set_tx_srate(uhd, lte_sampling_freq_hz(cell.nof_prb)) / 1000000); printf("Set TX gain: %.1f dB\n", cuhd_set_tx_gain(uhd, uhd_gain)); printf("Set TX freq: %.2f MHz\n", cuhd_set_tx_freq(uhd, uhd_freq) / 1000000); } #endif bzero(&ra_dl, sizeof(ra_pdsch_t)); ra_dl.harq_process = 0; ra_dl.mcs_idx = mcs_idx; ra_dl.ndi = 0; ra_dl.rv_idx = 0; ra_dl.alloc_type = alloc_type0; ra_dl.type0_alloc.rbg_bitmask = 0xffffffff; dci_msg_pack_pdsch(&ra_dl, &dci_msg, Format1, cell.nof_prb, false); ra_prb_get_dl(&prb_alloc, &ra_dl, cell.nof_prb); ra_prb_get_re_dl(&prb_alloc, cell.nof_prb, 1, cell.nof_prb<10?(cfi+1):cfi, CPNORM); ra_mcs_from_idx_dl(mcs_idx, cell.nof_prb, &ra_dl.mcs); ra_pdsch_fprint(stdout, &ra_dl, cell.nof_prb); /* Initiate valid DCI locations */ for (i=0;i<NSUBFRAMES_X_FRAME;i++) { pdcch_ue_locations(&pdcch, locations[i], 10, i, cfi, 1234); } data = malloc(sizeof(char) * ra_dl.mcs.tbs); if (!data) { perror("malloc"); exit(-1); } nf = 0; if (pdsch_harq_setup(&harq_process, ra_dl.mcs, &prb_alloc)) { fprintf(stderr, "Error configuring HARQ process\n"); exit(-1); } while (nf < nof_frames || nof_frames == -1) { for (sf_idx = 0; sf_idx < NSUBFRAMES_X_FRAME && (nf < nof_frames || nof_frames == -1); sf_idx++) { bzero(sf_buffer, sizeof(cf_t) * sf_n_re); if (sf_idx == 0 || sf_idx == 5) { pss_put_slot(pss_signal, sf_buffer, cell.nof_prb, CPNORM); sss_put_slot(sf_idx ? sss_signal5 : sss_signal0, sf_buffer, cell.nof_prb, CPNORM); } if (sf_idx == 0) { pbch_encode(&pbch, &mib, sf_symbols); } for (n=0;n<2;n++) { refsignal_put(&refs[2*sf_idx+n], &sf_buffer[n*sf_n_re/2]); } pcfich_encode(&pcfich, cfi, sf_symbols, sf_idx); INFO("SF: %d, Generating %d random bits\n", sf_idx, ra_dl.mcs.tbs); for (i=0;i<ra_dl.mcs.tbs;i++) { data[i] = rand()%2; } INFO("Puttting DCI to location: n=%d, L=%d\n", locations[sf_idx][0].ncce, locations[sf_idx][0].L); if (pdcch_encode(&pdcch, &dci_msg, locations[sf_idx][0], 1234, sf_symbols, sf_idx, cfi)) { fprintf(stderr, "Error encoding DCI message\n"); exit(-1); } if (pdsch_encode(&pdsch, data, sf_symbols, sf_idx, &harq_process, ra_dl.rv_idx)) { fprintf(stderr, "Error encoding PDSCH\n"); exit(-1); } /* Transform to OFDM symbols */ lte_ifft_run_sf(&ifft, sf_buffer, output_buffer); /* send to file or usrp */ if (output_file_name) { filesink_write(&fsink, output_buffer, sf_n_samples); usleep(5000); } else { #ifndef DISABLE_UHD vec_sc_prod_cfc(output_buffer, uhd_amp, output_buffer, sf_n_samples); cuhd_send(uhd, output_buffer, sf_n_samples, true); #endif } nf++; } mib.sfn = (mib.sfn + 1) % 1024; printf("SFN: %4d\r", mib.sfn); fflush(stdout); } base_free(); printf("Done\n"); exit(0); }
int filesink_work(filesink_hl* h) { if (filesink_write(&h->obj, h->input, h->in_len)<0) { return -1; } return 0; }
int main(int argc, char **argv) { int nf, ns, N_id_2; cf_t pss_signal[PSS_LEN]; float sss_signal0[SSS_LEN]; // for subframe 0 float sss_signal5[SSS_LEN]; // for subframe 5 pbch_mib_t mib; refsignal_t refs[NSLOTS_X_FRAME]; int i; cf_t *slot1_symbols[MAX_PORTS_CTRL]; #ifdef DISABLE_UHD if (argc < 3) { usage(argv[0]); exit(-1); } #endif parse_args(argc,argv); N_id_2 = cell_id%3; slot_n_re = CPNORM_NSYMB * nof_prb * RE_X_RB; slot_n_samples = SLOT_LEN_CPNORM(lte_symbol_sz(nof_prb)); /* this *must* be called after setting slot_len_* */ base_init(); /* Generate PSS/SSS signals */ pss_generate(pss_signal, N_id_2); sss_generate(sss_signal0, sss_signal5, cell_id); /* Generate CRS signals */ for (i=0;i<NSLOTS_X_FRAME;i++) { if (refsignal_init_LTEDL(&refs[i], 0, i, cell_id, CPNORM, nof_prb)) { fprintf(stderr, "Error initiating CRS slot=%d\n", i); return -1; } } mib.nof_ports = 1; mib.nof_prb = 6; mib.phich_length = PHICH_NORM; mib.phich_resources = R_1; mib.sfn = 0; for (i=0;i<MAX_PORTS_CTRL;i++) { // now there's only 1 port slot1_symbols[i] = slot_buffer; } #ifndef DISABLE_UHD if (!output_file_name) { printf("Set TX rate: %.2f MHz\n", cuhd_set_tx_srate(uhd, UHD_SAMP_FREQ)/1000000); printf("Set TX gain: %.1f dB\n", cuhd_set_tx_gain(uhd, uhd_gain)); printf("Set TX freq: %.2f MHz\n", cuhd_set_tx_freq(uhd, uhd_freq)/1000000); } #endif nf = 0; while(nf<nof_frames || nof_frames == -1) { for (ns=0;ns<NSLOTS_X_FRAME;ns++) { bzero(slot_buffer, sizeof(cf_t) * slot_n_re); switch(ns) { case 0: // tx pss/sss case 10: // tx pss/sss pss_put_slot(pss_signal, slot_buffer, nof_prb, CPNORM); sss_put_slot(ns?sss_signal5:sss_signal0, slot_buffer, nof_prb, CPNORM); break; case 1: // tx pbch pbch_encode(&pbch, &mib, slot1_symbols, 1); break; default: // transmit zeros break; } refsignal_put(&refs[ns], slot_buffer); /* Transform to OFDM symbols */ lte_ifft_run(&ifft, slot_buffer, output_buffer); /* send to file or usrp */ if (output_file_name) { filesink_write(&fsink, output_buffer, slot_n_samples); usleep(5000); } else { #ifndef DISABLE_UHD vec_sc_prod_cfc(output_buffer, uhd_amp, output_buffer, slot_n_samples); cuhd_send(uhd, output_buffer, slot_n_samples, 1); #endif } } mib.sfn=(mib.sfn+1)%1024; printf("SFN: %4d\r", mib.sfn);fflush(stdout); nf++; } base_free(); printf("Done\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); }