mirror of https://github.com/PentHertz/srsLTE.git
compatible with single port srsUE
This commit is contained in:
parent
5de9fa6a46
commit
255c157cb2
|
@ -237,11 +237,11 @@ int main(int argc, char **argv) {
|
||||||
srslte_rf_stop_rx_stream(&rf);
|
srslte_rf_stop_rx_stream(&rf);
|
||||||
srslte_rf_flush_buffer(&rf);
|
srslte_rf_flush_buffer(&rf);
|
||||||
|
|
||||||
if (srslte_ue_sync_init(&ue_sync, cell, srslte_rf_recv_wrapper, 1, (void*) &rf)) {
|
if (srslte_ue_sync_init_multi(&ue_sync, cell, srslte_rf_recv_wrapper, 1, (void*) &rf)) {
|
||||||
fprintf(stderr, "Error initiating ue_sync\n");
|
fprintf(stderr, "Error initiating ue_sync\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (srslte_ue_dl_init(&ue_dl, cell, 1)) {
|
if (srslte_ue_dl_init_multi(&ue_dl, cell, 1)) {
|
||||||
fprintf(stderr, "Error initiating UE downlink processing module\n");
|
fprintf(stderr, "Error initiating UE downlink processing module\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -283,7 +283,7 @@ int main(int argc, char **argv) {
|
||||||
/* Main loop */
|
/* Main loop */
|
||||||
while ((sf_cnt < prog_args.nof_subframes || prog_args.nof_subframes == -1) && !go_exit) {
|
while ((sf_cnt < prog_args.nof_subframes || prog_args.nof_subframes == -1) && !go_exit) {
|
||||||
|
|
||||||
ret = srslte_ue_sync_zerocopy(&ue_sync, sf_buffer);
|
ret = srslte_ue_sync_zerocopy_multi(&ue_sync, sf_buffer);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
fprintf(stderr, "Error calling srslte_ue_sync_work()\n");
|
fprintf(stderr, "Error calling srslte_ue_sync_work()\n");
|
||||||
}
|
}
|
||||||
|
@ -310,7 +310,7 @@ int main(int argc, char **argv) {
|
||||||
case DECODE_SIB:
|
case DECODE_SIB:
|
||||||
/* We are looking for SI Blocks, search only in appropiate places */
|
/* We are looking for SI Blocks, search only in appropiate places */
|
||||||
if ((srslte_ue_sync_get_sfidx(&ue_sync) == 5 && (sfn%2)==0)) {
|
if ((srslte_ue_sync_get_sfidx(&ue_sync) == 5 && (sfn%2)==0)) {
|
||||||
n = srslte_ue_dl_decode(&ue_dl, sf_buffer, data, sfn*10+srslte_ue_sync_get_sfidx(&ue_sync));
|
n = srslte_ue_dl_decode_multi(&ue_dl, sf_buffer, data, sfn*10+srslte_ue_sync_get_sfidx(&ue_sync));
|
||||||
if (n < 0) {
|
if (n < 0) {
|
||||||
fprintf(stderr, "Error decoding UE DL\n");fflush(stdout);
|
fprintf(stderr, "Error decoding UE DL\n");fflush(stdout);
|
||||||
return -1;
|
return -1;
|
||||||
|
|
|
@ -204,7 +204,7 @@ int main(int argc, char **argv) {
|
||||||
|
|
||||||
bzero(found_cells, 3*sizeof(srslte_ue_cellsearch_result_t));
|
bzero(found_cells, 3*sizeof(srslte_ue_cellsearch_result_t));
|
||||||
|
|
||||||
if (srslte_ue_cellsearch_init(&cs, cell_detect_config.max_frames_pss, srslte_rf_recv_wrapper, 1, (void*) &rf)) {
|
if (srslte_ue_cellsearch_init_multi(&cs, cell_detect_config.max_frames_pss, srslte_rf_recv_wrapper, 1, (void*) &rf)) {
|
||||||
fprintf(stderr, "Error initiating UE cell detect\n");
|
fprintf(stderr, "Error initiating UE cell detect\n");
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
|
|
|
@ -411,7 +411,7 @@ int main(int argc, char **argv) {
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
#ifndef DISABLE_RF
|
#ifndef DISABLE_RF
|
||||||
if (srslte_ue_sync_init(&ue_sync, cell, srslte_rf_recv_wrapper, prog_args.rf_nof_rx_ant, (void*) &rf)) {
|
if (srslte_ue_sync_init_multi(&ue_sync, cell, srslte_rf_recv_wrapper, prog_args.rf_nof_rx_ant, (void*) &rf)) {
|
||||||
fprintf(stderr, "Error initiating ue_sync\n");
|
fprintf(stderr, "Error initiating ue_sync\n");
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
|
@ -423,7 +423,7 @@ int main(int argc, char **argv) {
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (srslte_ue_dl_init(&ue_dl, cell, prog_args.rf_nof_rx_ant)) { // This is the User RNTI
|
if (srslte_ue_dl_init_multi(&ue_dl, cell, prog_args.rf_nof_rx_ant)) { // This is the User RNTI
|
||||||
fprintf(stderr, "Error initiating UE downlink processing module\n");
|
fprintf(stderr, "Error initiating UE downlink processing module\n");
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
|
@ -478,7 +478,7 @@ int main(int argc, char **argv) {
|
||||||
/* Main loop */
|
/* Main loop */
|
||||||
while (!go_exit && (sf_cnt < prog_args.nof_subframes || prog_args.nof_subframes == -1)) {
|
while (!go_exit && (sf_cnt < prog_args.nof_subframes || prog_args.nof_subframes == -1)) {
|
||||||
|
|
||||||
ret = srslte_ue_sync_zerocopy(&ue_sync, sf_buffer);
|
ret = srslte_ue_sync_zerocopy_multi(&ue_sync, sf_buffer);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
fprintf(stderr, "Error calling srslte_ue_sync_work()\n");
|
fprintf(stderr, "Error calling srslte_ue_sync_work()\n");
|
||||||
}
|
}
|
||||||
|
@ -519,7 +519,7 @@ int main(int argc, char **argv) {
|
||||||
}
|
}
|
||||||
if (decode_pdsch) {
|
if (decode_pdsch) {
|
||||||
INFO("Attempting DL decode SFN=%d\n", sfn);
|
INFO("Attempting DL decode SFN=%d\n", sfn);
|
||||||
n = srslte_ue_dl_decode(&ue_dl,
|
n = srslte_ue_dl_decode_multi(&ue_dl,
|
||||||
sf_buffer,
|
sf_buffer,
|
||||||
data,
|
data,
|
||||||
sfn*10+srslte_ue_sync_get_sfidx(&ue_sync));
|
sfn*10+srslte_ue_sync_get_sfidx(&ue_sync));
|
||||||
|
@ -701,7 +701,7 @@ void *plot_thread_run(void *arg) {
|
||||||
uint32_t nof_symbols = ue_dl.pdsch_cfg.nbits.nof_re;
|
uint32_t nof_symbols = ue_dl.pdsch_cfg.nbits.nof_re;
|
||||||
if (!prog_args.disable_plots_except_constellation) {
|
if (!prog_args.disable_plots_except_constellation) {
|
||||||
for (i = 0; i < nof_re; i++) {
|
for (i = 0; i < nof_re; i++) {
|
||||||
tmp_plot[i] = 20 * log10f(cabsf(ue_dl.sf_symbols[0][i]));
|
tmp_plot[i] = 20 * log10f(cabsf(ue_dl.sf_symbols[i]));
|
||||||
if (isinf(tmp_plot[i])) {
|
if (isinf(tmp_plot[i])) {
|
||||||
tmp_plot[i] = -80;
|
tmp_plot[i] = -80;
|
||||||
}
|
}
|
||||||
|
@ -710,7 +710,7 @@ void *plot_thread_run(void *arg) {
|
||||||
bzero(tmp_plot2, sizeof(float)*sz);
|
bzero(tmp_plot2, sizeof(float)*sz);
|
||||||
int g = (sz - 12*ue_dl.cell.nof_prb)/2;
|
int g = (sz - 12*ue_dl.cell.nof_prb)/2;
|
||||||
for (i = 0; i < 12*ue_dl.cell.nof_prb; i++) {
|
for (i = 0; i < 12*ue_dl.cell.nof_prb; i++) {
|
||||||
tmp_plot2[g+i] = 20 * log10(cabs(ue_dl.ce[0][0][i]));
|
tmp_plot2[g+i] = 20 * log10(cabs(ue_dl.ce[0][i]));
|
||||||
if (isinf(tmp_plot2[g+i])) {
|
if (isinf(tmp_plot2[g+i])) {
|
||||||
tmp_plot2[g+i] = -80;
|
tmp_plot2[g+i] = -80;
|
||||||
}
|
}
|
||||||
|
|
|
@ -158,7 +158,7 @@ int main(int argc, char **argv) {
|
||||||
cell.nof_prb = nof_prb;
|
cell.nof_prb = nof_prb;
|
||||||
cell.nof_ports = 1;
|
cell.nof_ports = 1;
|
||||||
|
|
||||||
if (srslte_ue_sync_init(&ue_sync, cell, srslte_rf_recv_wrapper, 1, (void*) &rf)) {
|
if (srslte_ue_sync_init_multi(&ue_sync, cell, srslte_rf_recv_wrapper, 1, (void*) &rf)) {
|
||||||
fprintf(stderr, "Error initiating ue_sync\n");
|
fprintf(stderr, "Error initiating ue_sync\n");
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
|
@ -169,7 +169,7 @@ int main(int argc, char **argv) {
|
||||||
while((subframe_count < nof_subframes || nof_subframes == -1)
|
while((subframe_count < nof_subframes || nof_subframes == -1)
|
||||||
&& !stop_capture)
|
&& !stop_capture)
|
||||||
{
|
{
|
||||||
n = srslte_ue_sync_zerocopy(&ue_sync, buffer);
|
n = srslte_ue_sync_zerocopy_multi(&ue_sync, buffer);
|
||||||
if (n < 0) {
|
if (n < 0) {
|
||||||
fprintf(stderr, "Error receiving samples\n");
|
fprintf(stderr, "Error receiving samples\n");
|
||||||
exit(-1);
|
exit(-1);
|
||||||
|
|
|
@ -82,6 +82,11 @@ typedef struct SRSLTE_API {
|
||||||
} srslte_ue_cellsearch_t;
|
} srslte_ue_cellsearch_t;
|
||||||
|
|
||||||
SRSLTE_API int srslte_ue_cellsearch_init(srslte_ue_cellsearch_t *q,
|
SRSLTE_API int srslte_ue_cellsearch_init(srslte_ue_cellsearch_t *q,
|
||||||
|
uint32_t max_frames_total,
|
||||||
|
int (recv_callback)(void*, void*, uint32_t,srslte_timestamp_t*),
|
||||||
|
void *stream_handler);
|
||||||
|
|
||||||
|
SRSLTE_API int srslte_ue_cellsearch_init_multi(srslte_ue_cellsearch_t *q,
|
||||||
uint32_t max_frames_total,
|
uint32_t max_frames_total,
|
||||||
int (recv_callback)(void*, cf_t*[SRSLTE_MAX_PORTS], uint32_t,srslte_timestamp_t*),
|
int (recv_callback)(void*, cf_t*[SRSLTE_MAX_PORTS], uint32_t,srslte_timestamp_t*),
|
||||||
uint32_t nof_rx_antennas,
|
uint32_t nof_rx_antennas,
|
||||||
|
|
|
@ -90,8 +90,10 @@ typedef struct SRSLTE_API {
|
||||||
|
|
||||||
uint32_t nof_rx_antennas;
|
uint32_t nof_rx_antennas;
|
||||||
|
|
||||||
cf_t *sf_symbols[SRSLTE_MAX_PORTS];
|
cf_t *sf_symbols; // this is for backwards compatibility
|
||||||
cf_t *ce[SRSLTE_MAX_PORTS][SRSLTE_MAX_PORTS];
|
cf_t *sf_symbols_m[SRSLTE_MAX_PORTS];
|
||||||
|
cf_t *ce[SRSLTE_MAX_PORTS]; // compatibility
|
||||||
|
cf_t *ce_m[SRSLTE_MAX_PORTS][SRSLTE_MAX_PORTS];
|
||||||
|
|
||||||
srslte_dci_format_t dci_format;
|
srslte_dci_format_t dci_format;
|
||||||
uint64_t pkt_errors;
|
uint64_t pkt_errors;
|
||||||
|
@ -112,12 +114,20 @@ typedef struct SRSLTE_API {
|
||||||
|
|
||||||
/* This function shall be called just after the initial synchronization */
|
/* This function shall be called just after the initial synchronization */
|
||||||
SRSLTE_API int srslte_ue_dl_init(srslte_ue_dl_t *q,
|
SRSLTE_API int srslte_ue_dl_init(srslte_ue_dl_t *q,
|
||||||
|
srslte_cell_t cell);
|
||||||
|
|
||||||
|
SRSLTE_API int srslte_ue_dl_init_multi(srslte_ue_dl_t *q,
|
||||||
srslte_cell_t cell,
|
srslte_cell_t cell,
|
||||||
uint32_t nof_rx_antennas);
|
uint32_t nof_rx_antennas);
|
||||||
|
|
||||||
SRSLTE_API void srslte_ue_dl_free(srslte_ue_dl_t *q);
|
SRSLTE_API void srslte_ue_dl_free(srslte_ue_dl_t *q);
|
||||||
|
|
||||||
SRSLTE_API int srslte_ue_dl_decode_fft_estimate(srslte_ue_dl_t *q,
|
SRSLTE_API int srslte_ue_dl_decode_fft_estimate(srslte_ue_dl_t *q,
|
||||||
|
cf_t *input,
|
||||||
|
uint32_t sf_idx,
|
||||||
|
uint32_t *cfi);
|
||||||
|
|
||||||
|
SRSLTE_API int srslte_ue_dl_decode_fft_estimate_multi(srslte_ue_dl_t *q,
|
||||||
cf_t *input[SRSLTE_MAX_PORTS],
|
cf_t *input[SRSLTE_MAX_PORTS],
|
||||||
uint32_t sf_idx,
|
uint32_t sf_idx,
|
||||||
uint32_t *cfi);
|
uint32_t *cfi);
|
||||||
|
@ -157,11 +167,22 @@ SRSLTE_API void srslte_ue_dl_set_sample_offset(srslte_ue_dl_t * q,
|
||||||
float sample_offset);
|
float sample_offset);
|
||||||
|
|
||||||
SRSLTE_API int srslte_ue_dl_decode(srslte_ue_dl_t * q,
|
SRSLTE_API int srslte_ue_dl_decode(srslte_ue_dl_t * q,
|
||||||
|
cf_t *input,
|
||||||
|
uint8_t *data,
|
||||||
|
uint32_t tti);
|
||||||
|
|
||||||
|
SRSLTE_API int srslte_ue_dl_decode_multi(srslte_ue_dl_t * q,
|
||||||
cf_t *input[SRSLTE_MAX_PORTS],
|
cf_t *input[SRSLTE_MAX_PORTS],
|
||||||
uint8_t *data,
|
uint8_t *data,
|
||||||
uint32_t tti);
|
uint32_t tti);
|
||||||
|
|
||||||
SRSLTE_API int srslte_ue_dl_decode_rnti(srslte_ue_dl_t * q,
|
SRSLTE_API int srslte_ue_dl_decode_rnti(srslte_ue_dl_t * q,
|
||||||
|
cf_t *input,
|
||||||
|
uint8_t *data,
|
||||||
|
uint32_t tti,
|
||||||
|
uint16_t rnti);
|
||||||
|
|
||||||
|
SRSLTE_API int srslte_ue_dl_decode_rnti_multi(srslte_ue_dl_t * q,
|
||||||
cf_t *input[SRSLTE_MAX_PORTS],
|
cf_t *input[SRSLTE_MAX_PORTS],
|
||||||
uint8_t *data,
|
uint8_t *data,
|
||||||
uint32_t tti,
|
uint32_t tti,
|
||||||
|
|
|
@ -105,6 +105,12 @@ typedef struct {
|
||||||
} srslte_ue_mib_sync_t;
|
} srslte_ue_mib_sync_t;
|
||||||
|
|
||||||
SRSLTE_API int srslte_ue_mib_sync_init(srslte_ue_mib_sync_t *q,
|
SRSLTE_API int srslte_ue_mib_sync_init(srslte_ue_mib_sync_t *q,
|
||||||
|
uint32_t cell_id,
|
||||||
|
srslte_cp_t cp,
|
||||||
|
int (recv_callback)(void*, void*, uint32_t, srslte_timestamp_t *),
|
||||||
|
void *stream_handler);
|
||||||
|
|
||||||
|
SRSLTE_API int srslte_ue_mib_sync_init_multi(srslte_ue_mib_sync_t *q,
|
||||||
uint32_t cell_id,
|
uint32_t cell_id,
|
||||||
srslte_cp_t cp,
|
srslte_cp_t cp,
|
||||||
int (recv_callback)(void*, cf_t*[SRSLTE_MAX_PORTS], uint32_t, srslte_timestamp_t *),
|
int (recv_callback)(void*, cf_t*[SRSLTE_MAX_PORTS], uint32_t, srslte_timestamp_t *),
|
||||||
|
|
|
@ -76,6 +76,7 @@ typedef struct SRSLTE_API {
|
||||||
|
|
||||||
void *stream;
|
void *stream;
|
||||||
int (*recv_callback)(void*, cf_t*[SRSLTE_MAX_PORTS], uint32_t, srslte_timestamp_t*);
|
int (*recv_callback)(void*, cf_t*[SRSLTE_MAX_PORTS], uint32_t, srslte_timestamp_t*);
|
||||||
|
int (*recv_callback_single)(void*, void*, uint32_t, srslte_timestamp_t*);
|
||||||
srslte_timestamp_t last_timestamp;
|
srslte_timestamp_t last_timestamp;
|
||||||
|
|
||||||
uint32_t nof_rx_antennas;
|
uint32_t nof_rx_antennas;
|
||||||
|
@ -116,13 +117,18 @@ typedef struct SRSLTE_API {
|
||||||
uint32_t sample_offset_correct_period;
|
uint32_t sample_offset_correct_period;
|
||||||
float sfo_ema;
|
float sfo_ema;
|
||||||
|
|
||||||
|
|
||||||
#ifdef MEASURE_EXEC_TIME
|
#ifdef MEASURE_EXEC_TIME
|
||||||
float mean_exec_time;
|
float mean_exec_time;
|
||||||
#endif
|
#endif
|
||||||
} srslte_ue_sync_t;
|
} srslte_ue_sync_t;
|
||||||
|
|
||||||
|
|
||||||
SRSLTE_API int srslte_ue_sync_init(srslte_ue_sync_t *q,
|
SRSLTE_API int srslte_ue_sync_init(srslte_ue_sync_t *q,
|
||||||
|
srslte_cell_t cell,
|
||||||
|
int (recv_callback)(void*, void*, uint32_t, srslte_timestamp_t*),
|
||||||
|
void *stream_handler);
|
||||||
|
|
||||||
|
SRSLTE_API int srslte_ue_sync_init_multi(srslte_ue_sync_t *q,
|
||||||
srslte_cell_t cell,
|
srslte_cell_t cell,
|
||||||
int (recv_callback)(void*, cf_t*[SRSLTE_MAX_PORTS], uint32_t, srslte_timestamp_t*),
|
int (recv_callback)(void*, cf_t*[SRSLTE_MAX_PORTS], uint32_t, srslte_timestamp_t*),
|
||||||
uint32_t nof_rx_antennas,
|
uint32_t nof_rx_antennas,
|
||||||
|
@ -147,6 +153,9 @@ SRSLTE_API void srslte_ue_sync_set_agc_period(srslte_ue_sync_t *q,
|
||||||
|
|
||||||
/* CAUTION: input_buffer MUST have space for 2 subframes */
|
/* CAUTION: input_buffer MUST have space for 2 subframes */
|
||||||
SRSLTE_API int srslte_ue_sync_zerocopy(srslte_ue_sync_t *q,
|
SRSLTE_API int srslte_ue_sync_zerocopy(srslte_ue_sync_t *q,
|
||||||
|
cf_t *input_buffer);
|
||||||
|
|
||||||
|
SRSLTE_API int srslte_ue_sync_zerocopy_multi(srslte_ue_sync_t *q,
|
||||||
cf_t *input_buffer[SRSLTE_MAX_PORTS]);
|
cf_t *input_buffer[SRSLTE_MAX_PORTS]);
|
||||||
|
|
||||||
SRSLTE_API void srslte_ue_sync_set_cfo(srslte_ue_sync_t *q,
|
SRSLTE_API void srslte_ue_sync_set_cfo(srslte_ue_sync_t *q,
|
||||||
|
|
|
@ -137,7 +137,7 @@ int base_init() {
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (srslte_ue_dl_init(&ue_dl, cell, 1)) {
|
if (srslte_ue_dl_init_multi(&ue_dl, cell, 1)) {
|
||||||
fprintf(stderr, "Error initializing UE DL\n");
|
fprintf(stderr, "Error initializing UE DL\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -177,7 +177,7 @@ int main(int argc, char **argv) {
|
||||||
srslte_filesource_read(&fsrc, input_buffer, flen);
|
srslte_filesource_read(&fsrc, input_buffer, flen);
|
||||||
INFO("Reading %d samples sub-frame %d\n", flen, sf_idx);
|
INFO("Reading %d samples sub-frame %d\n", flen, sf_idx);
|
||||||
|
|
||||||
ret = srslte_ue_dl_decode(&ue_dl, &input_buffer, data, sf_idx);
|
ret = srslte_ue_dl_decode(&ue_dl, input_buffer, data, sf_idx);
|
||||||
if(ret > 0) {
|
if(ret > 0) {
|
||||||
printf("PDSCH Decoded OK!\n");
|
printf("PDSCH Decoded OK!\n");
|
||||||
} else if (ret == 0) {
|
} else if (ret == 0) {
|
||||||
|
|
|
@ -103,7 +103,7 @@ int rf_mib_decoder(srslte_rf_t *rf, uint32_t nof_rx_antennas,cell_search_cfg_t *
|
||||||
srslte_ue_mib_sync_t ue_mib;
|
srslte_ue_mib_sync_t ue_mib;
|
||||||
uint8_t bch_payload[SRSLTE_BCH_PAYLOAD_LEN];
|
uint8_t bch_payload[SRSLTE_BCH_PAYLOAD_LEN];
|
||||||
|
|
||||||
if (srslte_ue_mib_sync_init(&ue_mib, cell->id, cell->cp, srslte_rf_recv_wrapper_cs, nof_rx_antennas, (void*) rf)) {
|
if (srslte_ue_mib_sync_init_multi(&ue_mib, cell->id, cell->cp, srslte_rf_recv_wrapper_cs, nof_rx_antennas, (void*) rf)) {
|
||||||
fprintf(stderr, "Error initiating srslte_ue_mib_sync\n");
|
fprintf(stderr, "Error initiating srslte_ue_mib_sync\n");
|
||||||
goto clean_exit;
|
goto clean_exit;
|
||||||
}
|
}
|
||||||
|
@ -164,7 +164,7 @@ int rf_cell_search(srslte_rf_t *rf, uint32_t nof_rx_antennas,
|
||||||
|
|
||||||
bzero(found_cells, 3*sizeof(srslte_ue_cellsearch_result_t));
|
bzero(found_cells, 3*sizeof(srslte_ue_cellsearch_result_t));
|
||||||
|
|
||||||
if (srslte_ue_cellsearch_init(&cs, config->max_frames_pss, srslte_rf_recv_wrapper_cs, nof_rx_antennas, (void*) rf)) {
|
if (srslte_ue_cellsearch_init_multi(&cs, config->max_frames_pss, srslte_rf_recv_wrapper_cs, nof_rx_antennas, (void*) rf)) {
|
||||||
fprintf(stderr, "Error initiating UE cell detect\n");
|
fprintf(stderr, "Error initiating UE cell detect\n");
|
||||||
return SRSLTE_ERROR;
|
return SRSLTE_ERROR;
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,6 +36,59 @@
|
||||||
#include "srslte/utils/vector.h"
|
#include "srslte/utils/vector.h"
|
||||||
|
|
||||||
int srslte_ue_cellsearch_init(srslte_ue_cellsearch_t * q, uint32_t max_frames,
|
int srslte_ue_cellsearch_init(srslte_ue_cellsearch_t * q, uint32_t max_frames,
|
||||||
|
int (recv_callback)(void*, void*, uint32_t,srslte_timestamp_t*),
|
||||||
|
void *stream_handler)
|
||||||
|
{
|
||||||
|
int ret = SRSLTE_ERROR_INVALID_INPUTS;
|
||||||
|
|
||||||
|
if (q != NULL) {
|
||||||
|
ret = SRSLTE_ERROR;
|
||||||
|
srslte_cell_t cell;
|
||||||
|
|
||||||
|
bzero(q, sizeof(srslte_ue_cellsearch_t));
|
||||||
|
|
||||||
|
bzero(&cell, sizeof(srslte_cell_t));
|
||||||
|
cell.id = SRSLTE_CELL_ID_UNKNOWN;
|
||||||
|
cell.nof_prb = SRSLTE_CS_NOF_PRB;
|
||||||
|
|
||||||
|
if (srslte_ue_sync_init(&q->ue_sync, cell, recv_callback, stream_handler)) {
|
||||||
|
fprintf(stderr, "Error initiating ue_sync\n");
|
||||||
|
goto clean_exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
q->sf_buffer[0] = srslte_vec_malloc(3*sizeof(cf_t)*SRSLTE_SF_LEN_PRB(100));
|
||||||
|
q->nof_rx_antennas = 1;
|
||||||
|
|
||||||
|
q->candidates = calloc(sizeof(srslte_ue_cellsearch_result_t), max_frames);
|
||||||
|
if (!q->candidates) {
|
||||||
|
perror("malloc");
|
||||||
|
goto clean_exit;
|
||||||
|
}
|
||||||
|
q->mode_ntimes = calloc(sizeof(uint32_t), max_frames);
|
||||||
|
if (!q->mode_ntimes) {
|
||||||
|
perror("malloc");
|
||||||
|
goto clean_exit;
|
||||||
|
}
|
||||||
|
q->mode_counted = calloc(sizeof(uint8_t), max_frames);
|
||||||
|
if (!q->mode_counted) {
|
||||||
|
perror("malloc");
|
||||||
|
goto clean_exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
q->max_frames = max_frames;
|
||||||
|
q->nof_valid_frames = max_frames;
|
||||||
|
|
||||||
|
ret = SRSLTE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
clean_exit:
|
||||||
|
if (ret == SRSLTE_ERROR) {
|
||||||
|
srslte_ue_cellsearch_free(q);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int srslte_ue_cellsearch_init_multi(srslte_ue_cellsearch_t * q, uint32_t max_frames,
|
||||||
int (recv_callback)(void*, cf_t*[SRSLTE_MAX_PORTS], uint32_t,srslte_timestamp_t*),
|
int (recv_callback)(void*, cf_t*[SRSLTE_MAX_PORTS], uint32_t,srslte_timestamp_t*),
|
||||||
uint32_t nof_rx_antennas,
|
uint32_t nof_rx_antennas,
|
||||||
void *stream_handler)
|
void *stream_handler)
|
||||||
|
@ -52,7 +105,7 @@ int srslte_ue_cellsearch_init(srslte_ue_cellsearch_t * q, uint32_t max_frames,
|
||||||
cell.id = SRSLTE_CELL_ID_UNKNOWN;
|
cell.id = SRSLTE_CELL_ID_UNKNOWN;
|
||||||
cell.nof_prb = SRSLTE_CS_NOF_PRB;
|
cell.nof_prb = SRSLTE_CS_NOF_PRB;
|
||||||
|
|
||||||
if (srslte_ue_sync_init(&q->ue_sync, cell, recv_callback, nof_rx_antennas, stream_handler)) {
|
if (srslte_ue_sync_init_multi(&q->ue_sync, cell, recv_callback, nof_rx_antennas, stream_handler)) {
|
||||||
fprintf(stderr, "Error initiating ue_sync\n");
|
fprintf(stderr, "Error initiating ue_sync\n");
|
||||||
goto clean_exit;
|
goto clean_exit;
|
||||||
}
|
}
|
||||||
|
@ -226,7 +279,7 @@ int srslte_ue_cellsearch_scan_N_id_2(srslte_ue_cellsearch_t * q,
|
||||||
srslte_ue_sync_reset(&q->ue_sync);
|
srslte_ue_sync_reset(&q->ue_sync);
|
||||||
do {
|
do {
|
||||||
|
|
||||||
ret = srslte_ue_sync_zerocopy(&q->ue_sync, q->sf_buffer);
|
ret = srslte_ue_sync_zerocopy_multi(&q->ue_sync, q->sf_buffer);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
fprintf(stderr, "Error calling srslte_ue_sync_work()\n");
|
fprintf(stderr, "Error calling srslte_ue_sync_work()\n");
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -44,8 +44,13 @@ const uint32_t nof_ue_formats = 2;
|
||||||
static srslte_dci_format_t common_formats[] = {SRSLTE_DCI_FORMAT1A,SRSLTE_DCI_FORMAT1C};
|
static srslte_dci_format_t common_formats[] = {SRSLTE_DCI_FORMAT1A,SRSLTE_DCI_FORMAT1C};
|
||||||
const uint32_t nof_common_formats = 2;
|
const uint32_t nof_common_formats = 2;
|
||||||
|
|
||||||
|
|
||||||
int srslte_ue_dl_init(srslte_ue_dl_t *q,
|
int srslte_ue_dl_init(srslte_ue_dl_t *q,
|
||||||
|
srslte_cell_t cell)
|
||||||
|
{
|
||||||
|
return srslte_ue_dl_init_multi(q, cell, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int srslte_ue_dl_init_multi(srslte_ue_dl_t *q,
|
||||||
srslte_cell_t cell,
|
srslte_cell_t cell,
|
||||||
uint32_t nof_rx_antennas)
|
uint32_t nof_rx_antennas)
|
||||||
{
|
{
|
||||||
|
@ -107,20 +112,25 @@ int srslte_ue_dl_init(srslte_ue_dl_t *q,
|
||||||
srslte_cfo_set_tol(&q->sfo_correct, 1e-5/q->fft.symbol_sz);
|
srslte_cfo_set_tol(&q->sfo_correct, 1e-5/q->fft.symbol_sz);
|
||||||
|
|
||||||
for (int j=0;j<nof_rx_antennas;j++) {
|
for (int j=0;j<nof_rx_antennas;j++) {
|
||||||
q->sf_symbols[j] = srslte_vec_malloc(CURRENT_SFLEN_RE * sizeof(cf_t));
|
q->sf_symbols_m[j] = srslte_vec_malloc(CURRENT_SFLEN_RE * sizeof(cf_t));
|
||||||
if (!q->sf_symbols[j]) {
|
if (!q->sf_symbols_m[j]) {
|
||||||
perror("malloc");
|
perror("malloc");
|
||||||
goto clean_exit;
|
goto clean_exit;
|
||||||
}
|
}
|
||||||
for (uint32_t i=0;i<q->cell.nof_ports;i++) {
|
for (uint32_t i=0;i<q->cell.nof_ports;i++) {
|
||||||
q->ce[i][j] = srslte_vec_malloc(CURRENT_SFLEN_RE * sizeof(cf_t));
|
q->ce_m[i][j] = srslte_vec_malloc(CURRENT_SFLEN_RE * sizeof(cf_t));
|
||||||
if (!q->ce[i][j]) {
|
if (!q->ce_m[i][j]) {
|
||||||
perror("malloc");
|
perror("malloc");
|
||||||
goto clean_exit;
|
goto clean_exit;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
q->sf_symbols = q->sf_symbols_m[0];
|
||||||
|
for (int i=0;i<q->cell.nof_ports;i++) {
|
||||||
|
q->ce[i] = q->ce_m[i][0];
|
||||||
|
}
|
||||||
|
|
||||||
ret = SRSLTE_SUCCESS;
|
ret = SRSLTE_SUCCESS;
|
||||||
} else {
|
} else {
|
||||||
fprintf(stderr, "Invalid cell properties: Id=%d, Ports=%d, PRBs=%d\n",
|
fprintf(stderr, "Invalid cell properties: Id=%d, Ports=%d, PRBs=%d\n",
|
||||||
|
@ -146,12 +156,12 @@ void srslte_ue_dl_free(srslte_ue_dl_t *q) {
|
||||||
srslte_cfo_free(&q->sfo_correct);
|
srslte_cfo_free(&q->sfo_correct);
|
||||||
srslte_softbuffer_rx_free(&q->softbuffer);
|
srslte_softbuffer_rx_free(&q->softbuffer);
|
||||||
for (int j=0;j<q->nof_rx_antennas;j++) {
|
for (int j=0;j<q->nof_rx_antennas;j++) {
|
||||||
if (q->sf_symbols[j]) {
|
if (q->sf_symbols_m[j]) {
|
||||||
free(q->sf_symbols[j]);
|
free(q->sf_symbols_m[j]);
|
||||||
}
|
}
|
||||||
for (uint32_t i=0;i<q->cell.nof_ports;i++) {
|
for (uint32_t i=0;i<q->cell.nof_ports;i++) {
|
||||||
if (q->ce[i][j]) {
|
if (q->ce_m[i][j]) {
|
||||||
free(q->ce[i][j]);
|
free(q->ce_m[i][j]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -193,23 +203,37 @@ void srslte_ue_dl_set_sample_offset(srslte_ue_dl_t * q, float sample_offset) {
|
||||||
* - PDCCH decoding: Find DCI for RNTI given by previous call to srslte_ue_dl_set_rnti()
|
* - PDCCH decoding: Find DCI for RNTI given by previous call to srslte_ue_dl_set_rnti()
|
||||||
* - PDSCH decoding: Decode TB scrambling with RNTI given by srslte_ue_dl_set_rnti()
|
* - PDSCH decoding: Decode TB scrambling with RNTI given by srslte_ue_dl_set_rnti()
|
||||||
*/
|
*/
|
||||||
int srslte_ue_dl_decode(srslte_ue_dl_t *q, cf_t *input[SRSLTE_MAX_PORTS], uint8_t *data, uint32_t tti) {
|
int srslte_ue_dl_decode(srslte_ue_dl_t *q, cf_t *input, uint8_t *data, uint32_t tti) {
|
||||||
return srslte_ue_dl_decode_rnti(q, input, data, tti, q->current_rnti);
|
cf_t *_input[SRSLTE_MAX_PORTS];
|
||||||
|
_input[0] = input;
|
||||||
|
return srslte_ue_dl_decode_rnti_multi(q, _input, data, tti, q->current_rnti);
|
||||||
}
|
}
|
||||||
|
|
||||||
int srslte_ue_dl_decode_fft_estimate(srslte_ue_dl_t *q, cf_t *input[SRSLTE_MAX_PORTS], uint32_t sf_idx, uint32_t *cfi) {
|
int srslte_ue_dl_decode_multi(srslte_ue_dl_t *q, cf_t *input[SRSLTE_MAX_PORTS], uint8_t *data, uint32_t tti) {
|
||||||
|
return srslte_ue_dl_decode_rnti_multi(q, input, data, tti, q->current_rnti);
|
||||||
|
}
|
||||||
|
|
||||||
|
int srslte_ue_dl_decode_fft_estimate(srslte_ue_dl_t *q, cf_t *input, uint32_t sf_idx, uint32_t *cfi)
|
||||||
|
{
|
||||||
|
cf_t *_input[SRSLTE_MAX_PORTS];
|
||||||
|
_input[0] = input;
|
||||||
|
return srslte_ue_dl_decode_fft_estimate_multi(q, _input, sf_idx, cfi);
|
||||||
|
}
|
||||||
|
|
||||||
|
int srslte_ue_dl_decode_fft_estimate_multi(srslte_ue_dl_t *q, cf_t *input[SRSLTE_MAX_PORTS], uint32_t sf_idx, uint32_t *cfi)
|
||||||
|
{
|
||||||
if (input && q && cfi && sf_idx < SRSLTE_NSUBFRAMES_X_FRAME) {
|
if (input && q && cfi && sf_idx < SRSLTE_NSUBFRAMES_X_FRAME) {
|
||||||
|
|
||||||
/* Run FFT for all subframe data */
|
/* Run FFT for all subframe data */
|
||||||
for (int j=0;j<q->nof_rx_antennas;j++) {
|
for (int j=0;j<q->nof_rx_antennas;j++) {
|
||||||
srslte_ofdm_rx_sf(&q->fft, input[j], q->sf_symbols[j]);
|
srslte_ofdm_rx_sf(&q->fft, input[j], q->sf_symbols_m[j]);
|
||||||
|
|
||||||
/* Correct SFO multiplying by complex exponential in the time domain */
|
/* Correct SFO multiplying by complex exponential in the time domain */
|
||||||
if (q->sample_offset) {
|
if (q->sample_offset) {
|
||||||
for (int i=0;i<2*SRSLTE_CP_NSYMB(q->cell.cp);i++) {
|
for (int i=0;i<2*SRSLTE_CP_NSYMB(q->cell.cp);i++) {
|
||||||
srslte_cfo_correct(&q->sfo_correct,
|
srslte_cfo_correct(&q->sfo_correct,
|
||||||
&q->sf_symbols[j][i*q->cell.nof_prb*SRSLTE_NRE],
|
&q->sf_symbols_m[j][i*q->cell.nof_prb*SRSLTE_NRE],
|
||||||
&q->sf_symbols[j][i*q->cell.nof_prb*SRSLTE_NRE],
|
&q->sf_symbols_m[j][i*q->cell.nof_prb*SRSLTE_NRE],
|
||||||
q->sample_offset / q->fft.symbol_sz);
|
q->sample_offset / q->fft.symbol_sz);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -225,10 +249,10 @@ int srslte_ue_dl_decode_estimate(srslte_ue_dl_t *q, uint32_t sf_idx, uint32_t *c
|
||||||
if (q && cfi && sf_idx < SRSLTE_NSUBFRAMES_X_FRAME) {
|
if (q && cfi && sf_idx < SRSLTE_NSUBFRAMES_X_FRAME) {
|
||||||
|
|
||||||
/* Get channel estimates for each port */
|
/* Get channel estimates for each port */
|
||||||
srslte_chest_dl_estimate_multi(&q->chest, q->sf_symbols, q->ce, sf_idx, q->nof_rx_antennas);
|
srslte_chest_dl_estimate_multi(&q->chest, q->sf_symbols_m, q->ce_m, sf_idx, q->nof_rx_antennas);
|
||||||
|
|
||||||
/* First decode PCFICH and obtain CFI */
|
/* First decode PCFICH and obtain CFI */
|
||||||
if (srslte_pcfich_decode_multi(&q->pcfich, q->sf_symbols, q->ce,
|
if (srslte_pcfich_decode_multi(&q->pcfich, q->sf_symbols_m, q->ce_m,
|
||||||
srslte_chest_dl_get_noise_estimate(&q->chest),
|
srslte_chest_dl_get_noise_estimate(&q->chest),
|
||||||
sf_idx, cfi, &cfi_corr)<0) {
|
sf_idx, cfi, &cfi_corr)<0) {
|
||||||
fprintf(stderr, "Error decoding PCFICH\n");
|
fprintf(stderr, "Error decoding PCFICH\n");
|
||||||
|
@ -254,7 +278,14 @@ int srslte_ue_dl_cfg_grant(srslte_ue_dl_t *q, srslte_ra_dl_grant_t *grant, uint3
|
||||||
return srslte_pdsch_cfg(&q->pdsch_cfg, q->cell, grant, cfi, sf_idx, rvidx);
|
return srslte_pdsch_cfg(&q->pdsch_cfg, q->cell, grant, cfi, sf_idx, rvidx);
|
||||||
}
|
}
|
||||||
|
|
||||||
int srslte_ue_dl_decode_rnti(srslte_ue_dl_t *q, cf_t *input[SRSLTE_MAX_PORTS], uint8_t *data, uint32_t tti, uint16_t rnti)
|
int srslte_ue_dl_decode_rnti(srslte_ue_dl_t *q, cf_t *input, uint8_t *data, uint32_t tti, uint16_t rnti)
|
||||||
|
{
|
||||||
|
cf_t *_input[SRSLTE_MAX_PORTS];
|
||||||
|
_input[0] = input;
|
||||||
|
return srslte_ue_dl_decode_rnti_multi(q, _input, data, tti, rnti);
|
||||||
|
}
|
||||||
|
|
||||||
|
int srslte_ue_dl_decode_rnti_multi(srslte_ue_dl_t *q, cf_t *input[SRSLTE_MAX_PORTS], uint8_t *data, uint32_t tti, uint16_t rnti)
|
||||||
{
|
{
|
||||||
srslte_dci_msg_t dci_msg;
|
srslte_dci_msg_t dci_msg;
|
||||||
srslte_ra_dl_dci_t dci_unpacked;
|
srslte_ra_dl_dci_t dci_unpacked;
|
||||||
|
@ -264,7 +295,7 @@ int srslte_ue_dl_decode_rnti(srslte_ue_dl_t *q, cf_t *input[SRSLTE_MAX_PORTS], u
|
||||||
|
|
||||||
uint32_t sf_idx = tti%10;
|
uint32_t sf_idx = tti%10;
|
||||||
|
|
||||||
if ((ret = srslte_ue_dl_decode_fft_estimate(q, input, sf_idx, &cfi)) < 0) {
|
if ((ret = srslte_ue_dl_decode_fft_estimate_multi(q, input, sf_idx, &cfi)) < 0) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -272,7 +303,7 @@ int srslte_ue_dl_decode_rnti(srslte_ue_dl_t *q, cf_t *input[SRSLTE_MAX_PORTS], u
|
||||||
// Uncoment next line to do ZF by default in pdsch_ue example
|
// Uncoment next line to do ZF by default in pdsch_ue example
|
||||||
//float noise_estimate = 0;
|
//float noise_estimate = 0;
|
||||||
|
|
||||||
if (srslte_pdcch_extract_llr_multi(&q->pdcch, q->sf_symbols, q->ce, noise_estimate, sf_idx, cfi)) {
|
if (srslte_pdcch_extract_llr_multi(&q->pdcch, q->sf_symbols_m, q->ce_m, noise_estimate, sf_idx, cfi)) {
|
||||||
fprintf(stderr, "Error extracting LLRs\n");
|
fprintf(stderr, "Error extracting LLRs\n");
|
||||||
return SRSLTE_ERROR;
|
return SRSLTE_ERROR;
|
||||||
}
|
}
|
||||||
|
@ -310,7 +341,7 @@ int srslte_ue_dl_decode_rnti(srslte_ue_dl_t *q, cf_t *input[SRSLTE_MAX_PORTS], u
|
||||||
|
|
||||||
if (q->pdsch_cfg.grant.mcs.mod > 0 && q->pdsch_cfg.grant.mcs.tbs >= 0) {
|
if (q->pdsch_cfg.grant.mcs.mod > 0 && q->pdsch_cfg.grant.mcs.tbs >= 0) {
|
||||||
ret = srslte_pdsch_decode_multi(&q->pdsch, &q->pdsch_cfg, &q->softbuffer,
|
ret = srslte_pdsch_decode_multi(&q->pdsch, &q->pdsch_cfg, &q->softbuffer,
|
||||||
q->sf_symbols, q->ce,
|
q->sf_symbols_m, q->ce_m,
|
||||||
noise_estimate,
|
noise_estimate,
|
||||||
rnti, data);
|
rnti, data);
|
||||||
|
|
||||||
|
@ -515,11 +546,11 @@ bool srslte_ue_dl_decode_phich(srslte_ue_dl_t *q, uint32_t sf_idx, uint32_t n_pr
|
||||||
|
|
||||||
cf_t *ce0[SRSLTE_MAX_PORTS];
|
cf_t *ce0[SRSLTE_MAX_PORTS];
|
||||||
for (int i=0;i<SRSLTE_MAX_PORTS;i++) {
|
for (int i=0;i<SRSLTE_MAX_PORTS;i++) {
|
||||||
ce0[i] = q->ce[i][0];
|
ce0[i] = q->ce_m[i][0];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (!srslte_phich_decode(&q->phich, q->sf_symbols[0], ce0, 0, ngroup, nseq, sf_idx, &ack_bit, &distance)) {
|
if (!srslte_phich_decode(&q->phich, q->sf_symbols_m[0], ce0, 0, ngroup, nseq, sf_idx, &ack_bit, &distance)) {
|
||||||
INFO("Decoded PHICH %d with distance %f\n", ack_bit, distance);
|
INFO("Decoded PHICH %d with distance %f\n", ack_bit, distance);
|
||||||
} else {
|
} else {
|
||||||
fprintf(stderr, "Error decoding PHICH\n");
|
fprintf(stderr, "Error decoding PHICH\n");
|
||||||
|
@ -533,11 +564,11 @@ bool srslte_ue_dl_decode_phich(srslte_ue_dl_t *q, uint32_t sf_idx, uint32_t n_pr
|
||||||
}
|
}
|
||||||
|
|
||||||
void srslte_ue_dl_save_signal(srslte_ue_dl_t *q, srslte_softbuffer_rx_t *softbuffer, uint32_t tti, uint32_t rv_idx, uint16_t rnti, uint32_t cfi) {
|
void srslte_ue_dl_save_signal(srslte_ue_dl_t *q, srslte_softbuffer_rx_t *softbuffer, uint32_t tti, uint32_t rv_idx, uint16_t rnti, uint32_t cfi) {
|
||||||
srslte_vec_save_file("sf_symbols", q->sf_symbols, SRSLTE_SF_LEN_RE(q->cell.nof_prb, q->cell.cp)*sizeof(cf_t));
|
srslte_vec_save_file("sf_symbols", q->sf_symbols_m, SRSLTE_SF_LEN_RE(q->cell.nof_prb, q->cell.cp)*sizeof(cf_t));
|
||||||
printf("%d samples\n", SRSLTE_SF_LEN_RE(q->cell.nof_prb, q->cell.cp));
|
printf("%d samples\n", SRSLTE_SF_LEN_RE(q->cell.nof_prb, q->cell.cp));
|
||||||
srslte_vec_save_file("ce0", q->ce[0], SRSLTE_SF_LEN_RE(q->cell.nof_prb, q->cell.cp)*sizeof(cf_t));
|
srslte_vec_save_file("ce0", q->ce_m[0], SRSLTE_SF_LEN_RE(q->cell.nof_prb, q->cell.cp)*sizeof(cf_t));
|
||||||
if (q->cell.nof_ports > 1) {
|
if (q->cell.nof_ports > 1) {
|
||||||
srslte_vec_save_file("ce1", q->ce[1], SRSLTE_SF_LEN_RE(q->cell.nof_prb, q->cell.cp)*sizeof(cf_t));
|
srslte_vec_save_file("ce1", q->ce_m[1], SRSLTE_SF_LEN_RE(q->cell.nof_prb, q->cell.cp)*sizeof(cf_t));
|
||||||
}
|
}
|
||||||
srslte_vec_save_file("pcfich_ce0", q->pcfich.ce[0], q->pcfich.nof_symbols*sizeof(cf_t));
|
srslte_vec_save_file("pcfich_ce0", q->pcfich.ce[0], q->pcfich.nof_symbols*sizeof(cf_t));
|
||||||
srslte_vec_save_file("pcfich_ce1", q->pcfich.ce[1], q->pcfich.nof_symbols*sizeof(cf_t));
|
srslte_vec_save_file("pcfich_ce1", q->pcfich.ce[1], q->pcfich.nof_symbols*sizeof(cf_t));
|
||||||
|
|
|
@ -161,9 +161,36 @@ int srslte_ue_mib_decode(srslte_ue_mib_t * q, cf_t *input,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int srslte_ue_mib_sync_init(srslte_ue_mib_sync_t *q,
|
int srslte_ue_mib_sync_init(srslte_ue_mib_sync_t *q,
|
||||||
|
uint32_t cell_id,
|
||||||
|
srslte_cp_t cp,
|
||||||
|
int (recv_callback)(void*, void*, uint32_t, srslte_timestamp_t*),
|
||||||
|
void *stream_handler)
|
||||||
|
{
|
||||||
|
srslte_cell_t cell;
|
||||||
|
// If the ports are set to 0, ue_mib goes through 1, 2 and 4 ports to blindly detect nof_ports
|
||||||
|
cell.nof_ports = 0;
|
||||||
|
cell.id = cell_id;
|
||||||
|
cell.cp = cp;
|
||||||
|
cell.nof_prb = SRSLTE_UE_MIB_NOF_PRB;
|
||||||
|
|
||||||
|
q->sf_buffer[0] = srslte_vec_malloc(3*sizeof(cf_t)*SRSLTE_SF_LEN_PRB(cell.nof_prb));
|
||||||
|
q->nof_rx_antennas = 1;
|
||||||
|
|
||||||
|
if (srslte_ue_mib_init(&q->ue_mib, cell)) {
|
||||||
|
fprintf(stderr, "Error initiating ue_mib\n");
|
||||||
|
return SRSLTE_ERROR;
|
||||||
|
}
|
||||||
|
if (srslte_ue_sync_init(&q->ue_sync, cell, recv_callback, stream_handler)) {
|
||||||
|
fprintf(stderr, "Error initiating ue_sync\n");
|
||||||
|
srslte_ue_mib_free(&q->ue_mib);
|
||||||
|
return SRSLTE_ERROR;
|
||||||
|
}
|
||||||
|
srslte_ue_sync_decode_sss_on_track(&q->ue_sync, true);
|
||||||
|
return SRSLTE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
int srslte_ue_mib_sync_init_multi(srslte_ue_mib_sync_t *q,
|
||||||
uint32_t cell_id,
|
uint32_t cell_id,
|
||||||
srslte_cp_t cp,
|
srslte_cp_t cp,
|
||||||
int (recv_callback)(void*, cf_t*[SRSLTE_MAX_PORTS], uint32_t, srslte_timestamp_t*),
|
int (recv_callback)(void*, cf_t*[SRSLTE_MAX_PORTS], uint32_t, srslte_timestamp_t*),
|
||||||
|
@ -186,7 +213,7 @@ int srslte_ue_mib_sync_init(srslte_ue_mib_sync_t *q,
|
||||||
fprintf(stderr, "Error initiating ue_mib\n");
|
fprintf(stderr, "Error initiating ue_mib\n");
|
||||||
return SRSLTE_ERROR;
|
return SRSLTE_ERROR;
|
||||||
}
|
}
|
||||||
if (srslte_ue_sync_init(&q->ue_sync, cell, recv_callback, nof_rx_antennas, stream_handler)) {
|
if (srslte_ue_sync_init_multi(&q->ue_sync, cell, recv_callback, nof_rx_antennas, stream_handler)) {
|
||||||
fprintf(stderr, "Error initiating ue_sync\n");
|
fprintf(stderr, "Error initiating ue_sync\n");
|
||||||
srslte_ue_mib_free(&q->ue_mib);
|
srslte_ue_mib_free(&q->ue_mib);
|
||||||
return SRSLTE_ERROR;
|
return SRSLTE_ERROR;
|
||||||
|
@ -226,7 +253,7 @@ int srslte_ue_mib_sync_decode(srslte_ue_mib_sync_t * q,
|
||||||
ret = SRSLTE_SUCCESS;
|
ret = SRSLTE_SUCCESS;
|
||||||
do {
|
do {
|
||||||
mib_ret = SRSLTE_UE_MIB_NOTFOUND;
|
mib_ret = SRSLTE_UE_MIB_NOTFOUND;
|
||||||
ret = srslte_ue_sync_zerocopy(&q->ue_sync, q->sf_buffer);
|
ret = srslte_ue_sync_zerocopy_multi(&q->ue_sync, q->sf_buffer);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
fprintf(stderr, "Error calling srslte_ue_sync_work()\n");
|
fprintf(stderr, "Error calling srslte_ue_sync_work()\n");
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -106,7 +106,22 @@ int srslte_ue_sync_start_agc(srslte_ue_sync_t *q, double (set_gain_callback)(voi
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int recv_callback_multi_to_single(void *h, cf_t *x[SRSLTE_MAX_PORTS], uint32_t nsamples, srslte_timestamp_t*t)
|
||||||
|
{
|
||||||
|
srslte_ue_sync_t *q = (srslte_ue_sync_t*) h;
|
||||||
|
return q->recv_callback_single(q->stream, (void*) x[0], nsamples, t);
|
||||||
|
}
|
||||||
|
|
||||||
int srslte_ue_sync_init(srslte_ue_sync_t *q,
|
int srslte_ue_sync_init(srslte_ue_sync_t *q,
|
||||||
|
srslte_cell_t cell,
|
||||||
|
int (recv_callback)(void*, void*, uint32_t,srslte_timestamp_t*),
|
||||||
|
void *stream_handler)
|
||||||
|
{
|
||||||
|
q->recv_callback_single = recv_callback;
|
||||||
|
return srslte_ue_sync_init_multi(q, cell, recv_callback_multi_to_single, 1, q);
|
||||||
|
}
|
||||||
|
|
||||||
|
int srslte_ue_sync_init_multi(srslte_ue_sync_t *q,
|
||||||
srslte_cell_t cell,
|
srslte_cell_t cell,
|
||||||
int (recv_callback)(void*, cf_t*[SRSLTE_MAX_PORTS], uint32_t,srslte_timestamp_t*),
|
int (recv_callback)(void*, cf_t*[SRSLTE_MAX_PORTS], uint32_t,srslte_timestamp_t*),
|
||||||
uint32_t nof_rx_antennas,
|
uint32_t nof_rx_antennas,
|
||||||
|
@ -459,8 +474,14 @@ static int receive_samples(srslte_ue_sync_t *q, cf_t *input_buffer[SRSLTE_MAX_PO
|
||||||
|
|
||||||
bool first_track = true;
|
bool first_track = true;
|
||||||
|
|
||||||
|
int srslte_ue_sync_zerocopy(srslte_ue_sync_t *q, cf_t *input_buffer) {
|
||||||
|
cf_t *_input_buffer[SRSLTE_MAX_PORTS];
|
||||||
|
_input_buffer[0] = input_buffer;
|
||||||
|
return srslte_ue_sync_zerocopy_multi(q, _input_buffer);
|
||||||
|
}
|
||||||
|
|
||||||
/* Returns 1 if the subframe is synchronized in time, 0 otherwise */
|
/* Returns 1 if the subframe is synchronized in time, 0 otherwise */
|
||||||
int srslte_ue_sync_zerocopy(srslte_ue_sync_t *q, cf_t *input_buffer[SRSLTE_MAX_PORTS]) {
|
int srslte_ue_sync_zerocopy_multi(srslte_ue_sync_t *q, cf_t *input_buffer[SRSLTE_MAX_PORTS]) {
|
||||||
int ret = SRSLTE_ERROR_INVALID_INPUTS;
|
int ret = SRSLTE_ERROR_INVALID_INPUTS;
|
||||||
uint32_t track_idx;
|
uint32_t track_idx;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue