mirror of https://github.com/PentHertz/srsLTE.git
Added scaling factor to predecoder
This commit is contained in:
parent
ab3a3108f1
commit
91c9ddf244
|
@ -49,18 +49,21 @@
|
||||||
*/
|
*/
|
||||||
SRSLTE_API int srslte_precoding_single(cf_t *x,
|
SRSLTE_API int srslte_precoding_single(cf_t *x,
|
||||||
cf_t *y,
|
cf_t *y,
|
||||||
int nof_symbols);
|
int nof_symbols,
|
||||||
|
float scaling);
|
||||||
|
|
||||||
SRSLTE_API int srslte_precoding_diversity(cf_t *x[SRSLTE_MAX_LAYERS],
|
SRSLTE_API int srslte_precoding_diversity(cf_t *x[SRSLTE_MAX_LAYERS],
|
||||||
cf_t *y[SRSLTE_MAX_PORTS],
|
cf_t *y[SRSLTE_MAX_PORTS],
|
||||||
int nof_ports,
|
int nof_ports,
|
||||||
int nof_symbols);
|
int nof_symbols,
|
||||||
|
float scaling);
|
||||||
|
|
||||||
SRSLTE_API int srslte_precoding_cdd(cf_t *x[SRSLTE_MAX_LAYERS],
|
SRSLTE_API int srslte_precoding_cdd(cf_t *x[SRSLTE_MAX_LAYERS],
|
||||||
cf_t *y[SRSLTE_MAX_PORTS],
|
cf_t *y[SRSLTE_MAX_PORTS],
|
||||||
int nof_layers,
|
int nof_layers,
|
||||||
int nof_ports,
|
int nof_ports,
|
||||||
int nof_symbols);
|
int nof_symbols,
|
||||||
|
float scaling);
|
||||||
|
|
||||||
SRSLTE_API int srslte_precoding_type(cf_t *x[SRSLTE_MAX_LAYERS],
|
SRSLTE_API int srslte_precoding_type(cf_t *x[SRSLTE_MAX_LAYERS],
|
||||||
cf_t *y[SRSLTE_MAX_PORTS],
|
cf_t *y[SRSLTE_MAX_PORTS],
|
||||||
|
@ -68,6 +71,7 @@ SRSLTE_API int srslte_precoding_type(cf_t *x[SRSLTE_MAX_LAYERS],
|
||||||
int nof_ports,
|
int nof_ports,
|
||||||
int codebook_idx,
|
int codebook_idx,
|
||||||
int nof_symbols,
|
int nof_symbols,
|
||||||
|
float scaling,
|
||||||
srslte_mimo_type_t type);
|
srslte_mimo_type_t type);
|
||||||
|
|
||||||
/* Estimates the vector "x" based on the received signal "y" and the channel estimates "h"
|
/* Estimates the vector "x" based on the received signal "y" and the channel estimates "h"
|
||||||
|
@ -76,6 +80,7 @@ SRSLTE_API int srslte_predecoding_single(cf_t *y,
|
||||||
cf_t *h,
|
cf_t *h,
|
||||||
cf_t *x,
|
cf_t *x,
|
||||||
int nof_symbols,
|
int nof_symbols,
|
||||||
|
float scaling,
|
||||||
float noise_estimate);
|
float noise_estimate);
|
||||||
|
|
||||||
SRSLTE_API int srslte_predecoding_single_multi(cf_t *y[SRSLTE_MAX_PORTS],
|
SRSLTE_API int srslte_predecoding_single_multi(cf_t *y[SRSLTE_MAX_PORTS],
|
||||||
|
@ -83,42 +88,37 @@ SRSLTE_API int srslte_predecoding_single_multi(cf_t *y[SRSLTE_MAX_PORTS],
|
||||||
cf_t *x,
|
cf_t *x,
|
||||||
int nof_rxant,
|
int nof_rxant,
|
||||||
int nof_symbols,
|
int nof_symbols,
|
||||||
|
float scaling,
|
||||||
float noise_estimate);
|
float noise_estimate);
|
||||||
|
|
||||||
SRSLTE_API int srslte_predecoding_diversity(cf_t *y,
|
SRSLTE_API int srslte_predecoding_diversity(cf_t *y,
|
||||||
cf_t *h[SRSLTE_MAX_PORTS],
|
cf_t *h[SRSLTE_MAX_PORTS],
|
||||||
cf_t *x[SRSLTE_MAX_LAYERS],
|
cf_t *x[SRSLTE_MAX_LAYERS],
|
||||||
int nof_ports,
|
int nof_ports,
|
||||||
int nof_symbols);
|
int nof_symbols,
|
||||||
|
float scaling);
|
||||||
|
|
||||||
SRSLTE_API int srslte_predecoding_diversity_multi(cf_t *y[SRSLTE_MAX_PORTS],
|
SRSLTE_API int srslte_predecoding_diversity_multi(cf_t *y[SRSLTE_MAX_PORTS],
|
||||||
cf_t *h[SRSLTE_MAX_PORTS][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_rxant,
|
||||||
int nof_ports,
|
int nof_ports,
|
||||||
int nof_symbols);
|
int nof_symbols,
|
||||||
|
float scaling);
|
||||||
SRSLTE_API int srslte_predecoding_type(cf_t *y,
|
|
||||||
cf_t *h[SRSLTE_MAX_PORTS],
|
|
||||||
cf_t *x[SRSLTE_MAX_LAYERS],
|
|
||||||
int nof_ports,
|
|
||||||
int nof_layers,
|
|
||||||
int nof_symbols,
|
|
||||||
srslte_mimo_type_t type,
|
|
||||||
float noise_estimate);
|
|
||||||
|
|
||||||
SRSLTE_API void srslte_predecoding_set_mimo_decoder (srslte_mimo_decoder_t _mimo_decoder);
|
SRSLTE_API void srslte_predecoding_set_mimo_decoder (srslte_mimo_decoder_t _mimo_decoder);
|
||||||
|
|
||||||
SRSLTE_API int srslte_predecoding_type_multi(cf_t *y[SRSLTE_MAX_PORTS],
|
SRSLTE_API int srslte_predecoding_type(cf_t *y[SRSLTE_MAX_PORTS],
|
||||||
cf_t *h[SRSLTE_MAX_PORTS][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_rxant,
|
||||||
int nof_ports,
|
int nof_ports,
|
||||||
int nof_layers,
|
int nof_layers,
|
||||||
int codebook_idx,
|
int codebook_idx,
|
||||||
int nof_symbols,
|
int nof_symbols,
|
||||||
srslte_mimo_type_t type,
|
srslte_mimo_type_t type,
|
||||||
float noise_estimate);
|
float scaling,
|
||||||
|
float noise_estimate);
|
||||||
|
|
||||||
SRSLTE_API int srslte_precoding_pmi_select(cf_t *h[SRSLTE_MAX_PORTS][SRSLTE_MAX_PORTS],
|
SRSLTE_API int srslte_precoding_pmi_select(cf_t *h[SRSLTE_MAX_PORTS][SRSLTE_MAX_PORTS],
|
||||||
uint32_t nof_symbols,
|
uint32_t nof_symbols,
|
||||||
|
|
|
@ -65,6 +65,9 @@ typedef struct SRSLTE_API {
|
||||||
uint16_t ue_rnti;
|
uint16_t ue_rnti;
|
||||||
bool is_ue;
|
bool is_ue;
|
||||||
|
|
||||||
|
/* Power allocation parameter 3GPP 36.213 Clause 5.2 Rho_b */
|
||||||
|
float rho_a;
|
||||||
|
|
||||||
/* 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_PORTS]; /* Channel estimation (Rx only) */
|
cf_t *ce[SRSLTE_MAX_PORTS][SRSLTE_MAX_PORTS]; /* Channel estimation (Rx only) */
|
||||||
|
@ -101,6 +104,9 @@ SRSLTE_API int srslte_pdsch_set_cell(srslte_pdsch_t *q,
|
||||||
SRSLTE_API int srslte_pdsch_set_rnti(srslte_pdsch_t *q,
|
SRSLTE_API int srslte_pdsch_set_rnti(srslte_pdsch_t *q,
|
||||||
uint16_t rnti);
|
uint16_t rnti);
|
||||||
|
|
||||||
|
SRSLTE_API void srslte_pdsch_set_power_allocation(srslte_pdsch_t *q,
|
||||||
|
float rho_a);
|
||||||
|
|
||||||
SRSLTE_API void srslte_pdsch_free_rnti(srslte_pdsch_t *q,
|
SRSLTE_API void srslte_pdsch_free_rnti(srslte_pdsch_t *q,
|
||||||
uint16_t rnti);
|
uint16_t rnti);
|
||||||
|
|
||||||
|
|
|
@ -104,6 +104,9 @@ typedef struct SRSLTE_API {
|
||||||
uint32_t pmi[SRSLTE_MAX_LAYERS];
|
uint32_t pmi[SRSLTE_MAX_LAYERS];
|
||||||
uint32_t ri;
|
uint32_t ri;
|
||||||
|
|
||||||
|
/* Power allocation parameter 3GPP 36.213 Clause 5.2 Rho_b */
|
||||||
|
float rho_b;
|
||||||
|
|
||||||
srslte_dci_format_t dci_format;
|
srslte_dci_format_t dci_format;
|
||||||
uint64_t pkt_errors;
|
uint64_t pkt_errors;
|
||||||
uint64_t pkts_total;
|
uint64_t pkts_total;
|
||||||
|
@ -244,6 +247,9 @@ SRSLTE_API int srslte_ue_dl_set_mbsfn_area_id(srslte_ue_dl_t *q,
|
||||||
SRSLTE_API void srslte_ue_dl_set_non_mbsfn_region(srslte_ue_dl_t *q,
|
SRSLTE_API void srslte_ue_dl_set_non_mbsfn_region(srslte_ue_dl_t *q,
|
||||||
uint8_t non_mbsfn_region_length);
|
uint8_t non_mbsfn_region_length);
|
||||||
|
|
||||||
|
SRSLTE_API void srslte_ue_dl_set_power_alloc(srslte_ue_dl_t *q,
|
||||||
|
float rho_a,
|
||||||
|
float rho_b);
|
||||||
|
|
||||||
|
|
||||||
SRSLTE_API void srslte_ue_dl_save_signal(srslte_ue_dl_t *q,
|
SRSLTE_API void srslte_ue_dl_save_signal(srslte_ue_dl_t *q,
|
||||||
|
|
|
@ -173,7 +173,7 @@ int main(int argc, char **argv) {
|
||||||
|
|
||||||
gettimeofday(&t[1], NULL);
|
gettimeofday(&t[1], NULL);
|
||||||
for (int j=0;j<100;j++) {
|
for (int j=0;j<100;j++) {
|
||||||
srslte_predecoding_single(input, ce, output, num_re, 0);
|
srslte_predecoding_single(input, ce, output, num_re, 1.0f, 0);
|
||||||
}
|
}
|
||||||
gettimeofday(&t[2], NULL);
|
gettimeofday(&t[2], NULL);
|
||||||
get_time_interval(t);
|
get_time_interval(t);
|
||||||
|
@ -188,7 +188,7 @@ int main(int argc, char **argv) {
|
||||||
|
|
||||||
gettimeofday(&t[1], NULL);
|
gettimeofday(&t[1], NULL);
|
||||||
for (int j=0;j<100;j++) {
|
for (int j=0;j<100;j++) {
|
||||||
srslte_predecoding_single(input, ce, output, num_re, srslte_chest_dl_get_noise_estimate(&est));
|
srslte_predecoding_single(input, ce, output, num_re, 1.0f, srslte_chest_dl_get_noise_estimate(&est));
|
||||||
}
|
}
|
||||||
gettimeofday(&t[2], NULL);
|
gettimeofday(&t[2], NULL);
|
||||||
get_time_interval(t);
|
get_time_interval(t);
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -44,14 +44,16 @@ int nof_layers = 1, nof_tx_ports = 1, nof_rx_ports = 1, nof_re = 1;
|
||||||
char *mimo_type_name = NULL;
|
char *mimo_type_name = NULL;
|
||||||
char decoder_type_name [16] = "zf";
|
char decoder_type_name [16] = "zf";
|
||||||
float snr_db = 100.0f;
|
float snr_db = 100.0f;
|
||||||
|
float scaling = 0.1f;
|
||||||
|
|
||||||
void usage(char *prog) {
|
void usage(char *prog) {
|
||||||
printf(
|
printf(
|
||||||
"Usage: %s -m [single|diversity|multiplex|cdd] -l [nof_layers] -p [nof_tx_ports]\n"
|
"Usage: %s -m [single|diversity|multiplex|cdd] -l [nof_layers] -p [nof_tx_ports]\n"
|
||||||
" -r [nof_rx_ports]\n", prog);
|
" -r [nof_rx_ports] -g [scaling]\n", prog);
|
||||||
printf("\t-n num_symbols [Default %d]\n", nof_symbols);
|
printf("\t-n num_symbols [Default %d]\n", nof_symbols);
|
||||||
printf("\t-c codebook_idx [Default %d]\n", codebook_idx);
|
printf("\t-c codebook_idx [Default %d]\n", codebook_idx);
|
||||||
printf("\t-s SNR in dB [Default %.1fdB]*\n", snr_db);
|
printf("\t-s SNR in dB [Default %.1fdB]*\n", snr_db);
|
||||||
|
printf("\t-g Scaling [Default %.1f]*\n", scaling);
|
||||||
printf("\t-d decoder type [zf|mmse] [Default %s]\n", decoder_type_name);
|
printf("\t-d decoder type [zf|mmse] [Default %s]\n", decoder_type_name);
|
||||||
printf("\n");
|
printf("\n");
|
||||||
printf("* Performance test example:\n\t for snr in {0..20..1}; do ./precoding_test -m single -s $snr; done; \n\n", decoder_type_name);
|
printf("* Performance test example:\n\t for snr in {0..20..1}; do ./precoding_test -m single -s $snr; done; \n\n", decoder_type_name);
|
||||||
|
@ -59,7 +61,7 @@ void usage(char *prog) {
|
||||||
|
|
||||||
void parse_args(int argc, char **argv) {
|
void parse_args(int argc, char **argv) {
|
||||||
int opt;
|
int opt;
|
||||||
while ((opt = getopt(argc, argv, "mplnrcds")) != -1) {
|
while ((opt = getopt(argc, argv, "mplnrcdsg")) != -1) {
|
||||||
switch (opt) {
|
switch (opt) {
|
||||||
case 'n':
|
case 'n':
|
||||||
nof_symbols = atoi(argv[optind]);
|
nof_symbols = atoi(argv[optind]);
|
||||||
|
@ -85,6 +87,9 @@ void parse_args(int argc, char **argv) {
|
||||||
case 's':
|
case 's':
|
||||||
snr_db = (float) atof(argv[optind]);
|
snr_db = (float) atof(argv[optind]);
|
||||||
break;
|
break;
|
||||||
|
case 'g':
|
||||||
|
scaling = (float) atof(argv[optind]);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
usage(argv[0]);
|
usage(argv[0]);
|
||||||
exit(-1);
|
exit(-1);
|
||||||
|
@ -149,7 +154,7 @@ void populate_channel(srslte_mimo_type_t type, cf_t *h[SRSLTE_MAX_PORTS][SRSLTE_
|
||||||
|
|
||||||
static void awgn(cf_t *y[SRSLTE_MAX_PORTS], uint32_t n, float snr) {
|
static void awgn(cf_t *y[SRSLTE_MAX_PORTS], uint32_t n, float snr) {
|
||||||
int i;
|
int i;
|
||||||
float std_dev = powf(10, - (snr + 3.0f) / 20.0f);
|
float std_dev = powf(10, - (snr + 3.0f) / 20.0f) * scaling;
|
||||||
|
|
||||||
for (i = 0; i < nof_rx_ports; i++) {
|
for (i = 0; i < nof_rx_ports; i++) {
|
||||||
srslte_ch_awgn_c(y[i], y[i], std_dev, n);
|
srslte_ch_awgn_c(y[i], y[i], std_dev, n);
|
||||||
|
@ -250,7 +255,7 @@ int main(int argc, char **argv) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Execute Precoding (Tx) */
|
/* Execute Precoding (Tx) */
|
||||||
if (srslte_precoding_type(x, y, nof_layers, nof_tx_ports, codebook_idx, nof_symbols, type) < 0) {
|
if (srslte_precoding_type(x, y, nof_layers, nof_tx_ports, codebook_idx, nof_symbols, scaling, type) < 0) {
|
||||||
fprintf(stderr, "Error layer mapper encoder\n");
|
fprintf(stderr, "Error layer mapper encoder\n");
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
|
@ -285,8 +290,8 @@ int main(int argc, char **argv) {
|
||||||
/* predecoding / equalization */
|
/* predecoding / equalization */
|
||||||
struct timeval t[3];
|
struct timeval t[3];
|
||||||
gettimeofday(&t[1], NULL);
|
gettimeofday(&t[1], NULL);
|
||||||
srslte_predecoding_type_multi(r, h, xr, nof_rx_ports, nof_tx_ports, nof_layers,
|
srslte_predecoding_type(r, h, xr, nof_rx_ports, nof_tx_ports, nof_layers,
|
||||||
codebook_idx, nof_re, type, powf(10, -snr_db/10));
|
codebook_idx, nof_re, type, scaling, powf(10, -snr_db / 10));
|
||||||
gettimeofday(&t[2], NULL);
|
gettimeofday(&t[2], NULL);
|
||||||
get_time_interval(t);
|
get_time_interval(t);
|
||||||
|
|
||||||
|
|
|
@ -497,10 +497,10 @@ int srslte_pbch_decode(srslte_pbch_t *q, cf_t *slot1_symbols, cf_t *ce_slot1[SRS
|
||||||
/* in control channels, only diversity is supported */
|
/* in control channels, only diversity is supported */
|
||||||
if (nant == 1) {
|
if (nant == 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(q->symbols[0], q->ce[0], q->d, q->nof_symbols, 1.0f, noise_estimate);
|
||||||
} else {
|
} else {
|
||||||
srslte_predecoding_diversity(q->symbols[0], q->ce, x, nant,
|
srslte_predecoding_diversity(q->symbols[0], q->ce, x, nant,
|
||||||
q->nof_symbols);
|
q->nof_symbols, 1.0f);
|
||||||
srslte_layerdemap_diversity(x, q->d, nant, q->nof_symbols / nant);
|
srslte_layerdemap_diversity(x, q->d, nant, q->nof_symbols / nant);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -591,7 +591,7 @@ int srslte_pbch_encode(srslte_pbch_t *q, uint8_t bch_payload[SRSLTE_BCH_PAYLOAD_
|
||||||
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, q->symbols, 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, 1.0f);
|
||||||
} 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));
|
||||||
}
|
}
|
||||||
|
|
|
@ -219,9 +219,9 @@ int srslte_pcfich_decode_multi(srslte_pcfich_t *q, cf_t *sf_symbols[SRSLTE_MAX_P
|
||||||
/* 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_multi(q_symbols, q_ce[0], q->d, q->nof_rx_antennas, q->nof_symbols, noise_estimate);
|
srslte_predecoding_single_multi(q_symbols, q_ce[0], q->d, q->nof_rx_antennas, q->nof_symbols, 1.0f, noise_estimate);
|
||||||
} else {
|
} else {
|
||||||
srslte_predecoding_diversity_multi(q_symbols, q_ce, x, q->nof_rx_antennas, q->cell.nof_ports, q->nof_symbols);
|
srslte_predecoding_diversity_multi(q_symbols, q_ce, x, q->nof_rx_antennas, q->cell.nof_ports, q->nof_symbols, 1.0f);
|
||||||
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -278,7 +278,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, q_symbols, q->cell.nof_ports, q->nof_symbols / q->cell.nof_ports);
|
srslte_precoding_diversity(x, q_symbols, q->cell.nof_ports, q->nof_symbols / q->cell.nof_ports, 1.0f);
|
||||||
} 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));
|
||||||
}
|
}
|
||||||
|
|
|
@ -485,9 +485,9 @@ int srslte_pdcch_extract_llr_multi(srslte_pdcch_t *q, cf_t *sf_symbols[SRSLTE_MA
|
||||||
/* 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_multi(q->symbols, q->ce[0], q->d, q->nof_rx_antennas, nof_symbols, noise_estimate/2);
|
srslte_predecoding_single_multi(q->symbols, q->ce[0], q->d, q->nof_rx_antennas, nof_symbols, 1.0f, noise_estimate/2);
|
||||||
} else {
|
} else {
|
||||||
srslte_predecoding_diversity_multi(q->symbols, q->ce, x, q->nof_rx_antennas, q->cell.nof_ports, nof_symbols);
|
srslte_predecoding_diversity_multi(q->symbols, q->ce, x, q->nof_rx_antennas, q->cell.nof_ports, nof_symbols, 1.0f);
|
||||||
srslte_layerdemap_diversity(x, q->d, q->cell.nof_ports, nof_symbols / q->cell.nof_ports);
|
srslte_layerdemap_diversity(x, q->d, q->cell.nof_ports, nof_symbols / q->cell.nof_ports);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -618,7 +618,7 @@ int srslte_pdcch_encode(srslte_pdcch_t *q, srslte_dci_msg_t *msg, srslte_dci_loc
|
||||||
/* 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, nof_symbols);
|
srslte_layermap_diversity(q->d, x, q->cell.nof_ports, nof_symbols);
|
||||||
srslte_precoding_diversity(x, q->symbols, q->cell.nof_ports, nof_symbols / q->cell.nof_ports);
|
srslte_precoding_diversity(x, q->symbols, q->cell.nof_ports, nof_symbols / q->cell.nof_ports, 1.0f);
|
||||||
} else {
|
} else {
|
||||||
memcpy(q->symbols[0], q->d, nof_symbols * sizeof(cf_t));
|
memcpy(q->symbols[0], q->d, nof_symbols * sizeof(cf_t));
|
||||||
}
|
}
|
||||||
|
|
|
@ -386,6 +386,12 @@ int srslte_pdsch_set_rnti(srslte_pdsch_t *q, uint16_t rnti) {
|
||||||
return SRSLTE_SUCCESS;
|
return SRSLTE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void srslte_pdsch_set_power_allocation(srslte_pdsch_t *q, float rho_a) {
|
||||||
|
if (q) {
|
||||||
|
q->rho_a = rho_a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void srslte_pdsch_free_rnti(srslte_pdsch_t* q, uint16_t rnti)
|
void srslte_pdsch_free_rnti(srslte_pdsch_t* q, uint16_t rnti)
|
||||||
{
|
{
|
||||||
uint32_t rnti_idx = q->is_ue?0:rnti;
|
uint32_t rnti_idx = q->is_ue?0:rnti;
|
||||||
|
@ -680,9 +686,14 @@ int srslte_pdsch_decode(srslte_pdsch_t *q,
|
||||||
memset(&x[cfg->nof_layers], 0, sizeof(cf_t*) * (SRSLTE_MAX_LAYERS - cfg->nof_layers));
|
memset(&x[cfg->nof_layers], 0, sizeof(cf_t*) * (SRSLTE_MAX_LAYERS - cfg->nof_layers));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float pdsch_scaling = 1.0f;
|
||||||
|
if (q->rho_a != 0.0f) {
|
||||||
|
pdsch_scaling = 1/q->rho_a;
|
||||||
|
}
|
||||||
|
|
||||||
// Pre-decoder
|
// Pre-decoder
|
||||||
if (srslte_predecoding_type_multi(q->symbols, q->ce, x, q->nof_rx_antennas, q->cell.nof_ports, cfg->nof_layers,
|
if (srslte_predecoding_type(q->symbols, q->ce, x, q->nof_rx_antennas, q->cell.nof_ports, cfg->nof_layers,
|
||||||
cfg->codebook_idx, cfg->nbits[0].nof_re, cfg->mimo_type, noise_estimate)<0) {
|
cfg->codebook_idx, cfg->nbits[0].nof_re, cfg->mimo_type, pdsch_scaling, noise_estimate)<0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -822,7 +833,7 @@ int srslte_pdsch_encode(srslte_pdsch_t *q,
|
||||||
|
|
||||||
/* Precode */
|
/* Precode */
|
||||||
srslte_precoding_type(x, q->symbols, cfg->nof_layers, q->cell.nof_ports, cfg->codebook_idx,
|
srslte_precoding_type(x, q->symbols, cfg->nof_layers, q->cell.nof_ports, cfg->codebook_idx,
|
||||||
nof_symbols, cfg->mimo_type);
|
nof_symbols, 1.0f, cfg->mimo_type);
|
||||||
} else {
|
} else {
|
||||||
memcpy(q->symbols[0], q->d[0], cfg->nbits[0].nof_re * sizeof(cf_t));
|
memcpy(q->symbols[0], q->d[0], cfg->nbits[0].nof_re * sizeof(cf_t));
|
||||||
}
|
}
|
||||||
|
|
|
@ -239,9 +239,9 @@ int srslte_phich_decode(srslte_phich_t *q, cf_t *sf_symbols[SRSLTE_MAX_PORTS],
|
||||||
/* 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_multi(q_sf_symbols, q_ce[0], q->d0, q->nof_rx_antennas, 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, 1.0f, noise_estimate);
|
||||||
} else {
|
} else {
|
||||||
srslte_predecoding_diversity_multi(q_sf_symbols, q_ce, x, q->nof_rx_antennas, q->cell.nof_ports, SRSLTE_PHICH_MAX_NSYMB);
|
srslte_predecoding_diversity_multi(q_sf_symbols, q_ce, x, q->nof_rx_antennas, q->cell.nof_ports, SRSLTE_PHICH_MAX_NSYMB, 1.0f);
|
||||||
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);
|
||||||
|
@ -405,7 +405,7 @@ int srslte_phich_encode(srslte_phich_t *q, uint8_t ack, uint32_t ngroup, uint32_
|
||||||
if (q->cell.nof_ports > 1) {
|
if (q->cell.nof_ports > 1) {
|
||||||
srslte_layermap_diversity(q->d0, x, q->cell.nof_ports, SRSLTE_PHICH_MAX_NSYMB);
|
srslte_layermap_diversity(q->d0, x, q->cell.nof_ports, SRSLTE_PHICH_MAX_NSYMB);
|
||||||
srslte_precoding_diversity(x, symbols_precoding, q->cell.nof_ports,
|
srslte_precoding_diversity(x, symbols_precoding, q->cell.nof_ports,
|
||||||
SRSLTE_PHICH_MAX_NSYMB / q->cell.nof_ports);
|
SRSLTE_PHICH_MAX_NSYMB / q->cell.nof_ports, 1.0f);
|
||||||
/**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->sf_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));
|
||||||
|
|
|
@ -378,7 +378,7 @@ int srslte_pmch_decode_multi(srslte_pmch_t *q,
|
||||||
}
|
}
|
||||||
|
|
||||||
// No tx diversity in MBSFN
|
// No tx diversity in MBSFN
|
||||||
srslte_predecoding_single_multi(q->symbols, q->ce[0], q->d, q->nof_rx_antennas, cfg->nbits[0].nof_re, noise_estimate);
|
srslte_predecoding_single_multi(q->symbols, q->ce[0], q->d, q->nof_rx_antennas, cfg->nbits[0].nof_re, 1.0f, noise_estimate);
|
||||||
|
|
||||||
if (SRSLTE_VERBOSE_ISDEBUG()) {
|
if (SRSLTE_VERBOSE_ISDEBUG()) {
|
||||||
DEBUG("SAVED FILE subframe.dat: received subframe symbols\n");
|
DEBUG("SAVED FILE subframe.dat: received subframe symbols\n");
|
||||||
|
|
|
@ -787,7 +787,7 @@ int srslte_pucch_decode(srslte_pucch_t* q, srslte_pucch_format_t format,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Equalization
|
// Equalization
|
||||||
srslte_predecoding_single(q->z_tmp, q->ce, q->z, nof_re, noise_estimate);
|
srslte_predecoding_single(q->z_tmp, q->ce, q->z, nof_re, 1.0f, noise_estimate);
|
||||||
|
|
||||||
// Perform ML-decoding
|
// Perform ML-decoding
|
||||||
float corr=0, corr_max=-1e9;
|
float corr=0, corr_max=-1e9;
|
||||||
|
|
|
@ -596,7 +596,7 @@ int srslte_pusch_decode(srslte_pusch_t *q,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Equalization
|
// Equalization
|
||||||
srslte_predecoding_single(q->d, q->ce, q->z, cfg->nbits.nof_re, noise_estimate);
|
srslte_predecoding_single(q->d, q->ce, q->z, cfg->nbits.nof_re, 1.0f, noise_estimate);
|
||||||
|
|
||||||
// DFT predecoding
|
// DFT predecoding
|
||||||
srslte_dft_precoding(&q->dft_precoding, q->z, q->d, cfg->grant.L_prb, cfg->nbits.nof_symb);
|
srslte_dft_precoding(&q->dft_precoding, q->z, q->d, cfg->grant.L_prb, cfg->nbits.nof_symb);
|
||||||
|
|
|
@ -53,7 +53,7 @@ srslte_cell_t cell = {
|
||||||
|
|
||||||
char mimo_type_str [32] = "single";
|
char mimo_type_str [32] = "single";
|
||||||
srslte_mimo_type_t mimo_type = SRSLTE_MIMO_TYPE_SINGLE_ANTENNA;
|
srslte_mimo_type_t mimo_type = SRSLTE_MIMO_TYPE_SINGLE_ANTENNA;
|
||||||
uint32_t cfi = 2;
|
uint32_t cfi = 1;
|
||||||
uint32_t mcs[SRSLTE_MAX_CODEWORDS] = {0, 0};
|
uint32_t mcs[SRSLTE_MAX_CODEWORDS] = {0, 0};
|
||||||
uint32_t subframe = 1;
|
uint32_t subframe = 1;
|
||||||
int rv_idx[SRSLTE_MAX_CODEWORDS] = {0, 1};
|
int rv_idx[SRSLTE_MAX_CODEWORDS] = {0, 1};
|
||||||
|
@ -496,7 +496,9 @@ int main(int argc, char **argv) {
|
||||||
if (grant.tb_en[tb]) {
|
if (grant.tb_en[tb]) {
|
||||||
for (int byte = 0; byte < grant.mcs[tb].tbs / 8; byte++) {
|
for (int byte = 0; byte < grant.mcs[tb].tbs / 8; byte++) {
|
||||||
if (data_tx[tb][byte] != data_rx[tb][byte]) {
|
if (data_tx[tb][byte] != data_rx[tb][byte]) {
|
||||||
ERROR("Found BYTE error in TB %d (%02X != %02X), quiting...", tb, data_tx[tb][byte], data_rx[tb][byte]);
|
ERROR("Found BYTE (%d) error in TB %d (%02X != %02X), quiting...", byte, tb, data_tx[tb][byte], data_rx[tb][byte]);
|
||||||
|
printf("Tx: "); srslte_vec_fprint_byte(stdout, data_tx[tb], grant.mcs[tb].tbs / 8);
|
||||||
|
printf("Rx: "); srslte_vec_fprint_byte(stdout, data_rx[tb], grant.mcs[tb].tbs / 8);
|
||||||
ret = SRSLTE_ERROR;
|
ret = SRSLTE_ERROR;
|
||||||
goto quit;
|
goto quit;
|
||||||
}
|
}
|
||||||
|
|
|
@ -308,7 +308,12 @@ void srslte_ue_dl_set_non_mbsfn_region(srslte_ue_dl_t *q,
|
||||||
srslte_ofdm_set_non_mbsfn_region(&q->fft_mbsfn, non_mbsfn_region_length);
|
srslte_ofdm_set_non_mbsfn_region(&q->fft_mbsfn, non_mbsfn_region_length);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void srslte_ue_dl_set_power_alloc (srslte_ue_dl_t *q, float rho_a, float rho_b) {
|
||||||
|
if (q) {
|
||||||
|
srslte_pdsch_set_power_allocation(&q->pdsch, rho_a);
|
||||||
|
q->rho_b = rho_b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void srslte_ue_dl_reset(srslte_ue_dl_t *q) {
|
void srslte_ue_dl_reset(srslte_ue_dl_t *q) {
|
||||||
for(int i = 0; i < SRSLTE_MAX_CODEWORDS; i++){
|
for(int i = 0; i < SRSLTE_MAX_CODEWORDS; i++){
|
||||||
|
|
Loading…
Reference in New Issue