mirror of https://github.com/PentHertz/srsLTE.git
added multi antenna to phich, pcfich, set rxant constant tto max ports
This commit is contained in:
parent
54d4d48f96
commit
5de9fa6a46
|
@ -129,7 +129,7 @@ void sig_int_handler(int signo)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int srslte_rf_recv_wrapper(void *h, cf_t *data[SRSLTE_MAX_RXANT], uint32_t nsamples, srslte_timestamp_t *q) {
|
int srslte_rf_recv_wrapper(void *h, cf_t *data[SRSLTE_MAX_PORTS], uint32_t nsamples, srslte_timestamp_t *q) {
|
||||||
DEBUG(" ---- Receive %d samples ---- \n", nsamples);
|
DEBUG(" ---- Receive %d samples ---- \n", nsamples);
|
||||||
|
|
||||||
return srslte_rf_recv(h, data[0], nsamples, 1);
|
return srslte_rf_recv(h, data[0], nsamples, 1);
|
||||||
|
@ -142,7 +142,7 @@ enum receiver_state { DECODE_MIB, DECODE_SIB, MEASURE} state;
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
int ret;
|
int ret;
|
||||||
cf_t *sf_buffer[SRSLTE_MAX_RXANT] = {NULL, NULL};
|
cf_t *sf_buffer[SRSLTE_MAX_PORTS] = {NULL, NULL};
|
||||||
prog_args_t prog_args;
|
prog_args_t prog_args;
|
||||||
srslte_cell_t cell;
|
srslte_cell_t cell;
|
||||||
int64_t sf_cnt;
|
int64_t sf_cnt;
|
||||||
|
|
|
@ -120,10 +120,10 @@ void parse_args(int argc, char **argv) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int srslte_rf_recv_wrapper(void *h, cf_t *data[SRSLTE_MAX_RXANT], uint32_t nsamples, srslte_timestamp_t *t) {
|
int srslte_rf_recv_wrapper(void *h, cf_t *data[SRSLTE_MAX_PORTS], uint32_t nsamples, srslte_timestamp_t *t) {
|
||||||
DEBUG(" ---- Receive %d samples ---- \n", nsamples);
|
DEBUG(" ---- Receive %d samples ---- \n", nsamples);
|
||||||
void *ptr[SRSLTE_MAX_RXANT];
|
void *ptr[SRSLTE_MAX_PORTS];
|
||||||
for (int i=0;i<SRSLTE_MAX_RXANT;i++) {
|
for (int i=0;i<SRSLTE_MAX_PORTS;i++) {
|
||||||
ptr[i] = data[i];
|
ptr[i] = data[i];
|
||||||
}
|
}
|
||||||
return srslte_rf_recv_with_time_multi((srslte_rf_t*) h, ptr, nsamples, 1, NULL, NULL);
|
return srslte_rf_recv_with_time_multi((srslte_rf_t*) h, ptr, nsamples, 1, NULL, NULL);
|
||||||
|
|
|
@ -260,10 +260,10 @@ void sig_int_handler(int signo)
|
||||||
cf_t *sf_buffer[2] = {NULL, NULL};
|
cf_t *sf_buffer[2] = {NULL, NULL};
|
||||||
|
|
||||||
#ifndef DISABLE_RF
|
#ifndef DISABLE_RF
|
||||||
int srslte_rf_recv_wrapper(void *h, cf_t *data[SRSLTE_MAX_RXANT], uint32_t nsamples, srslte_timestamp_t *t) {
|
int srslte_rf_recv_wrapper(void *h, cf_t *data[SRSLTE_MAX_PORTS], uint32_t nsamples, srslte_timestamp_t *t) {
|
||||||
DEBUG(" ---- Receive %d samples ---- \n", nsamples);
|
DEBUG(" ---- Receive %d samples ---- \n", nsamples);
|
||||||
void *ptr[SRSLTE_MAX_RXANT];
|
void *ptr[SRSLTE_MAX_PORTS];
|
||||||
for (int i=0;i<SRSLTE_MAX_RXANT;i++) {
|
for (int i=0;i<SRSLTE_MAX_PORTS;i++) {
|
||||||
ptr[i] = data[i];
|
ptr[i] = data[i];
|
||||||
}
|
}
|
||||||
return srslte_rf_recv_with_time_multi(h, ptr, nsamples, true, NULL, NULL);
|
return srslte_rf_recv_with_time_multi(h, ptr, nsamples, true, NULL, NULL);
|
||||||
|
|
|
@ -98,13 +98,13 @@ void parse_args(int argc, char **argv) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int srslte_rf_recv_wrapper(void *h, cf_t *data[SRSLTE_MAX_RXANT], uint32_t nsamples, srslte_timestamp_t *t) {
|
int srslte_rf_recv_wrapper(void *h, cf_t *data[SRSLTE_MAX_PORTS], uint32_t nsamples, srslte_timestamp_t *t) {
|
||||||
DEBUG(" ---- Receive %d samples ---- \n", nsamples);
|
DEBUG(" ---- Receive %d samples ---- \n", nsamples);
|
||||||
return srslte_rf_recv(h, data[2], nsamples, 1);
|
return srslte_rf_recv(h, data[2], nsamples, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
cf_t *buffer[SRSLTE_MAX_RXANT] = {NULL, NULL};
|
cf_t *buffer[SRSLTE_MAX_PORTS] = {NULL, NULL};
|
||||||
int n;
|
int n;
|
||||||
srslte_rf_t rf;
|
srslte_rf_t rf;
|
||||||
srslte_filesink_t sink;
|
srslte_filesink_t sink;
|
||||||
|
|
|
@ -76,9 +76,9 @@ typedef struct {
|
||||||
srslte_interp_linsrslte_vec_t srslte_interp_linvec;
|
srslte_interp_linsrslte_vec_t srslte_interp_linvec;
|
||||||
srslte_interp_lin_t srslte_interp_lin;
|
srslte_interp_lin_t srslte_interp_lin;
|
||||||
|
|
||||||
float rssi[SRSLTE_MAX_RXANT][SRSLTE_MAX_PORTS];
|
float rssi[SRSLTE_MAX_PORTS][SRSLTE_MAX_PORTS];
|
||||||
float rsrp[SRSLTE_MAX_RXANT][SRSLTE_MAX_PORTS];
|
float rsrp[SRSLTE_MAX_PORTS][SRSLTE_MAX_PORTS];
|
||||||
float noise_estimate[SRSLTE_MAX_RXANT][SRSLTE_MAX_PORTS];
|
float noise_estimate[SRSLTE_MAX_PORTS][SRSLTE_MAX_PORTS];
|
||||||
|
|
||||||
/* Use PSS for noise estimation in LS linear interpolation mode */
|
/* Use PSS for noise estimation in LS linear interpolation mode */
|
||||||
cf_t pss_signal[SRSLTE_PSS_LEN];
|
cf_t pss_signal[SRSLTE_PSS_LEN];
|
||||||
|
@ -107,8 +107,8 @@ SRSLTE_API void srslte_chest_dl_set_noise_alg(srslte_chest_dl_t *q,
|
||||||
srslte_chest_dl_noise_alg_t noise_estimation_alg);
|
srslte_chest_dl_noise_alg_t noise_estimation_alg);
|
||||||
|
|
||||||
SRSLTE_API int srslte_chest_dl_estimate_multi(srslte_chest_dl_t *q,
|
SRSLTE_API int srslte_chest_dl_estimate_multi(srslte_chest_dl_t *q,
|
||||||
cf_t *input[SRSLTE_MAX_RXANT],
|
cf_t *input[SRSLTE_MAX_PORTS],
|
||||||
cf_t *ce[SRSLTE_MAX_PORTS][SRSLTE_MAX_RXANT],
|
cf_t *ce[SRSLTE_MAX_PORTS][SRSLTE_MAX_PORTS],
|
||||||
uint32_t sf_idx,
|
uint32_t sf_idx,
|
||||||
uint32_t nof_rx_antennas);
|
uint32_t nof_rx_antennas);
|
||||||
|
|
||||||
|
|
|
@ -49,7 +49,6 @@
|
||||||
|
|
||||||
#define SRSLTE_PC_MAX 23 // Maximum TX power for Category 1 UE (in dBm)
|
#define SRSLTE_PC_MAX 23 // Maximum TX power for Category 1 UE (in dBm)
|
||||||
|
|
||||||
#define SRSLTE_MAX_RXANT 2
|
|
||||||
#define SRSLTE_MAX_PORTS 4
|
#define SRSLTE_MAX_PORTS 4
|
||||||
#define SRSLTE_MAX_LAYERS 4
|
#define SRSLTE_MAX_LAYERS 4
|
||||||
#define SRSLTE_MAX_CODEWORDS 2
|
#define SRSLTE_MAX_CODEWORDS 2
|
||||||
|
|
|
@ -70,8 +70,8 @@ SRSLTE_API int srslte_predecoding_single(cf_t *y,
|
||||||
int nof_symbols,
|
int nof_symbols,
|
||||||
float noise_estimate);
|
float noise_estimate);
|
||||||
|
|
||||||
SRSLTE_API int srslte_predecoding_single_multi(cf_t *y[SRSLTE_MAX_RXANT],
|
SRSLTE_API int srslte_predecoding_single_multi(cf_t *y[SRSLTE_MAX_PORTS],
|
||||||
cf_t *h[SRSLTE_MAX_RXANT],
|
cf_t *h[SRSLTE_MAX_PORTS],
|
||||||
cf_t *x,
|
cf_t *x,
|
||||||
int nof_rxant,
|
int nof_rxant,
|
||||||
int nof_symbols,
|
int nof_symbols,
|
||||||
|
@ -83,8 +83,8 @@ SRSLTE_API int srslte_predecoding_diversity(cf_t *y,
|
||||||
int nof_ports,
|
int nof_ports,
|
||||||
int nof_symbols);
|
int nof_symbols);
|
||||||
|
|
||||||
SRSLTE_API int srslte_predecoding_diversity_multi(cf_t *y[SRSLTE_MAX_RXANT],
|
SRSLTE_API int srslte_predecoding_diversity_multi(cf_t *y[SRSLTE_MAX_PORTS],
|
||||||
cf_t *h[SRSLTE_MAX_PORTS][SRSLTE_MAX_RXANT],
|
cf_t *h[SRSLTE_MAX_PORTS][SRSLTE_MAX_PORTS],
|
||||||
cf_t *x[SRSLTE_MAX_LAYERS],
|
cf_t *x[SRSLTE_MAX_LAYERS],
|
||||||
int nof_rxant,
|
int nof_rxant,
|
||||||
int nof_ports,
|
int nof_ports,
|
||||||
|
|
|
@ -51,12 +51,14 @@
|
||||||
typedef struct SRSLTE_API {
|
typedef struct SRSLTE_API {
|
||||||
srslte_cell_t cell;
|
srslte_cell_t cell;
|
||||||
int nof_symbols;
|
int nof_symbols;
|
||||||
|
|
||||||
|
uint32_t nof_rx_antennas;
|
||||||
|
|
||||||
/* handler to REGs resource mapper */
|
/* handler to REGs resource mapper */
|
||||||
srslte_regs_t *regs;
|
srslte_regs_t *regs;
|
||||||
|
|
||||||
/* buffers */
|
/* buffers */
|
||||||
cf_t ce[SRSLTE_MAX_PORTS][PCFICH_RE];
|
cf_t ce[SRSLTE_MAX_PORTS][SRSLTE_MAX_PORTS][PCFICH_RE];
|
||||||
cf_t symbols[SRSLTE_MAX_PORTS][PCFICH_RE];
|
cf_t symbols[SRSLTE_MAX_PORTS][PCFICH_RE];
|
||||||
cf_t x[SRSLTE_MAX_PORTS][PCFICH_RE];
|
cf_t x[SRSLTE_MAX_PORTS][PCFICH_RE];
|
||||||
cf_t d[PCFICH_RE];
|
cf_t d[PCFICH_RE];
|
||||||
|
@ -80,6 +82,11 @@ SRSLTE_API int srslte_pcfich_init(srslte_pcfich_t *q,
|
||||||
srslte_regs_t *regs,
|
srslte_regs_t *regs,
|
||||||
srslte_cell_t cell);
|
srslte_cell_t cell);
|
||||||
|
|
||||||
|
SRSLTE_API int srslte_pcfich_init_multi(srslte_pcfich_t *q,
|
||||||
|
srslte_regs_t *regs,
|
||||||
|
srslte_cell_t cell,
|
||||||
|
uint32_t nof_rx_antennas);
|
||||||
|
|
||||||
SRSLTE_API void srslte_pcfich_free(srslte_pcfich_t *q);
|
SRSLTE_API void srslte_pcfich_free(srslte_pcfich_t *q);
|
||||||
|
|
||||||
SRSLTE_API int srslte_pcfich_decode(srslte_pcfich_t *q,
|
SRSLTE_API int srslte_pcfich_decode(srslte_pcfich_t *q,
|
||||||
|
@ -90,6 +97,14 @@ SRSLTE_API int srslte_pcfich_decode(srslte_pcfich_t *q,
|
||||||
uint32_t *cfi,
|
uint32_t *cfi,
|
||||||
float *corr_result);
|
float *corr_result);
|
||||||
|
|
||||||
|
SRSLTE_API int srslte_pcfich_decode_multi(srslte_pcfich_t *q,
|
||||||
|
cf_t *sf_symbols[SRSLTE_MAX_PORTS],
|
||||||
|
cf_t *ce[SRSLTE_MAX_PORTS][SRSLTE_MAX_PORTS],
|
||||||
|
float noise_estimate,
|
||||||
|
uint32_t subframe,
|
||||||
|
uint32_t *cfi,
|
||||||
|
float *corr_result);
|
||||||
|
|
||||||
SRSLTE_API int srslte_pcfich_encode(srslte_pcfich_t *q,
|
SRSLTE_API int srslte_pcfich_encode(srslte_pcfich_t *q,
|
||||||
uint32_t cfi,
|
uint32_t cfi,
|
||||||
cf_t *sf_symbols[SRSLTE_MAX_PORTS],
|
cf_t *sf_symbols[SRSLTE_MAX_PORTS],
|
||||||
|
|
|
@ -68,8 +68,8 @@ typedef struct SRSLTE_API {
|
||||||
srslte_regs_t *regs;
|
srslte_regs_t *regs;
|
||||||
|
|
||||||
/* buffers */
|
/* buffers */
|
||||||
cf_t *ce[SRSLTE_MAX_PORTS][SRSLTE_MAX_RXANT];
|
cf_t *ce[SRSLTE_MAX_PORTS][SRSLTE_MAX_PORTS];
|
||||||
cf_t *symbols[SRSLTE_MAX_RXANT];
|
cf_t *symbols[SRSLTE_MAX_PORTS];
|
||||||
cf_t *x[SRSLTE_MAX_PORTS];
|
cf_t *x[SRSLTE_MAX_PORTS];
|
||||||
cf_t *d;
|
cf_t *d;
|
||||||
uint8_t *e;
|
uint8_t *e;
|
||||||
|
@ -120,8 +120,8 @@ SRSLTE_API int srslte_pdcch_extract_llr(srslte_pdcch_t *q,
|
||||||
uint32_t cfi);
|
uint32_t cfi);
|
||||||
|
|
||||||
SRSLTE_API int srslte_pdcch_extract_llr_multi(srslte_pdcch_t *q,
|
SRSLTE_API int srslte_pdcch_extract_llr_multi(srslte_pdcch_t *q,
|
||||||
cf_t *sf_symbols[SRSLTE_MAX_RXANT],
|
cf_t *sf_symbols[SRSLTE_MAX_PORTS],
|
||||||
cf_t *ce[SRSLTE_MAX_PORTS][SRSLTE_MAX_RXANT],
|
cf_t *ce[SRSLTE_MAX_PORTS][SRSLTE_MAX_PORTS],
|
||||||
float noise_estimate,
|
float noise_estimate,
|
||||||
uint32_t nsubframe,
|
uint32_t nsubframe,
|
||||||
uint32_t cfi);
|
uint32_t cfi);
|
||||||
|
|
|
@ -61,8 +61,8 @@ typedef struct SRSLTE_API {
|
||||||
|
|
||||||
/* buffers */
|
/* buffers */
|
||||||
// void buffers are shared for tx and rx
|
// void buffers are shared for tx and rx
|
||||||
cf_t *ce[SRSLTE_MAX_PORTS][SRSLTE_MAX_RXANT];
|
cf_t *ce[SRSLTE_MAX_PORTS][SRSLTE_MAX_PORTS];
|
||||||
cf_t *symbols[SRSLTE_MAX_RXANT];
|
cf_t *symbols[SRSLTE_MAX_PORTS];
|
||||||
cf_t *x[SRSLTE_MAX_PORTS];
|
cf_t *x[SRSLTE_MAX_PORTS];
|
||||||
cf_t *d;
|
cf_t *d;
|
||||||
void *e;
|
void *e;
|
||||||
|
@ -121,8 +121,8 @@ SRSLTE_API int srslte_pdsch_decode(srslte_pdsch_t *q,
|
||||||
SRSLTE_API int srslte_pdsch_decode_multi(srslte_pdsch_t *q,
|
SRSLTE_API int srslte_pdsch_decode_multi(srslte_pdsch_t *q,
|
||||||
srslte_pdsch_cfg_t *cfg,
|
srslte_pdsch_cfg_t *cfg,
|
||||||
srslte_softbuffer_rx_t *softbuffer,
|
srslte_softbuffer_rx_t *softbuffer,
|
||||||
cf_t *sf_symbols[SRSLTE_MAX_RXANT],
|
cf_t *sf_symbols[SRSLTE_MAX_PORTS],
|
||||||
cf_t *ce[SRSLTE_MAX_PORTS][SRSLTE_MAX_RXANT],
|
cf_t *ce[SRSLTE_MAX_PORTS][SRSLTE_MAX_PORTS],
|
||||||
float noise_estimate,
|
float noise_estimate,
|
||||||
uint16_t rnti,
|
uint16_t rnti,
|
||||||
uint8_t *data);
|
uint8_t *data);
|
||||||
|
|
|
@ -62,12 +62,14 @@
|
||||||
typedef struct SRSLTE_API {
|
typedef struct SRSLTE_API {
|
||||||
srslte_cell_t cell;
|
srslte_cell_t cell;
|
||||||
|
|
||||||
|
uint32_t nof_rx_antennas;
|
||||||
|
|
||||||
/* handler to REGs resource mapper */
|
/* handler to REGs resource mapper */
|
||||||
srslte_regs_t *regs;
|
srslte_regs_t *regs;
|
||||||
|
|
||||||
/* buffers */
|
/* buffers */
|
||||||
cf_t ce[SRSLTE_MAX_PORTS][SRSLTE_PHICH_MAX_NSYMB];
|
cf_t ce[SRSLTE_MAX_PORTS][SRSLTE_MAX_PORTS][SRSLTE_PHICH_MAX_NSYMB];
|
||||||
cf_t symbols[SRSLTE_MAX_PORTS][SRSLTE_PHICH_MAX_NSYMB];
|
cf_t sf_symbols[SRSLTE_MAX_PORTS][SRSLTE_PHICH_MAX_NSYMB];
|
||||||
cf_t x[SRSLTE_MAX_PORTS][SRSLTE_PHICH_MAX_NSYMB];
|
cf_t x[SRSLTE_MAX_PORTS][SRSLTE_PHICH_MAX_NSYMB];
|
||||||
cf_t d[SRSLTE_PHICH_MAX_NSYMB];
|
cf_t d[SRSLTE_PHICH_MAX_NSYMB];
|
||||||
cf_t d0[SRSLTE_PHICH_MAX_NSYMB];
|
cf_t d0[SRSLTE_PHICH_MAX_NSYMB];
|
||||||
|
@ -87,6 +89,11 @@ SRSLTE_API int srslte_phich_init(srslte_phich_t *q,
|
||||||
srslte_regs_t *regs,
|
srslte_regs_t *regs,
|
||||||
srslte_cell_t cell);
|
srslte_cell_t cell);
|
||||||
|
|
||||||
|
SRSLTE_API int srslte_phich_init_multi(srslte_phich_t *q,
|
||||||
|
srslte_regs_t *regs,
|
||||||
|
srslte_cell_t cell,
|
||||||
|
uint32_t nof_rx_antennas);
|
||||||
|
|
||||||
SRSLTE_API void srslte_phich_free(srslte_phich_t *q);
|
SRSLTE_API void srslte_phich_free(srslte_phich_t *q);
|
||||||
|
|
||||||
SRSLTE_API void srslte_phich_calc(srslte_phich_t *q,
|
SRSLTE_API void srslte_phich_calc(srslte_phich_t *q,
|
||||||
|
@ -105,6 +112,16 @@ SRSLTE_API int srslte_phich_decode(srslte_phich_t *q,
|
||||||
uint8_t *ack,
|
uint8_t *ack,
|
||||||
float *distance);
|
float *distance);
|
||||||
|
|
||||||
|
SRSLTE_API int srslte_phich_decode_multi(srslte_phich_t *q,
|
||||||
|
cf_t *slot_symbols[SRSLTE_MAX_PORTS],
|
||||||
|
cf_t *ce[SRSLTE_MAX_PORTS][SRSLTE_MAX_PORTS],
|
||||||
|
float noise_estimate,
|
||||||
|
uint32_t ngroup,
|
||||||
|
uint32_t nseq,
|
||||||
|
uint32_t nsubframe,
|
||||||
|
uint8_t *ack,
|
||||||
|
float *distance);
|
||||||
|
|
||||||
SRSLTE_API int srslte_phich_encode(srslte_phich_t *q,
|
SRSLTE_API int srslte_phich_encode(srslte_phich_t *q,
|
||||||
uint8_t ack,
|
uint8_t ack,
|
||||||
uint32_t ngroup,
|
uint32_t ngroup,
|
||||||
|
|
|
@ -69,7 +69,7 @@ typedef struct SRSLTE_API {
|
||||||
typedef struct SRSLTE_API {
|
typedef struct SRSLTE_API {
|
||||||
srslte_ue_sync_t ue_sync;
|
srslte_ue_sync_t ue_sync;
|
||||||
|
|
||||||
cf_t *sf_buffer[SRSLTE_MAX_RXANT];
|
cf_t *sf_buffer[SRSLTE_MAX_PORTS];
|
||||||
uint32_t nof_rx_antennas;
|
uint32_t nof_rx_antennas;
|
||||||
|
|
||||||
uint32_t max_frames;
|
uint32_t max_frames;
|
||||||
|
@ -83,7 +83,7 @@ typedef struct SRSLTE_API {
|
||||||
|
|
||||||
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,
|
uint32_t max_frames_total,
|
||||||
int (recv_callback)(void*, cf_t*[SRSLTE_MAX_RXANT], 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);
|
||||||
|
|
||||||
|
|
|
@ -90,8 +90,8 @@ typedef struct SRSLTE_API {
|
||||||
|
|
||||||
uint32_t nof_rx_antennas;
|
uint32_t nof_rx_antennas;
|
||||||
|
|
||||||
cf_t *sf_symbols[SRSLTE_MAX_RXANT];
|
cf_t *sf_symbols[SRSLTE_MAX_PORTS];
|
||||||
cf_t *ce[SRSLTE_MAX_PORTS][SRSLTE_MAX_RXANT];
|
cf_t *ce[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;
|
||||||
|
@ -118,7 +118,7 @@ SRSLTE_API int srslte_ue_dl_init(srslte_ue_dl_t *q,
|
||||||
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[SRSLTE_MAX_RXANT],
|
cf_t *input[SRSLTE_MAX_PORTS],
|
||||||
uint32_t sf_idx,
|
uint32_t sf_idx,
|
||||||
uint32_t *cfi);
|
uint32_t *cfi);
|
||||||
|
|
||||||
|
@ -157,12 +157,12 @@ 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[SRSLTE_MAX_RXANT],
|
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[SRSLTE_MAX_RXANT],
|
cf_t *input[SRSLTE_MAX_PORTS],
|
||||||
uint8_t *data,
|
uint8_t *data,
|
||||||
uint32_t tti,
|
uint32_t tti,
|
||||||
uint16_t rnti);
|
uint16_t rnti);
|
||||||
|
|
|
@ -100,14 +100,14 @@ SRSLTE_API int srslte_ue_mib_decode(srslte_ue_mib_t * q,
|
||||||
typedef struct {
|
typedef struct {
|
||||||
srslte_ue_mib_t ue_mib;
|
srslte_ue_mib_t ue_mib;
|
||||||
srslte_ue_sync_t ue_sync;
|
srslte_ue_sync_t ue_sync;
|
||||||
cf_t *sf_buffer[SRSLTE_MAX_RXANT];
|
cf_t *sf_buffer[SRSLTE_MAX_PORTS];
|
||||||
uint32_t nof_rx_antennas;
|
uint32_t nof_rx_antennas;
|
||||||
} 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,
|
uint32_t cell_id,
|
||||||
srslte_cp_t cp,
|
srslte_cp_t cp,
|
||||||
int (recv_callback)(void*, cf_t*[SRSLTE_MAX_RXANT], 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);
|
||||||
|
|
||||||
|
|
|
@ -75,7 +75,7 @@ typedef struct SRSLTE_API {
|
||||||
uint32_t agc_period;
|
uint32_t agc_period;
|
||||||
|
|
||||||
void *stream;
|
void *stream;
|
||||||
int (*recv_callback)(void*, cf_t*[SRSLTE_MAX_RXANT], uint32_t, srslte_timestamp_t*);
|
int (*recv_callback)(void*, cf_t*[SRSLTE_MAX_PORTS], 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;
|
||||||
|
@ -124,7 +124,7 @@ typedef struct SRSLTE_API {
|
||||||
|
|
||||||
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,
|
srslte_cell_t cell,
|
||||||
int (recv_callback)(void*, cf_t*[SRSLTE_MAX_RXANT], 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);
|
||||||
|
|
||||||
|
@ -147,7 +147,7 @@ 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_MAX_RXANT]);
|
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,
|
||||||
float cfo);
|
float cfo);
|
||||||
|
|
|
@ -354,7 +354,7 @@ int srslte_chest_dl_estimate_port(srslte_chest_dl_t *q, cf_t *input, cf_t *ce, u
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int srslte_chest_dl_estimate_multi(srslte_chest_dl_t *q, cf_t *input[SRSLTE_MAX_RXANT], cf_t *ce[SRSLTE_MAX_PORTS][SRSLTE_MAX_RXANT], uint32_t sf_idx, uint32_t nof_rx_antennas)
|
int srslte_chest_dl_estimate_multi(srslte_chest_dl_t *q, cf_t *input[SRSLTE_MAX_PORTS], cf_t *ce[SRSLTE_MAX_PORTS][SRSLTE_MAX_PORTS], uint32_t sf_idx, uint32_t nof_rx_antennas)
|
||||||
{
|
{
|
||||||
for (uint32_t rxant_id=0;rxant_id<nof_rx_antennas;rxant_id++) {
|
for (uint32_t rxant_id=0;rxant_id<nof_rx_antennas;rxant_id++) {
|
||||||
for (uint32_t port_id=0;port_id<q->cell.nof_ports;port_id++) {
|
for (uint32_t port_id=0;port_id<q->cell.nof_ports;port_id++) {
|
||||||
|
|
|
@ -37,13 +37,13 @@
|
||||||
#ifdef LV_HAVE_SSE
|
#ifdef LV_HAVE_SSE
|
||||||
#include <xmmintrin.h>
|
#include <xmmintrin.h>
|
||||||
#include <pmmintrin.h>
|
#include <pmmintrin.h>
|
||||||
int srslte_predecoding_single_sse(cf_t *y[SRSLTE_MAX_RXANT], cf_t *h[SRSLTE_MAX_RXANT], cf_t *x, int nof_rxant, int nof_symbols, float noise_estimate);
|
int srslte_predecoding_single_sse(cf_t *y[SRSLTE_MAX_PORTS], cf_t *h[SRSLTE_MAX_PORTS], cf_t *x, int nof_rxant, int nof_symbols, float noise_estimate);
|
||||||
int srslte_predecoding_diversity2_sse(cf_t *y[SRSLTE_MAX_RXANT], cf_t *h[SRSLTE_MAX_PORTS][SRSLTE_MAX_RXANT], cf_t *x[SRSLTE_MAX_LAYERS], int nof_rxant, int nof_symbols);
|
int srslte_predecoding_diversity2_sse(cf_t *y[SRSLTE_MAX_PORTS], cf_t *h[SRSLTE_MAX_PORTS][SRSLTE_MAX_PORTS], cf_t *x[SRSLTE_MAX_LAYERS], int nof_rxant, int nof_symbols);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef LV_HAVE_AVX
|
#ifdef LV_HAVE_AVX
|
||||||
#include <immintrin.h>
|
#include <immintrin.h>
|
||||||
int srslte_predecoding_single_avx(cf_t *y[SRSLTE_MAX_RXANT], cf_t *h[SRSLTE_MAX_RXANT], cf_t *x, int nof_rxant, int nof_symbols, float noise_estimate);
|
int srslte_predecoding_single_avx(cf_t *y[SRSLTE_MAX_PORTS], cf_t *h[SRSLTE_MAX_PORTS], cf_t *x, int nof_rxant, int nof_symbols, float noise_estimate);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
@ -58,7 +58,7 @@ int srslte_predecoding_single_avx(cf_t *y[SRSLTE_MAX_RXANT], cf_t *h[SRSLTE_MAX_
|
||||||
|
|
||||||
#define PROD(a,b) _mm_addsub_ps(_mm_mul_ps(a,_mm_moveldup_ps(b)),_mm_mul_ps(_mm_shuffle_ps(a,a,0xB1),_mm_movehdup_ps(b)))
|
#define PROD(a,b) _mm_addsub_ps(_mm_mul_ps(a,_mm_moveldup_ps(b)),_mm_mul_ps(_mm_shuffle_ps(a,a,0xB1),_mm_movehdup_ps(b)))
|
||||||
|
|
||||||
int srslte_predecoding_single_sse(cf_t *y[SRSLTE_MAX_RXANT], cf_t *h[SRSLTE_MAX_RXANT], cf_t *x, int nof_rxant, int nof_symbols, float noise_estimate) {
|
int srslte_predecoding_single_sse(cf_t *y[SRSLTE_MAX_PORTS], cf_t *h[SRSLTE_MAX_PORTS], cf_t *x, int nof_rxant, int nof_symbols, float noise_estimate) {
|
||||||
|
|
||||||
float *xPtr = (float*) x;
|
float *xPtr = (float*) x;
|
||||||
const float *hPtr1 = (const float*) h[0];
|
const float *hPtr1 = (const float*) h[0];
|
||||||
|
@ -146,7 +146,7 @@ int srslte_predecoding_single_sse(cf_t *y[SRSLTE_MAX_RXANT], cf_t *h[SRSLTE_MAX_
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int srslte_predecoding_single_avx(cf_t *y[SRSLTE_MAX_RXANT], cf_t *h[SRSLTE_MAX_RXANT], cf_t *x, int nof_rxant, int nof_symbols, float noise_estimate) {
|
int srslte_predecoding_single_avx(cf_t *y[SRSLTE_MAX_PORTS], cf_t *h[SRSLTE_MAX_PORTS], cf_t *x, int nof_rxant, int nof_symbols, float noise_estimate) {
|
||||||
|
|
||||||
float *xPtr = (float*) x;
|
float *xPtr = (float*) x;
|
||||||
const float *hPtr1 = (const float*) h[0];
|
const float *hPtr1 = (const float*) h[0];
|
||||||
|
@ -230,7 +230,7 @@ int srslte_predecoding_single_avx(cf_t *y[SRSLTE_MAX_RXANT], cf_t *h[SRSLTE_MAX_
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int srslte_predecoding_single_gen(cf_t *y[SRSLTE_MAX_RXANT], cf_t *h[SRSLTE_MAX_RXANT], cf_t *x, int nof_rxant, int nof_symbols, float noise_estimate) {
|
int srslte_predecoding_single_gen(cf_t *y[SRSLTE_MAX_PORTS], cf_t *h[SRSLTE_MAX_PORTS], cf_t *x, int nof_rxant, int nof_symbols, float noise_estimate) {
|
||||||
for (int i=0;i<nof_symbols;i++) {
|
for (int i=0;i<nof_symbols;i++) {
|
||||||
cf_t r = 0;
|
cf_t r = 0;
|
||||||
cf_t hh = 0;
|
cf_t hh = 0;
|
||||||
|
@ -246,8 +246,8 @@ int srslte_predecoding_single_gen(cf_t *y[SRSLTE_MAX_RXANT], cf_t *h[SRSLTE_MAX_
|
||||||
/* ZF/MMSE SISO equalizer x=y(h'h+no)^(-1)h' (ZF if n0=0.0)*/
|
/* ZF/MMSE SISO equalizer x=y(h'h+no)^(-1)h' (ZF if n0=0.0)*/
|
||||||
int srslte_predecoding_single(cf_t *y_, cf_t *h_, cf_t *x, int nof_symbols, float noise_estimate) {
|
int srslte_predecoding_single(cf_t *y_, cf_t *h_, cf_t *x, int nof_symbols, float noise_estimate) {
|
||||||
|
|
||||||
cf_t *y[SRSLTE_MAX_RXANT];
|
cf_t *y[SRSLTE_MAX_PORTS];
|
||||||
cf_t *h[SRSLTE_MAX_RXANT];
|
cf_t *h[SRSLTE_MAX_PORTS];
|
||||||
y[0] = y_;
|
y[0] = y_;
|
||||||
h[0] = h_;
|
h[0] = h_;
|
||||||
int nof_rxant = 1;
|
int nof_rxant = 1;
|
||||||
|
@ -272,7 +272,7 @@ int srslte_predecoding_single(cf_t *y_, cf_t *h_, cf_t *x, int nof_symbols, floa
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ZF/MMSE SISO equalizer x=y(h'h+no)^(-1)h' (ZF if n0=0.0)*/
|
/* ZF/MMSE SISO equalizer x=y(h'h+no)^(-1)h' (ZF if n0=0.0)*/
|
||||||
int srslte_predecoding_single_multi(cf_t *y[SRSLTE_MAX_RXANT], cf_t *h[SRSLTE_MAX_RXANT], cf_t *x, int nof_rxant, int nof_symbols, float noise_estimate) {
|
int srslte_predecoding_single_multi(cf_t *y[SRSLTE_MAX_PORTS], cf_t *h[SRSLTE_MAX_PORTS], cf_t *x, int nof_rxant, int nof_symbols, float noise_estimate) {
|
||||||
#ifdef LV_HAVE_AVX
|
#ifdef LV_HAVE_AVX
|
||||||
if (nof_symbols > 32) {
|
if (nof_symbols > 32) {
|
||||||
return srslte_predecoding_single_avx(y, h, x, nof_rxant, nof_symbols, noise_estimate);
|
return srslte_predecoding_single_avx(y, h, x, nof_rxant, nof_symbols, noise_estimate);
|
||||||
|
@ -293,7 +293,7 @@ int srslte_predecoding_single_multi(cf_t *y[SRSLTE_MAX_RXANT], cf_t *h[SRSLTE_MA
|
||||||
}
|
}
|
||||||
|
|
||||||
/* C implementatino of the SFBC equalizer */
|
/* C implementatino of the SFBC equalizer */
|
||||||
int srslte_predecoding_diversity_gen_(cf_t *y[SRSLTE_MAX_RXANT], cf_t *h[SRSLTE_MAX_PORTS][SRSLTE_MAX_RXANT],
|
int srslte_predecoding_diversity_gen_(cf_t *y[SRSLTE_MAX_PORTS], cf_t *h[SRSLTE_MAX_PORTS][SRSLTE_MAX_PORTS],
|
||||||
cf_t *x[SRSLTE_MAX_LAYERS],
|
cf_t *x[SRSLTE_MAX_LAYERS],
|
||||||
int nof_rxant, int nof_ports, int nof_symbols, int symbol_start)
|
int nof_rxant, int nof_ports, int nof_symbols, int symbol_start)
|
||||||
{
|
{
|
||||||
|
@ -362,7 +362,7 @@ int srslte_predecoding_diversity_gen_(cf_t *y[SRSLTE_MAX_RXANT], cf_t *h[SRSLTE_
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int srslte_predecoding_diversity_gen(cf_t *y[SRSLTE_MAX_RXANT], cf_t *h[SRSLTE_MAX_PORTS][SRSLTE_MAX_RXANT],
|
int srslte_predecoding_diversity_gen(cf_t *y[SRSLTE_MAX_PORTS], cf_t *h[SRSLTE_MAX_PORTS][SRSLTE_MAX_PORTS],
|
||||||
cf_t *x[SRSLTE_MAX_LAYERS],
|
cf_t *x[SRSLTE_MAX_LAYERS],
|
||||||
int nof_rxant, int nof_ports, int nof_symbols) {
|
int nof_rxant, int nof_ports, int nof_symbols) {
|
||||||
return srslte_predecoding_diversity_gen_(y, h, x, nof_rxant, nof_ports, nof_symbols, 0);
|
return srslte_predecoding_diversity_gen_(y, h, x, nof_rxant, nof_ports, nof_symbols, 0);
|
||||||
|
@ -370,7 +370,7 @@ int srslte_predecoding_diversity_gen(cf_t *y[SRSLTE_MAX_RXANT], cf_t *h[SRSLTE_M
|
||||||
|
|
||||||
/* SSE implementation of the 2-port SFBC equalizer */
|
/* SSE implementation of the 2-port SFBC equalizer */
|
||||||
#ifdef LV_HAVE_SSE
|
#ifdef LV_HAVE_SSE
|
||||||
int srslte_predecoding_diversity2_sse(cf_t *y[SRSLTE_MAX_RXANT], cf_t *h[SRSLTE_MAX_PORTS][SRSLTE_MAX_RXANT],
|
int srslte_predecoding_diversity2_sse(cf_t *y[SRSLTE_MAX_PORTS], cf_t *h[SRSLTE_MAX_PORTS][SRSLTE_MAX_PORTS],
|
||||||
cf_t *x[SRSLTE_MAX_LAYERS],
|
cf_t *x[SRSLTE_MAX_LAYERS],
|
||||||
int nof_rxant, int nof_symbols)
|
int nof_rxant, int nof_symbols)
|
||||||
{
|
{
|
||||||
|
@ -481,8 +481,8 @@ int srslte_predecoding_diversity2_sse(cf_t *y[SRSLTE_MAX_RXANT], cf_t *h[SRSLTE_
|
||||||
int srslte_predecoding_diversity(cf_t *y_, cf_t *h_[SRSLTE_MAX_PORTS], cf_t *x[SRSLTE_MAX_LAYERS],
|
int srslte_predecoding_diversity(cf_t *y_, cf_t *h_[SRSLTE_MAX_PORTS], cf_t *x[SRSLTE_MAX_LAYERS],
|
||||||
int nof_ports, int nof_symbols)
|
int nof_ports, int nof_symbols)
|
||||||
{
|
{
|
||||||
cf_t *h[SRSLTE_MAX_PORTS][SRSLTE_MAX_RXANT];
|
cf_t *h[SRSLTE_MAX_PORTS][SRSLTE_MAX_PORTS];
|
||||||
cf_t *y[SRSLTE_MAX_RXANT];
|
cf_t *y[SRSLTE_MAX_PORTS];
|
||||||
uint32_t nof_rxant = 1;
|
uint32_t nof_rxant = 1;
|
||||||
|
|
||||||
for (int i=0;i<nof_ports;i++) {
|
for (int i=0;i<nof_ports;i++) {
|
||||||
|
@ -501,7 +501,7 @@ int srslte_predecoding_diversity(cf_t *y_, cf_t *h_[SRSLTE_MAX_PORTS], cf_t *x[S
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
int srslte_predecoding_diversity_multi(cf_t *y[SRSLTE_MAX_RXANT], cf_t *h[SRSLTE_MAX_PORTS][SRSLTE_MAX_RXANT], cf_t *x[SRSLTE_MAX_LAYERS],
|
int srslte_predecoding_diversity_multi(cf_t *y[SRSLTE_MAX_PORTS], cf_t *h[SRSLTE_MAX_PORTS][SRSLTE_MAX_PORTS], cf_t *x[SRSLTE_MAX_LAYERS],
|
||||||
int nof_rxant, int nof_ports, int nof_symbols)
|
int nof_rxant, int nof_ports, int nof_symbols)
|
||||||
{
|
{
|
||||||
#ifdef LV_HAVE_SSE
|
#ifdef LV_HAVE_SSE
|
||||||
|
|
|
@ -92,14 +92,14 @@ void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
|
||||||
}
|
}
|
||||||
|
|
||||||
cf_t *x[SRSLTE_MAX_LAYERS];
|
cf_t *x[SRSLTE_MAX_LAYERS];
|
||||||
cf_t *h[SRSLTE_MAX_PORTS][SRSLTE_MAX_RXANT];
|
cf_t *h[SRSLTE_MAX_PORTS][SRSLTE_MAX_PORTS];
|
||||||
cf_t *y[SRSLTE_MAX_RXANT];
|
cf_t *y[SRSLTE_MAX_PORTS];
|
||||||
|
|
||||||
for (int i=0;i<SRSLTE_MAX_LAYERS;i++) {
|
for (int i=0;i<SRSLTE_MAX_LAYERS;i++) {
|
||||||
x[i] = NULL;
|
x[i] = NULL;
|
||||||
}
|
}
|
||||||
for (int i=0;i<SRSLTE_MAX_PORTS;i++) {
|
for (int i=0;i<SRSLTE_MAX_PORTS;i++) {
|
||||||
for (int j=0;j<SRSLTE_MAX_RXANT;j++) {
|
for (int j=0;j<SRSLTE_MAX_PORTS;j++) {
|
||||||
h[i][j] = NULL;
|
h[i][j] = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -57,10 +57,14 @@ bool srslte_pcfich_exists(int nframe, int nslot) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int srslte_pcfich_init(srslte_pcfich_t *q, srslte_regs_t *regs, srslte_cell_t cell) {
|
||||||
|
return srslte_pcfich_init_multi(q, regs, cell, 1);
|
||||||
|
}
|
||||||
|
|
||||||
/** Initializes the pcfich channel receiver.
|
/** Initializes the pcfich channel receiver.
|
||||||
* On error, returns -1 and frees the structrure
|
* On error, returns -1 and frees the structrure
|
||||||
*/
|
*/
|
||||||
int srslte_pcfich_init(srslte_pcfich_t *q, srslte_regs_t *regs, srslte_cell_t cell) {
|
int srslte_pcfich_init_multi(srslte_pcfich_t *q, srslte_regs_t *regs, srslte_cell_t cell, uint32_t nof_rx_antennas) {
|
||||||
int ret = SRSLTE_ERROR_INVALID_INPUTS;
|
int ret = SRSLTE_ERROR_INVALID_INPUTS;
|
||||||
|
|
||||||
if (q != NULL &&
|
if (q != NULL &&
|
||||||
|
@ -73,6 +77,7 @@ int srslte_pcfich_init(srslte_pcfich_t *q, srslte_regs_t *regs, srslte_cell_t ce
|
||||||
q->cell = cell;
|
q->cell = cell;
|
||||||
q->regs = regs;
|
q->regs = regs;
|
||||||
q->nof_symbols = PCFICH_RE;
|
q->nof_symbols = PCFICH_RE;
|
||||||
|
q->nof_rx_antennas = nof_rx_antennas;
|
||||||
|
|
||||||
if (srslte_modem_table_lte(&q->mod, SRSLTE_MOD_QPSK)) {
|
if (srslte_modem_table_lte(&q->mod, SRSLTE_MOD_QPSK)) {
|
||||||
goto clean;
|
goto clean;
|
||||||
|
@ -145,21 +150,33 @@ int srslte_pcfich_cfi_encode(uint32_t cfi, uint8_t bits[PCFICH_CFI_LEN]) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int srslte_pcfich_decode(srslte_pcfich_t *q, cf_t *sf_symbols, cf_t *ce[SRSLTE_MAX_PORTS], float noise_estimate,
|
||||||
|
uint32_t nsubframe, uint32_t *cfi, float *corr_result)
|
||||||
|
{
|
||||||
|
cf_t *_sf_symbols[SRSLTE_MAX_PORTS];
|
||||||
|
cf_t *_ce[SRSLTE_MAX_PORTS][SRSLTE_MAX_PORTS];
|
||||||
|
|
||||||
|
_sf_symbols[0] = sf_symbols;
|
||||||
|
for (int i=0;i<q->cell.nof_ports;i++) {
|
||||||
|
_ce[i][0] = ce[i];
|
||||||
|
}
|
||||||
|
return srslte_pcfich_decode_multi(q, _sf_symbols, _ce, noise_estimate, nsubframe, cfi, corr_result);
|
||||||
|
}
|
||||||
|
|
||||||
/* Decodes the PCFICH channel and saves the CFI in the cfi pointer.
|
/* Decodes the PCFICH channel and saves the CFI in the cfi pointer.
|
||||||
*
|
*
|
||||||
* Returns 1 if successfully decoded the CFI, 0 if not and -1 on error
|
* Returns 1 if successfully decoded the CFI, 0 if not and -1 on error
|
||||||
*/
|
*/
|
||||||
int srslte_pcfich_decode(srslte_pcfich_t *q, cf_t *slot_symbols, cf_t *ce[SRSLTE_MAX_PORTS], float noise_estimate,
|
int srslte_pcfich_decode_multi(srslte_pcfich_t *q, cf_t *sf_symbols[SRSLTE_MAX_PORTS], cf_t *ce[SRSLTE_MAX_PORTS][SRSLTE_MAX_PORTS], float noise_estimate,
|
||||||
uint32_t nsubframe, uint32_t *cfi, float *corr_result)
|
uint32_t nsubframe, uint32_t *cfi, float *corr_result)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Set pointers for layermapping & precoding */
|
/* Set pointers for layermapping & precoding */
|
||||||
int i;
|
int i;
|
||||||
cf_t *x[SRSLTE_MAX_LAYERS];
|
cf_t *x[SRSLTE_MAX_LAYERS];
|
||||||
cf_t *ce_precoding[SRSLTE_MAX_PORTS];
|
|
||||||
|
|
||||||
if (q != NULL &&
|
if (q != NULL &&
|
||||||
slot_symbols != NULL &&
|
sf_symbols != NULL &&
|
||||||
nsubframe < SRSLTE_NSUBFRAMES_X_FRAME)
|
nsubframe < SRSLTE_NSUBFRAMES_X_FRAME)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -167,34 +184,37 @@ int srslte_pcfich_decode(srslte_pcfich_t *q, cf_t *slot_symbols, cf_t *ce[SRSLTE
|
||||||
for (i = 0; i < SRSLTE_MAX_PORTS; i++) {
|
for (i = 0; i < SRSLTE_MAX_PORTS; i++) {
|
||||||
x[i] = q->x[i];
|
x[i] = q->x[i];
|
||||||
}
|
}
|
||||||
for (i = 0; i < SRSLTE_MAX_PORTS; i++) {
|
|
||||||
ce_precoding[i] = q->ce[i];
|
cf_t *q_symbols[SRSLTE_MAX_PORTS];
|
||||||
}
|
cf_t *q_ce[SRSLTE_MAX_PORTS][SRSLTE_MAX_PORTS];
|
||||||
|
|
||||||
/* extract symbols */
|
/* extract symbols */
|
||||||
if (q->nof_symbols
|
for (int j=0;j<q->nof_rx_antennas;j++) {
|
||||||
!= srslte_regs_pcfich_get(q->regs, slot_symbols, q->symbols[0])) {
|
if (q->nof_symbols
|
||||||
fprintf(stderr, "There was an error getting the PCFICH symbols\n");
|
!= srslte_regs_pcfich_get(q->regs, sf_symbols[j], q->symbols[j])) {
|
||||||
return SRSLTE_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* extract channel estimates */
|
|
||||||
for (i = 0; i < q->cell.nof_ports; i++) {
|
|
||||||
if (q->nof_symbols != srslte_regs_pcfich_get(q->regs, ce[i], q->ce[i])) {
|
|
||||||
fprintf(stderr, "There was an error getting the PCFICH symbols\n");
|
fprintf(stderr, "There was an error getting the PCFICH symbols\n");
|
||||||
return SRSLTE_ERROR;
|
return SRSLTE_ERROR;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
q_symbols[j] = q->symbols[j];
|
||||||
|
|
||||||
|
/* extract channel estimates */
|
||||||
|
for (i = 0; i < q->cell.nof_ports; i++) {
|
||||||
|
if (q->nof_symbols != srslte_regs_pcfich_get(q->regs, ce[i][j], q->ce[i][j])) {
|
||||||
|
fprintf(stderr, "There was an error getting the PCFICH symbols\n");
|
||||||
|
return SRSLTE_ERROR;
|
||||||
|
}
|
||||||
|
q_ce[i][j] = q->ce[i][j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* in control channels, only diversity is supported */
|
/* in control channels, only diversity is supported */
|
||||||
if (q->cell.nof_ports == 1) {
|
if (q->cell.nof_ports == 1) {
|
||||||
/* no need for layer demapping */
|
/* no need for layer demapping */
|
||||||
srslte_predecoding_single(q->symbols[0], q->ce[0], q->d, q->nof_symbols, noise_estimate);
|
srslte_predecoding_single_multi(q_symbols, q_ce[0], q->d, q->nof_rx_antennas, q->nof_symbols, noise_estimate);
|
||||||
} else {
|
} else {
|
||||||
srslte_predecoding_diversity(q->symbols[0], ce_precoding, x,
|
srslte_predecoding_diversity_multi(q_symbols, q_ce, x, q->nof_rx_antennas, q->cell.nof_ports, q->nof_symbols);
|
||||||
q->cell.nof_ports, q->nof_symbols);
|
srslte_layerdemap_diversity(x, q->d, q->cell.nof_ports, q->nof_symbols / q->cell.nof_ports);
|
||||||
srslte_layerdemap_diversity(x, q->d, q->cell.nof_ports,
|
|
||||||
q->nof_symbols / q->cell.nof_ports);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* demodulate symbols */
|
/* demodulate symbols */
|
||||||
|
@ -229,14 +249,14 @@ int srslte_pcfich_encode(srslte_pcfich_t *q, uint32_t cfi, cf_t *slot_symbols[SR
|
||||||
|
|
||||||
/* Set pointers for layermapping & precoding */
|
/* Set pointers for layermapping & precoding */
|
||||||
cf_t *x[SRSLTE_MAX_LAYERS];
|
cf_t *x[SRSLTE_MAX_LAYERS];
|
||||||
cf_t *symbols_precoding[SRSLTE_MAX_PORTS];
|
cf_t *q_symbols[SRSLTE_MAX_PORTS];
|
||||||
|
|
||||||
/* number of layers equals number of ports */
|
/* number of layers equals number of ports */
|
||||||
for (i = 0; i < q->cell.nof_ports; i++) {
|
for (i = 0; i < q->cell.nof_ports; i++) {
|
||||||
x[i] = q->x[i];
|
x[i] = q->x[i];
|
||||||
}
|
}
|
||||||
for (i = 0; i < SRSLTE_MAX_PORTS; i++) {
|
for (i = 0; i < SRSLTE_MAX_PORTS; i++) {
|
||||||
symbols_precoding[i] = q->symbols[i];
|
q_symbols[i] = q->symbols[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
/* pack CFI */
|
/* pack CFI */
|
||||||
|
@ -250,8 +270,7 @@ int srslte_pcfich_encode(srslte_pcfich_t *q, uint32_t cfi, cf_t *slot_symbols[SR
|
||||||
/* layer mapping & precoding */
|
/* layer mapping & precoding */
|
||||||
if (q->cell.nof_ports > 1) {
|
if (q->cell.nof_ports > 1) {
|
||||||
srslte_layermap_diversity(q->d, x, q->cell.nof_ports, q->nof_symbols);
|
srslte_layermap_diversity(q->d, x, q->cell.nof_ports, q->nof_symbols);
|
||||||
srslte_precoding_diversity(x, symbols_precoding, q->cell.nof_ports,
|
srslte_precoding_diversity(x, q_symbols, q->cell.nof_ports, q->nof_symbols / q->cell.nof_ports);
|
||||||
q->nof_symbols / q->cell.nof_ports);
|
|
||||||
} else {
|
} else {
|
||||||
memcpy(q->symbols[0], q->d, q->nof_symbols * sizeof(cf_t));
|
memcpy(q->symbols[0], q->d, q->nof_symbols * sizeof(cf_t));
|
||||||
}
|
}
|
||||||
|
|
|
@ -393,8 +393,8 @@ int cnt=0;
|
||||||
int srslte_pdcch_extract_llr(srslte_pdcch_t *q, cf_t *sf_symbols, cf_t *ce[SRSLTE_MAX_PORTS], float noise_estimate,
|
int srslte_pdcch_extract_llr(srslte_pdcch_t *q, cf_t *sf_symbols, cf_t *ce[SRSLTE_MAX_PORTS], float noise_estimate,
|
||||||
uint32_t nsubframe, uint32_t cfi)
|
uint32_t nsubframe, uint32_t cfi)
|
||||||
{
|
{
|
||||||
cf_t *_sf_symbols[SRSLTE_MAX_RXANT];
|
cf_t *_sf_symbols[SRSLTE_MAX_PORTS];
|
||||||
cf_t *_ce[SRSLTE_MAX_PORTS][SRSLTE_MAX_RXANT];
|
cf_t *_ce[SRSLTE_MAX_PORTS][SRSLTE_MAX_PORTS];
|
||||||
|
|
||||||
_sf_symbols[0] = sf_symbols;
|
_sf_symbols[0] = sf_symbols;
|
||||||
for (int i=0;i<q->cell.nof_ports;i++) {
|
for (int i=0;i<q->cell.nof_ports;i++) {
|
||||||
|
@ -408,7 +408,7 @@ int srslte_pdcch_extract_llr(srslte_pdcch_t *q, cf_t *sf_symbols, cf_t *ce[SRSLT
|
||||||
* Every time this function is called (with a different location), the last demodulated symbols are overwritten and
|
* Every time this function is called (with a different location), the last demodulated symbols are overwritten and
|
||||||
* new messages from other locations can be decoded
|
* new messages from other locations can be decoded
|
||||||
*/
|
*/
|
||||||
int srslte_pdcch_extract_llr_multi(srslte_pdcch_t *q, cf_t *sf_symbols[SRSLTE_MAX_RXANT], cf_t *ce[SRSLTE_MAX_PORTS][SRSLTE_MAX_RXANT], float noise_estimate,
|
int srslte_pdcch_extract_llr_multi(srslte_pdcch_t *q, cf_t *sf_symbols[SRSLTE_MAX_PORTS], cf_t *ce[SRSLTE_MAX_PORTS][SRSLTE_MAX_PORTS], float noise_estimate,
|
||||||
uint32_t nsubframe, uint32_t cfi)
|
uint32_t nsubframe, uint32_t cfi)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
|
@ -215,7 +215,7 @@ int srslte_pdsch_init_multi(srslte_pdsch_t *q, srslte_cell_t cell, uint32_t nof_
|
||||||
|
|
||||||
if (q != NULL &&
|
if (q != NULL &&
|
||||||
srslte_cell_isvalid(&cell) &&
|
srslte_cell_isvalid(&cell) &&
|
||||||
nof_rx_antennas <= SRSLTE_MAX_RXANT)
|
nof_rx_antennas <= SRSLTE_MAX_PORTS)
|
||||||
{
|
{
|
||||||
|
|
||||||
bzero(q, sizeof(srslte_pdsch_t));
|
bzero(q, sizeof(srslte_pdsch_t));
|
||||||
|
@ -383,8 +383,8 @@ int srslte_pdsch_decode(srslte_pdsch_t *q,
|
||||||
cf_t *sf_symbols, cf_t *ce[SRSLTE_MAX_PORTS], float noise_estimate,
|
cf_t *sf_symbols, cf_t *ce[SRSLTE_MAX_PORTS], float noise_estimate,
|
||||||
uint16_t rnti, uint8_t *data)
|
uint16_t rnti, uint8_t *data)
|
||||||
{
|
{
|
||||||
cf_t *_sf_symbols[SRSLTE_MAX_RXANT];
|
cf_t *_sf_symbols[SRSLTE_MAX_PORTS];
|
||||||
cf_t *_ce[SRSLTE_MAX_PORTS][SRSLTE_MAX_RXANT];
|
cf_t *_ce[SRSLTE_MAX_PORTS][SRSLTE_MAX_PORTS];
|
||||||
|
|
||||||
_sf_symbols[0] = sf_symbols;
|
_sf_symbols[0] = sf_symbols;
|
||||||
for (int i=0;i<q->cell.nof_ports;i++) {
|
for (int i=0;i<q->cell.nof_ports;i++) {
|
||||||
|
@ -397,7 +397,7 @@ int srslte_pdsch_decode(srslte_pdsch_t *q,
|
||||||
*/
|
*/
|
||||||
int srslte_pdsch_decode_multi(srslte_pdsch_t *q,
|
int srslte_pdsch_decode_multi(srslte_pdsch_t *q,
|
||||||
srslte_pdsch_cfg_t *cfg, srslte_softbuffer_rx_t *softbuffer,
|
srslte_pdsch_cfg_t *cfg, srslte_softbuffer_rx_t *softbuffer,
|
||||||
cf_t *sf_symbols[SRSLTE_MAX_RXANT], cf_t *ce[SRSLTE_MAX_PORTS][SRSLTE_MAX_RXANT], float noise_estimate,
|
cf_t *sf_symbols[SRSLTE_MAX_PORTS], cf_t *ce[SRSLTE_MAX_PORTS][SRSLTE_MAX_PORTS], float noise_estimate,
|
||||||
uint16_t rnti, uint8_t *data)
|
uint16_t rnti, uint8_t *data)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
|
@ -67,8 +67,14 @@ void srslte_phich_reset(srslte_phich_t *q, cf_t *slot_symbols[SRSLTE_MAX_PORTS])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int srslte_phich_init(srslte_phich_t *q, srslte_regs_t *regs, srslte_cell_t cell)
|
||||||
|
{
|
||||||
|
return srslte_phich_init_multi(q, regs, cell, 1);
|
||||||
|
}
|
||||||
|
|
||||||
/** Initializes the phich channel receiver */
|
/** Initializes the phich channel receiver */
|
||||||
int srslte_phich_init(srslte_phich_t *q, srslte_regs_t *regs, srslte_cell_t cell) {
|
int srslte_phich_init_multi(srslte_phich_t *q, srslte_regs_t *regs, srslte_cell_t cell, uint32_t nof_rx_antennas)
|
||||||
|
{
|
||||||
int ret = SRSLTE_ERROR_INVALID_INPUTS;
|
int ret = SRSLTE_ERROR_INVALID_INPUTS;
|
||||||
|
|
||||||
if (q != NULL &&
|
if (q != NULL &&
|
||||||
|
@ -81,6 +87,7 @@ int srslte_phich_init(srslte_phich_t *q, srslte_regs_t *regs, srslte_cell_t cell
|
||||||
|
|
||||||
q->cell = cell;
|
q->cell = cell;
|
||||||
q->regs = regs;
|
q->regs = regs;
|
||||||
|
q->nof_rx_antennas = nof_rx_antennas;
|
||||||
|
|
||||||
if (srslte_modem_table_lte(&q->mod, SRSLTE_MOD_BPSK)) {
|
if (srslte_modem_table_lte(&q->mod, SRSLTE_MOD_BPSK)) {
|
||||||
goto clean;
|
goto clean;
|
||||||
|
@ -155,19 +162,32 @@ void srslte_phich_ack_encode(uint8_t ack, uint8_t bits[SRSLTE_PHICH_NBITS]) {
|
||||||
memset(bits, ack, 3 * sizeof(uint8_t));
|
memset(bits, ack, 3 * sizeof(uint8_t));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int srslte_phich_decode(srslte_phich_t *q, cf_t *sf_symbols, cf_t *ce[SRSLTE_MAX_PORTS], float noise_estimate,
|
||||||
|
uint32_t ngroup, uint32_t nseq, uint32_t subframe, uint8_t *ack, float *distance)
|
||||||
|
{
|
||||||
|
cf_t *_sf_symbols[SRSLTE_MAX_PORTS];
|
||||||
|
cf_t *_ce[SRSLTE_MAX_PORTS][SRSLTE_MAX_PORTS];
|
||||||
|
|
||||||
|
_sf_symbols[0] = sf_symbols;
|
||||||
|
for (int i=0;i<q->cell.nof_ports;i++) {
|
||||||
|
_ce[i][0] = ce[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
return srslte_phich_decode_multi(q, _sf_symbols, _ce, noise_estimate, ngroup, nseq, subframe, ack, distance);
|
||||||
|
}
|
||||||
/* Decodes the phich channel and saves the CFI in the cfi pointer.
|
/* Decodes the phich channel and saves the CFI in the cfi pointer.
|
||||||
*
|
*
|
||||||
* Returns 1 if successfully decoded the CFI, 0 if not and -1 on error
|
* Returns 1 if successfully decoded the CFI, 0 if not and -1 on error
|
||||||
*/
|
*/
|
||||||
int srslte_phich_decode(srslte_phich_t *q, cf_t *slot_symbols, cf_t *ce[SRSLTE_MAX_PORTS], float noise_estimate,
|
int srslte_phich_decode_multi(srslte_phich_t *q, cf_t *sf_symbols[SRSLTE_MAX_PORTS], cf_t *ce[SRSLTE_MAX_PORTS][SRSLTE_MAX_PORTS], float noise_estimate,
|
||||||
uint32_t ngroup, uint32_t nseq, uint32_t subframe, uint8_t *ack, float *distance) {
|
uint32_t ngroup, uint32_t nseq, uint32_t subframe, uint8_t *ack, float *distance)
|
||||||
|
{
|
||||||
|
|
||||||
/* Set pointers for layermapping & precoding */
|
/* Set pointers for layermapping & precoding */
|
||||||
int i, j;
|
int i, j;
|
||||||
cf_t *x[SRSLTE_MAX_LAYERS];
|
cf_t *x[SRSLTE_MAX_LAYERS];
|
||||||
cf_t *ce_precoding[SRSLTE_MAX_PORTS];
|
|
||||||
|
|
||||||
if (q == NULL || slot_symbols == NULL) {
|
if (q == NULL || sf_symbols == NULL) {
|
||||||
return SRSLTE_ERROR_INVALID_INPUTS;
|
return SRSLTE_ERROR_INVALID_INPUTS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -198,34 +218,37 @@ int srslte_phich_decode(srslte_phich_t *q, cf_t *slot_symbols, cf_t *ce[SRSLTE_M
|
||||||
for (i = 0; i < SRSLTE_MAX_PORTS; i++) {
|
for (i = 0; i < SRSLTE_MAX_PORTS; i++) {
|
||||||
x[i] = q->x[i];
|
x[i] = q->x[i];
|
||||||
}
|
}
|
||||||
for (i = 0; i < SRSLTE_MAX_PORTS; i++) {
|
|
||||||
ce_precoding[i] = q->ce[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
|
cf_t *q_ce[SRSLTE_MAX_PORTS][SRSLTE_MAX_PORTS];
|
||||||
|
cf_t *q_sf_symbols[SRSLTE_MAX_PORTS];
|
||||||
|
|
||||||
/* extract symbols */
|
/* extract symbols */
|
||||||
if (SRSLTE_PHICH_MAX_NSYMB
|
for (int j=0;j<q->nof_rx_antennas;j++) {
|
||||||
!= srslte_regs_phich_get(q->regs, slot_symbols, q->symbols[0], ngroup)) {
|
if (SRSLTE_PHICH_MAX_NSYMB
|
||||||
fprintf(stderr, "There was an error getting the phich symbols\n");
|
!= srslte_regs_phich_get(q->regs, sf_symbols[j], q->sf_symbols[j], ngroup)) {
|
||||||
return SRSLTE_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* extract channel estimates */
|
|
||||||
for (i = 0; i < q->cell.nof_ports; i++) {
|
|
||||||
if (SRSLTE_PHICH_MAX_NSYMB != srslte_regs_phich_get(q->regs, ce[i], q->ce[i], ngroup)) {
|
|
||||||
fprintf(stderr, "There was an error getting the phich symbols\n");
|
fprintf(stderr, "There was an error getting the phich symbols\n");
|
||||||
return SRSLTE_ERROR;
|
return SRSLTE_ERROR;
|
||||||
|
}
|
||||||
|
q_sf_symbols[j] = q->sf_symbols[j];
|
||||||
|
|
||||||
|
/* extract channel estimates */
|
||||||
|
for (i = 0; i < q->cell.nof_ports; i++) {
|
||||||
|
if (SRSLTE_PHICH_MAX_NSYMB != srslte_regs_phich_get(q->regs, ce[i][j], q->ce[i][j], ngroup)) {
|
||||||
|
fprintf(stderr, "There was an error getting the phich symbols\n");
|
||||||
|
return SRSLTE_ERROR;
|
||||||
|
}
|
||||||
|
q_ce[i][j] = q->ce[i][j];
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* in control channels, only diversity is supported */
|
/* in control channels, only diversity is supported */
|
||||||
if (q->cell.nof_ports == 1) {
|
if (q->cell.nof_ports == 1) {
|
||||||
/* no need for layer demapping */
|
/* no need for layer demapping */
|
||||||
srslte_predecoding_single(q->symbols[0], q->ce[0], q->d0, SRSLTE_PHICH_MAX_NSYMB, noise_estimate);
|
srslte_predecoding_single_multi(q_sf_symbols, q_ce[0], q->d0, q->nof_rx_antennas, SRSLTE_PHICH_MAX_NSYMB, noise_estimate);
|
||||||
} else {
|
} else {
|
||||||
srslte_predecoding_diversity(q->symbols[0], ce_precoding, x,
|
srslte_predecoding_diversity_multi(q_sf_symbols, q_ce, x, q->nof_rx_antennas, q->cell.nof_ports, SRSLTE_PHICH_MAX_NSYMB);
|
||||||
q->cell.nof_ports, SRSLTE_PHICH_MAX_NSYMB);
|
srslte_layerdemap_diversity(x, q->d0, q->cell.nof_ports, SRSLTE_PHICH_MAX_NSYMB / q->cell.nof_ports);
|
||||||
srslte_layerdemap_diversity(x, q->d0, q->cell.nof_ports,
|
|
||||||
SRSLTE_PHICH_MAX_NSYMB / q->cell.nof_ports);
|
|
||||||
}
|
}
|
||||||
DEBUG("Recv!!: \n", 0);
|
DEBUG("Recv!!: \n", 0);
|
||||||
DEBUG("d0: ", 0);
|
DEBUG("d0: ", 0);
|
||||||
|
@ -328,7 +351,7 @@ int srslte_phich_encode(srslte_phich_t *q, uint8_t ack, uint32_t ngroup, uint32_
|
||||||
x[i] = q->x[i];
|
x[i] = q->x[i];
|
||||||
}
|
}
|
||||||
for (i = 0; i < SRSLTE_MAX_PORTS; i++) {
|
for (i = 0; i < SRSLTE_MAX_PORTS; i++) {
|
||||||
symbols_precoding[i] = q->symbols[i];
|
symbols_precoding[i] = q->sf_symbols[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
/* encode ACK/NACK bit */
|
/* encode ACK/NACK bit */
|
||||||
|
@ -391,12 +414,12 @@ int srslte_phich_encode(srslte_phich_t *q, uint8_t ack, uint32_t ngroup, uint32_
|
||||||
SRSLTE_PHICH_MAX_NSYMB / q->cell.nof_ports);
|
SRSLTE_PHICH_MAX_NSYMB / q->cell.nof_ports);
|
||||||
/**FIXME: According to 6.9.2, Precoding for 4 tx ports is different! */
|
/**FIXME: According to 6.9.2, Precoding for 4 tx ports is different! */
|
||||||
} else {
|
} else {
|
||||||
memcpy(q->symbols[0], q->d0, SRSLTE_PHICH_MAX_NSYMB * sizeof(cf_t));
|
memcpy(q->sf_symbols[0], q->d0, SRSLTE_PHICH_MAX_NSYMB * sizeof(cf_t));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* mapping to resource elements */
|
/* mapping to resource elements */
|
||||||
for (i = 0; i < q->cell.nof_ports; i++) {
|
for (i = 0; i < q->cell.nof_ports; i++) {
|
||||||
if (srslte_regs_phich_add(q->regs, q->symbols[i], ngroup, slot_symbols[i])
|
if (srslte_regs_phich_add(q->regs, q->sf_symbols[i], ngroup, slot_symbols[i])
|
||||||
< 0) {
|
< 0) {
|
||||||
fprintf(stderr, "Error putting PCHICH resource elements\n");
|
fprintf(stderr, "Error putting PCHICH resource elements\n");
|
||||||
return SRSLTE_ERROR;
|
return SRSLTE_ERROR;
|
||||||
|
|
|
@ -55,7 +55,7 @@ void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
|
||||||
srslte_ofdm_t ofdm_rx;
|
srslte_ofdm_t ofdm_rx;
|
||||||
srslte_pdsch_t pdsch;
|
srslte_pdsch_t pdsch;
|
||||||
srslte_chest_dl_t chest;
|
srslte_chest_dl_t chest;
|
||||||
cf_t *input_fft[SRSLTE_MAX_RXANT];
|
cf_t *input_fft[SRSLTE_MAX_PORTS];
|
||||||
srslte_pdsch_cfg_t cfg;
|
srslte_pdsch_cfg_t cfg;
|
||||||
srslte_softbuffer_rx_t softbuffer;
|
srslte_softbuffer_rx_t softbuffer;
|
||||||
uint32_t rnti32;
|
uint32_t rnti32;
|
||||||
|
@ -196,8 +196,8 @@ void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
|
||||||
nof_retx = mexutils_getLength(INPUT);
|
nof_retx = mexutils_getLength(INPUT);
|
||||||
}
|
}
|
||||||
|
|
||||||
cf_t *ce[SRSLTE_MAX_PORTS][SRSLTE_MAX_RXANT];
|
cf_t *ce[SRSLTE_MAX_PORTS][SRSLTE_MAX_PORTS];
|
||||||
for (int j=0;j<SRSLTE_MAX_RXANT;j++) {
|
for (int j=0;j<SRSLTE_MAX_PORTS;j++) {
|
||||||
for (i=0;i<cell.nof_ports;i++) {
|
for (i=0;i<cell.nof_ports;i++) {
|
||||||
ce[i][j] = srslte_vec_malloc(SRSLTE_SF_LEN_RE(cell.nof_prb, cell.cp) * sizeof(cf_t));
|
ce[i][j] = srslte_vec_malloc(SRSLTE_SF_LEN_RE(cell.nof_prb, cell.cp) * sizeof(cf_t));
|
||||||
}
|
}
|
||||||
|
|
|
@ -82,10 +82,10 @@ free_and_exit:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int srslte_rf_recv_wrapper_cs(void *h, cf_t *data[SRSLTE_MAX_RXANT], uint32_t nsamples, srslte_timestamp_t *t) {
|
int srslte_rf_recv_wrapper_cs(void *h, cf_t *data[SRSLTE_MAX_PORTS], uint32_t nsamples, srslte_timestamp_t *t) {
|
||||||
DEBUG(" ---- Receive %d samples ---- \n", nsamples);
|
DEBUG(" ---- Receive %d samples ---- \n", nsamples);
|
||||||
void *ptr[SRSLTE_MAX_RXANT];
|
void *ptr[SRSLTE_MAX_PORTS];
|
||||||
for (int i=0;i<SRSLTE_MAX_RXANT;i++) {
|
for (int i=0;i<SRSLTE_MAX_PORTS;i++) {
|
||||||
ptr[i] = data[i];
|
ptr[i] = data[i];
|
||||||
}
|
}
|
||||||
return srslte_rf_recv_with_time_multi(h, ptr, nsamples, 1, NULL, NULL);
|
return srslte_rf_recv_with_time_multi(h, ptr, nsamples, 1, NULL, NULL);
|
||||||
|
|
|
@ -36,7 +36,7 @@
|
||||||
#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*, cf_t*[SRSLTE_MAX_RXANT], 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 +52,7 @@ int srslte_ue_dl_init(srslte_ue_dl_t *q,
|
||||||
int ret = SRSLTE_ERROR_INVALID_INPUTS;
|
int ret = SRSLTE_ERROR_INVALID_INPUTS;
|
||||||
|
|
||||||
if (q != NULL &&
|
if (q != NULL &&
|
||||||
nof_rx_antennas <= SRSLTE_MAX_RXANT &&
|
nof_rx_antennas <= SRSLTE_MAX_PORTS &&
|
||||||
srslte_cell_isvalid(&cell))
|
srslte_cell_isvalid(&cell))
|
||||||
{
|
{
|
||||||
ret = SRSLTE_ERROR;
|
ret = SRSLTE_ERROR;
|
||||||
|
@ -78,7 +78,7 @@ int srslte_ue_dl_init(srslte_ue_dl_t *q,
|
||||||
fprintf(stderr, "Error initiating REGs\n");
|
fprintf(stderr, "Error initiating REGs\n");
|
||||||
goto clean_exit;
|
goto clean_exit;
|
||||||
}
|
}
|
||||||
if (srslte_pcfich_init(&q->pcfich, &q->regs, q->cell)) {
|
if (srslte_pcfich_init_multi(&q->pcfich, &q->regs, q->cell, nof_rx_antennas)) {
|
||||||
fprintf(stderr, "Error creating PCFICH object\n");
|
fprintf(stderr, "Error creating PCFICH object\n");
|
||||||
goto clean_exit;
|
goto clean_exit;
|
||||||
}
|
}
|
||||||
|
@ -193,11 +193,11 @@ 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_RXANT], uint8_t *data, uint32_t tti) {
|
int srslte_ue_dl_decode(srslte_ue_dl_t *q, cf_t *input[SRSLTE_MAX_PORTS], uint8_t *data, uint32_t tti) {
|
||||||
return srslte_ue_dl_decode_rnti(q, input, data, tti, q->current_rnti);
|
return srslte_ue_dl_decode_rnti(q, input, data, tti, q->current_rnti);
|
||||||
}
|
}
|
||||||
|
|
||||||
int srslte_ue_dl_decode_fft_estimate(srslte_ue_dl_t *q, cf_t *input[SRSLTE_MAX_RXANT], uint32_t sf_idx, uint32_t *cfi) {
|
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) {
|
||||||
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 */
|
||||||
|
@ -228,11 +228,7 @@ int srslte_ue_dl_decode_estimate(srslte_ue_dl_t *q, uint32_t sf_idx, uint32_t *c
|
||||||
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, q->ce, sf_idx, q->nof_rx_antennas);
|
||||||
|
|
||||||
/* First decode PCFICH and obtain CFI */
|
/* First decode PCFICH and obtain CFI */
|
||||||
cf_t *ce0[SRSLTE_MAX_PORTS];
|
if (srslte_pcfich_decode_multi(&q->pcfich, q->sf_symbols, q->ce,
|
||||||
for (int i=0;i<SRSLTE_MAX_PORTS;i++) {
|
|
||||||
ce0[i] = q->ce[i][0];
|
|
||||||
}
|
|
||||||
if (srslte_pcfich_decode(&q->pcfich, q->sf_symbols[0], ce0,
|
|
||||||
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");
|
||||||
|
@ -258,7 +254,7 @@ 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_RXANT], uint8_t *data, uint32_t tti, uint16_t rnti)
|
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)
|
||||||
{
|
{
|
||||||
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;
|
||||||
|
|
|
@ -166,7 +166,7 @@ int srslte_ue_mib_decode(srslte_ue_mib_t * q, cf_t *input,
|
||||||
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,
|
uint32_t cell_id,
|
||||||
srslte_cp_t cp,
|
srslte_cp_t cp,
|
||||||
int (recv_callback)(void*, cf_t*[SRSLTE_MAX_RXANT], 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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -50,7 +50,7 @@ cf_t dummy_buffer0[15*2048/2];
|
||||||
cf_t dummy_buffer1[15*2048/2];
|
cf_t dummy_buffer1[15*2048/2];
|
||||||
|
|
||||||
// FIXME: this will break for 4 antennas!!
|
// FIXME: this will break for 4 antennas!!
|
||||||
cf_t *dummy_offset_buffer[SRSLTE_MAX_RXANT] = {dummy_buffer0, dummy_buffer1};
|
cf_t *dummy_offset_buffer[SRSLTE_MAX_PORTS] = {dummy_buffer0, dummy_buffer1};
|
||||||
|
|
||||||
int srslte_ue_sync_init_file(srslte_ue_sync_t *q, uint32_t nof_prb, char *file_name, int offset_time, float offset_freq) {
|
int srslte_ue_sync_init_file(srslte_ue_sync_t *q, uint32_t nof_prb, char *file_name, int offset_time, float offset_freq) {
|
||||||
int ret = SRSLTE_ERROR_INVALID_INPUTS;
|
int ret = SRSLTE_ERROR_INVALID_INPUTS;
|
||||||
|
@ -108,7 +108,7 @@ int srslte_ue_sync_start_agc(srslte_ue_sync_t *q, double (set_gain_callback)(voi
|
||||||
|
|
||||||
int srslte_ue_sync_init(srslte_ue_sync_t *q,
|
int srslte_ue_sync_init(srslte_ue_sync_t *q,
|
||||||
srslte_cell_t cell,
|
srslte_cell_t cell,
|
||||||
int (recv_callback)(void*, cf_t*[SRSLTE_MAX_RXANT], 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)
|
||||||
{
|
{
|
||||||
|
@ -117,7 +117,7 @@ int srslte_ue_sync_init(srslte_ue_sync_t *q,
|
||||||
if (q != NULL &&
|
if (q != NULL &&
|
||||||
stream_handler != NULL &&
|
stream_handler != NULL &&
|
||||||
srslte_nofprb_isvalid(cell.nof_prb) &&
|
srslte_nofprb_isvalid(cell.nof_prb) &&
|
||||||
nof_rx_antennas <= SRSLTE_MAX_RXANT &&
|
nof_rx_antennas <= SRSLTE_MAX_PORTS &&
|
||||||
recv_callback != NULL)
|
recv_callback != NULL)
|
||||||
{
|
{
|
||||||
ret = SRSLTE_ERROR;
|
ret = SRSLTE_ERROR;
|
||||||
|
@ -299,7 +299,7 @@ void srslte_ue_sync_set_agc_period(srslte_ue_sync_t *q, uint32_t period) {
|
||||||
q->agc_period = period;
|
q->agc_period = period;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int find_peak_ok(srslte_ue_sync_t *q, cf_t *input_buffer[SRSLTE_MAX_RXANT]) {
|
static int find_peak_ok(srslte_ue_sync_t *q, cf_t *input_buffer[SRSLTE_MAX_PORTS]) {
|
||||||
|
|
||||||
|
|
||||||
if (srslte_sync_sss_detected(&q->sfind)) {
|
if (srslte_sync_sss_detected(&q->sfind)) {
|
||||||
|
@ -433,7 +433,7 @@ static int track_peak_no(srslte_ue_sync_t *q) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int receive_samples(srslte_ue_sync_t *q, cf_t *input_buffer[SRSLTE_MAX_RXANT]) {
|
static int receive_samples(srslte_ue_sync_t *q, cf_t *input_buffer[SRSLTE_MAX_PORTS]) {
|
||||||
|
|
||||||
/* A negative time offset means there are samples in our buffer for the next subframe,
|
/* A negative time offset means there are samples in our buffer for the next subframe,
|
||||||
because we are sampling too fast.
|
because we are sampling too fast.
|
||||||
|
@ -443,8 +443,8 @@ static int receive_samples(srslte_ue_sync_t *q, cf_t *input_buffer[SRSLTE_MAX_RX
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get N subframes from the USRP getting more samples and keeping the previous samples, if any */
|
/* Get N subframes from the USRP getting more samples and keeping the previous samples, if any */
|
||||||
cf_t *ptr[SRSLTE_MAX_RXANT];
|
cf_t *ptr[SRSLTE_MAX_PORTS];
|
||||||
for (int i=0;i<SRSLTE_MAX_RXANT;i++) {
|
for (int i=0;i<SRSLTE_MAX_PORTS;i++) {
|
||||||
ptr[i] = &input_buffer[i][q->next_rf_sample_offset];
|
ptr[i] = &input_buffer[i][q->next_rf_sample_offset];
|
||||||
}
|
}
|
||||||
if (q->recv_callback(q->stream, ptr, q->frame_len - q->next_rf_sample_offset, &q->last_timestamp) < 0) {
|
if (q->recv_callback(q->stream, ptr, q->frame_len - q->next_rf_sample_offset, &q->last_timestamp) < 0) {
|
||||||
|
@ -460,7 +460,7 @@ static int receive_samples(srslte_ue_sync_t *q, cf_t *input_buffer[SRSLTE_MAX_RX
|
||||||
bool first_track = true;
|
bool first_track = true;
|
||||||
|
|
||||||
/* 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_RXANT]) {
|
int srslte_ue_sync_zerocopy(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