Add PDSCH precoder functions, fix pusch_rx for 2 rx antennas, fix nr_dlsim for 2x1 MIMO simulation
This commit is contained in:
committed by
Thomas Schlichter
parent
3b2d50374a
commit
e72d0483b4
@@ -261,13 +261,14 @@ static inline int rxtx(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx, int frame_t
|
|||||||
L1_nr_prach_procedures(gNB,frame_rx,slot_rx);
|
L1_nr_prach_procedures(gNB,frame_rx,slot_rx);
|
||||||
|
|
||||||
//apply the rx signal rotation here
|
//apply the rx signal rotation here
|
||||||
apply_nr_rotation_ul(&gNB->frame_parms,
|
for (int aa = 0; aa < gNB->frame_parms.nb_antennas_rx; aa++) {
|
||||||
gNB->common_vars.rxdataF[0],
|
apply_nr_rotation_ul(&gNB->frame_parms,
|
||||||
slot_rx,
|
gNB->common_vars.rxdataF[aa],
|
||||||
0,
|
slot_rx,
|
||||||
gNB->frame_parms.Ncp==EXTENDED?12:14,
|
0,
|
||||||
gNB->frame_parms.ofdm_symbol_size);
|
gNB->frame_parms.Ncp==EXTENDED?12:14,
|
||||||
|
gNB->frame_parms.ofdm_symbol_size);
|
||||||
|
}
|
||||||
phy_procedures_gNB_uespec_RX(gNB, frame_rx, slot_rx);
|
phy_procedures_gNB_uespec_RX(gNB, frame_rx, slot_rx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -284,9 +284,9 @@ int nr_init_frame_parms(nfapi_nr_config_request_scf_t* cfg,
|
|||||||
|
|
||||||
fp->slots_per_frame = 10* fp->slots_per_subframe;
|
fp->slots_per_frame = 10* fp->slots_per_subframe;
|
||||||
|
|
||||||
fp->nb_antenna_ports_gNB = cfg->carrier_config.num_tx_ant.value;// It corresponds to pdsch_AntennaPorts
|
fp->nb_antenna_ports_gNB = 1; // It corresponds to the number of common antenna ports
|
||||||
fp->nb_antennas_rx = cfg->carrier_config.num_rx_ant.value; // It denotes the number of rx antennas at gNB
|
fp->nb_antennas_rx = cfg->carrier_config.num_rx_ant.value; // It denotes the number of rx antennas at gNB
|
||||||
fp->nb_antennas_tx = 1; // It corresponds to the number of UE Tx antennas
|
fp->nb_antennas_tx = cfg->carrier_config.num_tx_ant.value; // It corresponds to pdsch_AntennaPorts
|
||||||
|
|
||||||
fp->symbols_per_slot = ((Ncp == NORMAL)? 14 : 12); // to redefine for different slot formats
|
fp->symbols_per_slot = ((Ncp == NORMAL)? 14 : 12); // to redefine for different slot formats
|
||||||
fp->samples_per_subframe_wCP = fp->ofdm_symbol_size * fp->symbols_per_slot * fp->slots_per_subframe;
|
fp->samples_per_subframe_wCP = fp->ofdm_symbol_size * fp->symbols_per_slot * fp->slots_per_subframe;
|
||||||
|
|||||||
@@ -22,6 +22,102 @@
|
|||||||
#include "nr_modulation.h"
|
#include "nr_modulation.h"
|
||||||
#include "PHY/NR_REFSIG/nr_mod_table.h"
|
#include "PHY/NR_REFSIG/nr_mod_table.h"
|
||||||
|
|
||||||
|
//Table 6.3.1.5-1 Precoding Matrix W 1 layer 2 antenna ports 'n' = -1 and 'o' = -j
|
||||||
|
char nr_W_1l_2p[6][2][1] = {
|
||||||
|
{{'1'}, {'0'}},//pmi 0
|
||||||
|
{{'0'}, {'1'}},
|
||||||
|
{{'1'}, {'1'}},
|
||||||
|
{{'1'}, {'n'}},
|
||||||
|
{{'1'}, {'j'}},
|
||||||
|
{{'1'}, {'o'}}//pmi 5
|
||||||
|
};
|
||||||
|
|
||||||
|
//Table 6.3.1.5-3 Precoding Matrix W 1 layer 4 antenna ports 'n' = -1 and 'o' = -j
|
||||||
|
char nr_W_1l_4p[28][4][1] = {
|
||||||
|
{{'1'}, {'0'}, {'0'}, {'0'}},//pmi 0
|
||||||
|
{{'0'}, {'1'}, {'0'}, {'0'}},
|
||||||
|
{{'0'}, {'0'}, {'1'}, {'0'}},
|
||||||
|
{{'0'}, {'0'}, {'0'}, {'1'}},
|
||||||
|
{{'1'}, {'0'}, {'1'}, {'0'}},
|
||||||
|
{{'1'}, {'0'}, {'n'}, {'0'}},
|
||||||
|
{{'1'}, {'0'}, {'j'}, {'0'}},
|
||||||
|
{{'1'}, {'0'}, {'o'}, {'0'}},//pmi 7
|
||||||
|
{{'0'}, {'1'}, {'0'}, {'1'}},//pmi 8
|
||||||
|
{{'0'}, {'1'}, {'0'}, {'n'}},
|
||||||
|
{{'0'}, {'1'}, {'0'}, {'j'}},
|
||||||
|
{{'0'}, {'1'}, {'0'}, {'o'}},
|
||||||
|
{{'1'}, {'1'}, {'1'}, {'1'}},
|
||||||
|
{{'1'}, {'1'}, {'j'}, {'j'}},
|
||||||
|
{{'1'}, {'1'}, {'n'}, {'n'}},
|
||||||
|
{{'1'}, {'1'}, {'o'}, {'o'}},
|
||||||
|
{{'1'}, {'j'}, {'1'}, {'j'}},//pmi 16
|
||||||
|
{{'1'}, {'j'}, {'j'}, {'n'}},
|
||||||
|
{{'1'}, {'j'}, {'n'}, {'o'}},
|
||||||
|
{{'1'}, {'j'}, {'o'}, {'1'}},
|
||||||
|
{{'1'}, {'n'}, {'1'}, {'n'}},
|
||||||
|
{{'1'}, {'n'}, {'j'}, {'o'}},
|
||||||
|
{{'1'}, {'n'}, {'n'}, {'1'}},
|
||||||
|
{{'1'}, {'n'}, {'o'}, {'j'}},//pmi 23
|
||||||
|
{{'1'}, {'o'}, {'1'}, {'o'}},//pmi 24
|
||||||
|
{{'1'}, {'o'}, {'j'}, {'1'}},
|
||||||
|
{{'1'}, {'o'}, {'n'}, {'j'}},
|
||||||
|
{{'1'}, {'o'}, {'o'}, {'n'}}//pmi 27
|
||||||
|
};
|
||||||
|
|
||||||
|
//Table 6.3.1.5-4 Precoding Matrix W 2 antenna ports layers 2 'n' = -1 and 'o' = -j
|
||||||
|
char nr_W_2l_2p[3][2][2] = {
|
||||||
|
{{'1', '0'}, {'0', '1'}},//pmi 0
|
||||||
|
{{'1', '1'}, {'1', 'n'}},
|
||||||
|
{{'1', '1'}, {'j', 'o'}} //pmi 2
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
//Table 6.3.1.5-5 Precoding Matrix W 2 layers 4 antenna ports 'n' = -1 and 'o' = -j
|
||||||
|
char nr_W_2l_4p[22][4][2] = {
|
||||||
|
{{'1', '0'}, {'0', '1'}, {'0', '0'}, {'0', '0'}},//pmi 0
|
||||||
|
{{'1', '0'}, {'0', '0'}, {'0', '1'}, {'0', '0'}},
|
||||||
|
{{'1', '0'}, {'0', '0'}, {'0', '0'}, {'0', '1'}},
|
||||||
|
{{'0', '0'}, {'1', '0'}, {'0', '1'}, {'0', '0'}},//pmi 3
|
||||||
|
{{'0', '0'}, {'1', '0'}, {'0', '0'}, {'0', '1'}},//pmi 4
|
||||||
|
{{'0', '0'}, {'0', '0'}, {'1', '0'}, {'0', '1'}},
|
||||||
|
{{'1', '0'}, {'0', '1'}, {'1', '0'}, {'0', 'o'}},
|
||||||
|
{{'1', '0'}, {'0', '1'}, {'1', '0'}, {'0', 'j'}},
|
||||||
|
{{'1', '0'}, {'0', '1'}, {'o', '0'}, {'0', '1'}},//pmi 8
|
||||||
|
{{'1', '0'}, {'0', '1'}, {'o', '0'}, {'0', 'n'}},
|
||||||
|
{{'1', '0'}, {'0', '1'}, {'n', '0'}, {'0', 'o'}},
|
||||||
|
{{'1', '0'}, {'0', '1'}, {'n', '0'}, {'0', 'j'}},//pmi 11
|
||||||
|
{{'1', '0'}, {'0', '1'}, {'j', '0'}, {'0', '1'}},//pmi 12
|
||||||
|
{{'1', '0'}, {'0', '1'}, {'j', '0'}, {'0', 'n'}},
|
||||||
|
{{'1', '1'}, {'1', '1'}, {'1', 'n'}, {'1', 'n'}},
|
||||||
|
{{'1', '1'}, {'1', '1'}, {'j', 'o'}, {'j', 'o'}},//pmi 15
|
||||||
|
{{'1', '1'}, {'j', 'j'}, {'1', 'n'}, {'j', 'o'}},//pmi 16
|
||||||
|
{{'1', '1'}, {'j', 'j'}, {'j', 'o'}, {'n', '1'}},
|
||||||
|
{{'1', '1'}, {'n', 'n'}, {'1', 'n'}, {'n', '1'}},
|
||||||
|
{{'1', '1'}, {'n', 'n'}, {'j', 'o'}, {'o', 'j'}},//pmi 19
|
||||||
|
{{'1', '1'}, {'o', 'o'}, {'1', 'n'}, {'o', 'j'}},
|
||||||
|
{{'1', '1'}, {'o', 'o'}, {'j', 'o'}, {'1', 'n'}}//pmi 21
|
||||||
|
};
|
||||||
|
|
||||||
|
//Table 6.3.1.5-6 Precoding Matrix W 3 layers 4 antenna ports 'n' = -1 and 'o' = -j
|
||||||
|
char nr_W_3l_4p[7][4][3] = {
|
||||||
|
{{'1', '0', '0'}, {'0', '1', '0'}, {'0', '0', '1'},{'0', '0', '0'}},//pmi 0
|
||||||
|
{{'1', '0', '0'}, {'0', '1', '0'}, {'1', '0', '0'},{'0', '0', '1'}},
|
||||||
|
{{'1', '0', '0'}, {'0', '1', '0'}, {'n', '0', '0'},{'0', '0', '1'}},
|
||||||
|
{{'1', '1', '1'}, {'1', 'n', '1'}, {'1', '1', 'n'},{'1', 'n', 'n'}},//pmi 3
|
||||||
|
{{'1', '1', '1'}, {'1', 'n', '1'}, {'j', 'j', 'o'},{'j', 'o', 'o'}},//pmi 4
|
||||||
|
{{'1', '1', '1'}, {'n', '1', 'n'}, {'1', '1', 'n'},{'n', '1', '1'}},
|
||||||
|
{{'1', '1', '1'}, {'n', '1', 'n'}, {'j', 'j', 'o'},{'o', 'j', 'j'}}
|
||||||
|
};
|
||||||
|
|
||||||
|
//Table 6.3.1.5-7 Precoding Matrix W 4 layers 4 antenna ports 'n' = -1 and 'o' = -j
|
||||||
|
char nr_W_4l_4p[5][4][4] = {
|
||||||
|
{{'1', '0', '0', '0'}, {'0', '1', '0', '0'}, {'0', '0', '1', '0'}, {'0', '0', '0', '1'}},//pmi 0
|
||||||
|
{{'1', '1', '0', '0'}, {'0', '0', '1', '1'}, {'1', 'n', '0', '0'}, {'0', '0', '1', 'n'}},
|
||||||
|
{{'1', '1', '0', '0'}, {'0', '0', '1', '1'}, {'j', 'o', '0', '0'}, {'0', '0', 'j', 'o'}},
|
||||||
|
{{'1', '1', '1', '1'}, {'1', 'n', '1', 'n'}, {'1', '1', 'n', 'n'}, {'1', 'n', 'n', '1'}},//pmi 3
|
||||||
|
{{'1', '1', '1', '1'}, {'1', 'n', '1', 'n'}, {'j', 'j', 'o', 'o'}, {'j', 'o', 'o', 'j'}}//pmi 4
|
||||||
|
};
|
||||||
|
|
||||||
void nr_modulation(uint32_t *in,
|
void nr_modulation(uint32_t *in,
|
||||||
uint32_t length,
|
uint32_t length,
|
||||||
uint16_t mod_order,
|
uint16_t mod_order,
|
||||||
@@ -534,3 +630,44 @@ void init_symbol_rotation(NR_DL_FRAME_PARMS *fp,uint64_t CarrierFreq) {
|
|||||||
Ncpm1=Ncp;
|
Ncpm1=Ncp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int nr_layer_precoder(int16_t **datatx_F_precoding, char *prec_matrix, uint8_t n_layers, int32_t re_offset)
|
||||||
|
{
|
||||||
|
int32_t precodatatx_F = 0;
|
||||||
|
for (int al = 0; al<n_layers; al++){
|
||||||
|
|
||||||
|
int16_t antenna_re = datatx_F_precoding[al][re_offset<<1];
|
||||||
|
int16_t antenna_im = datatx_F_precoding[al][(re_offset<<1) +1];
|
||||||
|
|
||||||
|
switch (prec_matrix[al]) {
|
||||||
|
|
||||||
|
case '0': //multiply by zero
|
||||||
|
break;
|
||||||
|
|
||||||
|
case '1': //multiply by 1
|
||||||
|
((int16_t *) &precodatatx_F)[0] += antenna_re;
|
||||||
|
((int16_t *) &precodatatx_F)[1] += antenna_im;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'n': // multiply by -1
|
||||||
|
((int16_t *) &precodatatx_F)[0] -= antenna_re;
|
||||||
|
((int16_t *) &precodatatx_F)[1] -= antenna_im;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'j': //
|
||||||
|
((int16_t *) &precodatatx_F)[0] -= antenna_im;
|
||||||
|
((int16_t *) &precodatatx_F)[1] += antenna_re;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'o': // -j
|
||||||
|
((int16_t *) &precodatatx_F)[0] += antenna_im;
|
||||||
|
((int16_t *) &precodatatx_F)[1] -= antenna_re;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return precodatatx_F;
|
||||||
|
// normalize
|
||||||
|
/* ((int16_t *)precodatatx_F)[0] = (int16_t)((((int16_t *)precodatatx_F)[0]*ONE_OVER_SQRT2_Q15)>>15);
|
||||||
|
((int16_t *)precodatatx_F)[1] = (int16_t)((((int16_t *)precodatatx_F)[1]*ONE_OVER_SQRT2_Q15)>>15);*/
|
||||||
|
}
|
||||||
|
|||||||
@@ -28,7 +28,13 @@
|
|||||||
#include "PHY/NR_UE_TRANSPORT/nr_transport_ue.h"
|
#include "PHY/NR_UE_TRANSPORT/nr_transport_ue.h"
|
||||||
|
|
||||||
#define DMRS_MOD_ORDER 2
|
#define DMRS_MOD_ORDER 2
|
||||||
|
/*Precoding matices: W[pmi][antenna_port][layer]*/
|
||||||
|
extern char nr_W_1l_2p[6][2][1];
|
||||||
|
extern char nr_W_2l_2p[3][2][2];
|
||||||
|
extern char nr_W_1l_4p[28][4][1];
|
||||||
|
extern char nr_W_2l_4p[22][4][2];
|
||||||
|
extern char nr_W_3l_4p[7][4][3];
|
||||||
|
extern char nr_W_4l_4p[5][4][4];
|
||||||
/*! \brief Perform NR modulation. TS 38.211 V15.4.0 subclause 5.1
|
/*! \brief Perform NR modulation. TS 38.211 V15.4.0 subclause 5.1
|
||||||
@param[in] in, Pointer to input bits
|
@param[in] in, Pointer to input bits
|
||||||
@param[in] length, size of input bits
|
@param[in] length, size of input bits
|
||||||
@@ -118,4 +124,14 @@ void apply_nr_rotation_ul(NR_DL_FRAME_PARMS *frame_parms,
|
|||||||
int first_symbol,
|
int first_symbol,
|
||||||
int nsymb,
|
int nsymb,
|
||||||
int length);
|
int length);
|
||||||
|
|
||||||
|
/*! \brief Perform NR precoding. TS 38.211 V15.4.0 subclause 6.3.1.5
|
||||||
|
@param[in] datatx_F_precoding, Pointer to n_layers*re data array
|
||||||
|
@param[in] prec_matrix, Pointer to precoding matrix
|
||||||
|
@param[in] n_layers, number of DLSCH layers
|
||||||
|
*/
|
||||||
|
int nr_layer_precoder(int16_t **datatx_F_precoding,
|
||||||
|
char *prec_matrix,
|
||||||
|
uint8_t n_layers,
|
||||||
|
int32_t re_offset);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
|||||||
symbol_offset = gNB->frame_parms.ofdm_symbol_size*symbol;
|
symbol_offset = gNB->frame_parms.ofdm_symbol_size*symbol;
|
||||||
|
|
||||||
k = bwp_start_subcarrier;
|
k = bwp_start_subcarrier;
|
||||||
int re_offset = k;
|
int re_offset;
|
||||||
|
|
||||||
uint16_t nb_rb_pusch = pusch_pdu->rb_size;
|
uint16_t nb_rb_pusch = pusch_pdu->rb_size;
|
||||||
|
|
||||||
@@ -161,6 +161,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
|||||||
pil = (int16_t *)&pilot[0];
|
pil = (int16_t *)&pilot[0];
|
||||||
rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+nushift)];
|
rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+nushift)];
|
||||||
ul_ch = (int16_t *)&ul_ch_estimates[aarx][ch_offset];
|
ul_ch = (int16_t *)&ul_ch_estimates[aarx][ch_offset];
|
||||||
|
re_offset = k;
|
||||||
|
|
||||||
memset(ul_ch,0,4*(gNB->frame_parms.ofdm_symbol_size));
|
memset(ul_ch,0,4*(gNB->frame_parms.ofdm_symbol_size));
|
||||||
|
|
||||||
|
|||||||
@@ -142,6 +142,7 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
|
|||||||
uint32_t scrambled_output[NR_MAX_NB_CODEWORDS][NR_MAX_PDSCH_ENCODED_LENGTH>>5];
|
uint32_t scrambled_output[NR_MAX_NB_CODEWORDS][NR_MAX_PDSCH_ENCODED_LENGTH>>5];
|
||||||
int16_t **mod_symbs = (int16_t**)dlsch->mod_symbs;
|
int16_t **mod_symbs = (int16_t**)dlsch->mod_symbs;
|
||||||
int16_t **tx_layers = (int16_t**)dlsch->txdataF;
|
int16_t **tx_layers = (int16_t**)dlsch->txdataF;
|
||||||
|
int16_t **txdataF_precoding = (int16_t**)dlsch->txdataF_precoding;
|
||||||
int8_t Wf[2], Wt[2], l0, l_prime, l_overline, delta;
|
int8_t Wf[2], Wt[2], l0, l_prime, l_overline, delta;
|
||||||
uint8_t dmrs_Type = rel15->dmrsConfigType;
|
uint8_t dmrs_Type = rel15->dmrsConfigType;
|
||||||
int nb_re_dmrs;
|
int nb_re_dmrs;
|
||||||
@@ -266,9 +267,6 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/// Antenna port mapping
|
|
||||||
//to be moved to init phase potentially, for now tx_layers 1-8 are mapped on antenna ports 1000-1007
|
|
||||||
|
|
||||||
/// DMRS QPSK modulation
|
/// DMRS QPSK modulation
|
||||||
for (int l=rel15->StartSymbolIndex; l<rel15->StartSymbolIndex+rel15->NrOfSymbols; l++) {
|
for (int l=rel15->StartSymbolIndex; l<rel15->StartSymbolIndex+rel15->NrOfSymbols; l++) {
|
||||||
if (rel15->dlDmrsSymbPos & (1 << l)) {
|
if (rel15->dlDmrsSymbPos & (1 << l)) {
|
||||||
@@ -292,7 +290,9 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
|
|||||||
uint16_t start_sc = frame_parms->first_carrier_offset + (rel15->rbStart+rel15->BWPStart)*NR_NB_SC_PER_RB;
|
uint16_t start_sc = frame_parms->first_carrier_offset + (rel15->rbStart+rel15->BWPStart)*NR_NB_SC_PER_RB;
|
||||||
if (start_sc >= frame_parms->ofdm_symbol_size)
|
if (start_sc >= frame_parms->ofdm_symbol_size)
|
||||||
start_sc -= frame_parms->ofdm_symbol_size;
|
start_sc -= frame_parms->ofdm_symbol_size;
|
||||||
|
|
||||||
|
int txdataF_offset = (slot%2)*frame_parms->samples_per_slot_wCP;
|
||||||
|
|
||||||
#ifdef DEBUG_DLSCH_MAPPING
|
#ifdef DEBUG_DLSCH_MAPPING
|
||||||
printf("PDSCH resource mapping started (start SC %d\tstart symbol %d\tN_PRB %d\tnb_re %d,nb_layers %d)\n",
|
printf("PDSCH resource mapping started (start SC %d\tstart symbol %d\tN_PRB %d\tnb_re %d,nb_layers %d)\n",
|
||||||
start_sc, rel15->StartSymbolIndex, rel15->rbSize, nb_re,rel15->nrOfLayers);
|
start_sc, rel15->StartSymbolIndex, rel15->rbSize, nb_re,rel15->nrOfLayers);
|
||||||
@@ -313,9 +313,7 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
|
|||||||
1+dmrs_Type,ap, Wt[0], Wt[1], Wf[0], Wf[1], delta, l_prime, l0, dmrs_symbol);
|
1+dmrs_Type,ap, Wt[0], Wt[1], Wf[0], Wf[1], delta, l_prime, l0, dmrs_symbol);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
uint16_t m=0, dmrs_idx=0, k=0;
|
uint16_t m=0, dmrs_idx=0;
|
||||||
|
|
||||||
int txdataF_offset = (slot%2)*frame_parms->samples_per_slot_wCP;
|
|
||||||
|
|
||||||
// Loop Over OFDM symbols:
|
// Loop Over OFDM symbols:
|
||||||
for (int l=rel15->StartSymbolIndex; l<rel15->StartSymbolIndex+rel15->NrOfSymbols; l++) {
|
for (int l=rel15->StartSymbolIndex; l<rel15->StartSymbolIndex+rel15->NrOfSymbols; l++) {
|
||||||
@@ -349,7 +347,7 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
|
|||||||
nr_modulation(pdsch_dmrs[l][0], (n_ptrs<<1), DMRS_MOD_ORDER, mod_ptrs);
|
nr_modulation(pdsch_dmrs[l][0], (n_ptrs<<1), DMRS_MOD_ORDER, mod_ptrs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
k = start_sc;
|
uint16_t k = start_sc;
|
||||||
// Loop Over SCs:
|
// Loop Over SCs:
|
||||||
for (int i=0; i<rel15->rbSize*NR_NB_SC_PER_RB; i++) {
|
for (int i=0; i<rel15->rbSize*NR_NB_SC_PER_RB; i++) {
|
||||||
/* check if cuurent RE is PTRS RE*/
|
/* check if cuurent RE is PTRS RE*/
|
||||||
@@ -369,12 +367,12 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
|
|||||||
|
|
||||||
/* Map DMRS Symbol */
|
/* Map DMRS Symbol */
|
||||||
if ( ( dmrs_symbol_map & (1 << l) ) && (k == ((start_sc+get_dmrs_freq_idx(n, k_prime, delta, dmrs_Type))%(frame_parms->ofdm_symbol_size)))) {
|
if ( ( dmrs_symbol_map & (1 << l) ) && (k == ((start_sc+get_dmrs_freq_idx(n, k_prime, delta, dmrs_Type))%(frame_parms->ofdm_symbol_size)))) {
|
||||||
((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)] = (Wt[l_prime]*Wf[k_prime]*amp*mod_dmrs[l][dmrs_idx<<1]) >> 15;
|
txdataF_precoding[ap][((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)] = (Wt[l_prime]*Wf[k_prime]*amp*mod_dmrs[l][dmrs_idx<<1]) >> 15;
|
||||||
((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)] = (Wt[l_prime]*Wf[k_prime]*amp*mod_dmrs[l][(dmrs_idx<<1) + 1]) >> 15;
|
txdataF_precoding[ap][((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)] = (Wt[l_prime]*Wf[k_prime]*amp*mod_dmrs[l][(dmrs_idx<<1) + 1]) >> 15;
|
||||||
#ifdef DEBUG_DLSCH_MAPPING
|
#ifdef DEBUG_DLSCH_MAPPING
|
||||||
printf("dmrs_idx %d\t l %d \t k %d \t k_prime %d \t n %d \t txdataF: %d %d\n",
|
printf("dmrs_idx %d\t l %d \t k %d \t k_prime %d \t n %d \t txdataF: %d %d\n",
|
||||||
dmrs_idx, l, k, k_prime, n, ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)],
|
dmrs_idx, l, k, k_prime, n, txdataF_precoding[ap][((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)],
|
||||||
((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)]);
|
txdataF_precoding[ap][((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)]);
|
||||||
#endif
|
#endif
|
||||||
dmrs_idx++;
|
dmrs_idx++;
|
||||||
k_prime++;
|
k_prime++;
|
||||||
@@ -383,8 +381,8 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
|
|||||||
}
|
}
|
||||||
/* Map PTRS Symbol */
|
/* Map PTRS Symbol */
|
||||||
else if(is_ptrs_re){
|
else if(is_ptrs_re){
|
||||||
((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)] = (beta_ptrs*amp*mod_ptrs[ptrs_idx<<1]) >> 15;
|
txdataF_precoding[ap][((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)] = (beta_ptrs*amp*mod_ptrs[ptrs_idx<<1]) >> 15;
|
||||||
((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)] = (beta_ptrs*amp*mod_ptrs[(ptrs_idx<<1) + 1])>> 15;
|
txdataF_precoding[ap][((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)] = (beta_ptrs*amp*mod_ptrs[(ptrs_idx<<1) + 1])>> 15;
|
||||||
#ifdef DEBUG_DLSCH_MAPPING
|
#ifdef DEBUG_DLSCH_MAPPING
|
||||||
printf("ptrs_idx %d\t l %d \t k %d \t k_prime %d \t n %d \t txdataF: %d %d\n",
|
printf("ptrs_idx %d\t l %d \t k %d \t k_prime %d \t n %d \t txdataF: %d %d\n",
|
||||||
ptrs_idx, l, k, k_prime, n, ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)],
|
ptrs_idx, l, k, k_prime, n, ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)],
|
||||||
@@ -393,17 +391,20 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
|
|||||||
ptrs_idx++;
|
ptrs_idx++;
|
||||||
}
|
}
|
||||||
/* Map DATA Symbol */
|
/* Map DATA Symbol */
|
||||||
else {
|
else if( (!(dmrs_symbol_map & (1 << l))) || allowed_xlsch_re_in_dmrs_symbol(k,start_sc,frame_parms->ofdm_symbol_size,rel15->numDmrsCdmGrpsNoData,dmrs_Type)) {
|
||||||
if( (!(dmrs_symbol_map & (1 << l))) || allowed_xlsch_re_in_dmrs_symbol(k,start_sc,frame_parms->ofdm_symbol_size,rel15->numDmrsCdmGrpsNoData,dmrs_Type)) {
|
txdataF_precoding[ap][((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)] = (amp * tx_layers[ap][m<<1]) >> 15;
|
||||||
((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)] = (amp * tx_layers[ap][m<<1]) >> 15;
|
txdataF_precoding[ap][((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)] = (amp * tx_layers[ap][(m<<1) + 1]) >> 15;
|
||||||
((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)] = (amp * tx_layers[ap][(m<<1) + 1]) >> 15;
|
|
||||||
#ifdef DEBUG_DLSCH_MAPPING
|
#ifdef DEBUG_DLSCH_MAPPING
|
||||||
printf("m %d\t l %d \t k %d \t txdataF: %d %d\n",
|
printf("m %d\t l %d \t k %d \t txdataF: %d %d\n",
|
||||||
m, l, k, ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)],
|
m, l, k, txdataF_precoding[ap][((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)],
|
||||||
((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)]);
|
txdataF_precoding[ap][((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)]);
|
||||||
#endif
|
#endif
|
||||||
m++;
|
m++;
|
||||||
}
|
}
|
||||||
|
/* mute RE */
|
||||||
|
else {
|
||||||
|
txdataF_precoding[ap][((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)] = 0;
|
||||||
|
txdataF_precoding[ap][((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)] = 0;
|
||||||
}
|
}
|
||||||
if (++k >= frame_parms->ofdm_symbol_size)
|
if (++k >= frame_parms->ofdm_symbol_size)
|
||||||
k -= frame_parms->ofdm_symbol_size;
|
k -= frame_parms->ofdm_symbol_size;
|
||||||
@@ -411,6 +412,30 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
|
|||||||
} // symbol loop
|
} // symbol loop
|
||||||
}// layer loop
|
}// layer loop
|
||||||
|
|
||||||
|
///Layer Precoding and Antenna port mapping
|
||||||
|
// tx_layers 1-8 are mapped on antenna ports 1000-1007
|
||||||
|
uint8_t pmi = 2;
|
||||||
|
|
||||||
|
for (int ap=0; ap<frame_parms->nb_antennas_tx; ap++) {
|
||||||
|
char *W_prec = nr_W_1l_2p[pmi][ap];//nr_W_1l_4p, nr_W_2l_2p, nr_W_2l_4p, nr_W_3l_4p, and nr_W_4l_4p
|
||||||
|
for (int l=rel15->StartSymbolIndex; l<rel15->StartSymbolIndex+rel15->NrOfSymbols; l++) {
|
||||||
|
uint16_t k = start_sc;
|
||||||
|
|
||||||
|
for (int i=0; i<rel15->rbSize*NR_NB_SC_PER_RB; i++) {
|
||||||
|
int32_t re_offset = l*frame_parms->ofdm_symbol_size + k;
|
||||||
|
int32_t precodatatx_F = nr_layer_precoder(txdataF_precoding, W_prec, rel15->nrOfLayers, re_offset+txdataF_offset);
|
||||||
|
((int16_t*)txdataF[ap])[(re_offset<<1) + (2*txdataF_offset)] = ((int16_t *) &precodatatx_F)[0];
|
||||||
|
((int16_t*)txdataF[ap])[(re_offset<<1) + 1 + (2*txdataF_offset)] = ((int16_t *) &precodatatx_F)[1];
|
||||||
|
#ifdef DEBUG_DLSCH_MAPPING
|
||||||
|
printf("antenna %d\t l %d \t k %d \t txdataF: %d %d\n",
|
||||||
|
ap, l, k, ((int16_t*)txdataF[ap])[(re_offset<<1) + (2*txdataF_offset)],
|
||||||
|
((int16_t*)txdataF[ap])[(re_offset<<1) + 1 + (2*txdataF_offset)]);
|
||||||
|
#endif
|
||||||
|
if (++k >= frame_parms->ofdm_symbol_size)
|
||||||
|
k -= frame_parms->ofdm_symbol_size;
|
||||||
|
} //RE loop
|
||||||
|
} // symbol loop
|
||||||
|
}// port loop
|
||||||
|
|
||||||
dlsch->slot_tx[slot]=0;
|
dlsch->slot_tx[slot]=0;
|
||||||
}// dlsch loop
|
}// dlsch loop
|
||||||
|
|||||||
@@ -176,6 +176,7 @@ NR_gNB_DLSCH_t *new_gNB_dlsch(NR_DL_FRAME_PARMS *frame_parms,
|
|||||||
}
|
}
|
||||||
|
|
||||||
dlsch->txdataF[layer] = (int32_t *)malloc16((NR_MAX_PDSCH_ENCODED_LENGTH/NR_MAX_NB_LAYERS)*sizeof(int32_t)); // NR_MAX_NB_LAYERS is already included in NR_MAX_PDSCH_ENCODED_LENGTH
|
dlsch->txdataF[layer] = (int32_t *)malloc16((NR_MAX_PDSCH_ENCODED_LENGTH/NR_MAX_NB_LAYERS)*sizeof(int32_t)); // NR_MAX_NB_LAYERS is already included in NR_MAX_PDSCH_ENCODED_LENGTH
|
||||||
|
dlsch->txdataF_precoding[layer] = (int32_t *)malloc16((14*frame_parms->ofdm_symbol_size)*sizeof(int32_t));
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int q=0; q<NR_MAX_NB_CODEWORDS; q++)
|
for (int q=0; q<NR_MAX_NB_CODEWORDS; q++)
|
||||||
|
|||||||
@@ -50,7 +50,7 @@
|
|||||||
//#define gNB_DEBUG_TRACE
|
//#define gNB_DEBUG_TRACE
|
||||||
|
|
||||||
#define OAI_UL_LDPC_MAX_NUM_LLR 27000//26112 // NR_LDPC_NCOL_BG1*NR_LDPC_ZMAX = 68*384
|
#define OAI_UL_LDPC_MAX_NUM_LLR 27000//26112 // NR_LDPC_NCOL_BG1*NR_LDPC_ZMAX = 68*384
|
||||||
//#define PRINT_CRC_CHECK
|
#define PRINT_CRC_CHECK
|
||||||
|
|
||||||
//extern double cpuf;
|
//extern double cpuf;
|
||||||
|
|
||||||
|
|||||||
@@ -268,6 +268,9 @@ void nr_ulsch_extract_rbs_single(int32_t **rxdataF,
|
|||||||
|
|
||||||
n = 0;
|
n = 0;
|
||||||
k_prime = 0;
|
k_prime = 0;
|
||||||
|
rxF_ext_index = 0;
|
||||||
|
ul_ch0_ext_index = 0;
|
||||||
|
ul_ch0_index = 0;
|
||||||
|
|
||||||
if (is_dmrs_symbol == 0) {
|
if (is_dmrs_symbol == 0) {
|
||||||
//
|
//
|
||||||
@@ -329,7 +332,7 @@ void nr_ulsch_scale_channel(int **ul_ch_estimates_ext,
|
|||||||
#if defined(__x86_64__)||defined(__i386__)
|
#if defined(__x86_64__)||defined(__i386__)
|
||||||
|
|
||||||
short rb, ch_amp;
|
short rb, ch_amp;
|
||||||
unsigned char aatx,aarx;
|
unsigned char aarx;
|
||||||
__m128i *ul_ch128, ch_amp128;
|
__m128i *ul_ch128, ch_amp128;
|
||||||
|
|
||||||
// Determine scaling amplitude based the symbol
|
// Determine scaling amplitude based the symbol
|
||||||
@@ -347,8 +350,7 @@ void nr_ulsch_scale_channel(int **ul_ch_estimates_ext,
|
|||||||
int off = 0;
|
int off = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
for (aatx=0; aatx < frame_parms->nb_antenna_ports_gNB; aatx++) {
|
for (aarx=0; aarx < frame_parms->nb_antennas_rx; aarx++) {
|
||||||
for (aarx=0; aarx < frame_parms->nb_antennas_rx; aarx++) {
|
|
||||||
|
|
||||||
ul_ch128 = (__m128i *)&ul_ch_estimates_ext[aarx][symbol*(off+(nb_rb*NR_NB_SC_PER_RB))];
|
ul_ch128 = (__m128i *)&ul_ch_estimates_ext[aarx][symbol*(off+(nb_rb*NR_NB_SC_PER_RB))];
|
||||||
|
|
||||||
@@ -377,7 +379,6 @@ void nr_ulsch_scale_channel(int **ul_ch_estimates_ext,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -394,6 +395,7 @@ void nr_ulsch_channel_level(int **ul_ch_estimates_ext,
|
|||||||
|
|
||||||
short rb;
|
short rb;
|
||||||
unsigned char aatx, aarx;
|
unsigned char aatx, aarx;
|
||||||
|
char nb_antennas_ue_tx = 1;
|
||||||
__m128i *ul_ch128, avg128U;
|
__m128i *ul_ch128, avg128U;
|
||||||
|
|
||||||
int16_t x = factor2(len);
|
int16_t x = factor2(len);
|
||||||
@@ -405,7 +407,7 @@ void nr_ulsch_channel_level(int **ul_ch_estimates_ext,
|
|||||||
int off = 0;
|
int off = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
for (aatx = 0; aatx < frame_parms->nb_antennas_tx; aatx++)
|
for (aatx = 0; aatx < nb_antennas_ue_tx; aatx++)
|
||||||
for (aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) {
|
for (aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) {
|
||||||
//clear average level
|
//clear average level
|
||||||
avg128U = _mm_setzero_si128();
|
avg128U = _mm_setzero_si128();
|
||||||
@@ -546,11 +548,12 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext,
|
|||||||
|
|
||||||
unsigned short rb;
|
unsigned short rb;
|
||||||
unsigned char aatx,aarx;
|
unsigned char aatx,aarx;
|
||||||
|
char nb_antennas_ue_tx = 1;
|
||||||
__m128i *ul_ch128,*ul_ch128_2,*ul_ch_mag128,*ul_ch_mag128b,*rxdataF128,*rxdataF_comp128,*rho128;
|
__m128i *ul_ch128,*ul_ch128_2,*ul_ch_mag128,*ul_ch_mag128b,*rxdataF128,*rxdataF_comp128,*rho128;
|
||||||
__m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp128,QAM_amp128b;
|
__m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp128,QAM_amp128b;
|
||||||
QAM_amp128b = _mm_setzero_si128();
|
QAM_amp128b = _mm_setzero_si128();
|
||||||
|
|
||||||
for (aatx=0; aatx<frame_parms->nb_antennas_tx; aatx++) {
|
for (aatx=0; aatx<nb_antennas_ue_tx; aatx++) {
|
||||||
|
|
||||||
if (mod_order == 4) {
|
if (mod_order == 4) {
|
||||||
QAM_amp128 = _mm_set1_epi16(QAM16_n1); // 2/sqrt(10)
|
QAM_amp128 = _mm_set1_epi16(QAM16_n1); // 2/sqrt(10)
|
||||||
@@ -1086,6 +1089,7 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB,
|
|||||||
uint32_t nb_re_pusch, bwp_start_subcarrier;
|
uint32_t nb_re_pusch, bwp_start_subcarrier;
|
||||||
int avgs;
|
int avgs;
|
||||||
int avg[4];
|
int avg[4];
|
||||||
|
char nb_antennas_ue_tx = 1;
|
||||||
NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms;
|
NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms;
|
||||||
nfapi_nr_pusch_pdu_t *rel15_ul = &gNB->ulsch[ulsch_id][0]->harq_processes[harq_pid]->ulsch_pdu;
|
nfapi_nr_pusch_pdu_t *rel15_ul = &gNB->ulsch[ulsch_id][0]->harq_processes[harq_pid]->ulsch_pdu;
|
||||||
|
|
||||||
@@ -1185,7 +1189,7 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB,
|
|||||||
|
|
||||||
avgs = 0;
|
avgs = 0;
|
||||||
|
|
||||||
for (aatx=0;aatx<frame_parms->nb_antennas_tx;aatx++)
|
for (aatx=0;aatx<nb_antennas_ue_tx;aatx++)
|
||||||
for (aarx=0;aarx<frame_parms->nb_antennas_rx;aarx++)
|
for (aarx=0;aarx<frame_parms->nb_antennas_rx;aarx++)
|
||||||
avgs = cmax(avgs,avg[(aatx<<1)+aarx]);
|
avgs = cmax(avgs,avg[(aatx<<1)+aarx]);
|
||||||
|
|
||||||
@@ -1203,7 +1207,7 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB,
|
|||||||
gNB->pusch_vars[ulsch_id]->ul_ch_mag0,
|
gNB->pusch_vars[ulsch_id]->ul_ch_mag0,
|
||||||
gNB->pusch_vars[ulsch_id]->ul_ch_magb0,
|
gNB->pusch_vars[ulsch_id]->ul_ch_magb0,
|
||||||
gNB->pusch_vars[ulsch_id]->rxdataF_comp,
|
gNB->pusch_vars[ulsch_id]->rxdataF_comp,
|
||||||
(frame_parms->nb_antennas_tx>1) ? gNB->pusch_vars[ulsch_id]->rho : NULL,
|
(nb_antennas_ue_tx>1) ? gNB->pusch_vars[ulsch_id]->rho : NULL,
|
||||||
frame_parms,
|
frame_parms,
|
||||||
symbol,
|
symbol,
|
||||||
dmrs_symbol_flag,
|
dmrs_symbol_flag,
|
||||||
|
|||||||
@@ -140,8 +140,10 @@ typedef struct {
|
|||||||
typedef struct {
|
typedef struct {
|
||||||
/// Pointers to 16 HARQ processes for the DLSCH
|
/// Pointers to 16 HARQ processes for the DLSCH
|
||||||
NR_DL_gNB_HARQ_t *harq_processes[NR_MAX_NB_HARQ_PROCESSES];
|
NR_DL_gNB_HARQ_t *harq_processes[NR_MAX_NB_HARQ_PROCESSES];
|
||||||
/// TX buffers for UE-spec transmission (antenna ports 5 or 7..14, prior to precoding)
|
/// TX buffers for UE-spec transmission (antenna layers 1,...,4 after to precoding)
|
||||||
int32_t *txdataF[NR_MAX_NB_LAYERS];
|
int32_t *txdataF[NR_MAX_NB_LAYERS];
|
||||||
|
/// TX buffers for UE-spec transmission (antenna ports 1000 or 1001,...,1007, before precoding)
|
||||||
|
int32_t *txdataF_precoding[NR_MAX_NB_LAYERS];
|
||||||
/// Modulated symbols buffer
|
/// Modulated symbols buffer
|
||||||
int32_t *mod_symbs[NR_MAX_NB_CODEWORDS];
|
int32_t *mod_symbs[NR_MAX_NB_CODEWORDS];
|
||||||
/// beamforming weights for UE-spec transmission (antenna ports 5 or 7..14), for each codeword, maximum 4 layers?
|
/// beamforming weights for UE-spec transmission (antenna ports 5 or 7..14), for each codeword, maximum 4 layers?
|
||||||
|
|||||||
@@ -323,7 +323,7 @@ static void *nr_feptx_thread(void *param) {
|
|||||||
slot,
|
slot,
|
||||||
l+i,
|
l+i,
|
||||||
aa,
|
aa,
|
||||||
nb_antenna_ports);
|
ru->nb_log_antennas);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
stop_meas(&ru->precoding_stats);
|
stop_meas(&ru->precoding_stats);
|
||||||
|
|||||||
@@ -207,7 +207,9 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB,
|
|||||||
|
|
||||||
|
|
||||||
//apply the OFDM symbol rotation here
|
//apply the OFDM symbol rotation here
|
||||||
apply_nr_rotation(fp,(int16_t*) &gNB->common_vars.txdataF[0][txdataF_offset],slot,0,fp->Ncp==EXTENDED?12:14,fp->ofdm_symbol_size);
|
for (aa=0; aa<cfg->carrier_config.num_tx_ant.value; aa++) {
|
||||||
|
apply_nr_rotation(fp,(int16_t*) &gNB->common_vars.txdataF[aa][txdataF_offset],slot,0,fp->Ncp==EXTENDED?12:14,fp->ofdm_symbol_size);
|
||||||
|
}
|
||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_gNB_TX+offset,0);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_gNB_TX+offset,0);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -615,7 +615,7 @@ int main(int argc, char **argv)
|
|||||||
prepare_scc(rrc.carrier.servingcellconfigcommon);
|
prepare_scc(rrc.carrier.servingcellconfigcommon);
|
||||||
uint64_t ssb_bitmap;
|
uint64_t ssb_bitmap;
|
||||||
fill_scc(rrc.carrier.servingcellconfigcommon,&ssb_bitmap,N_RB_DL,N_RB_DL,mu,mu);
|
fill_scc(rrc.carrier.servingcellconfigcommon,&ssb_bitmap,N_RB_DL,N_RB_DL,mu,mu);
|
||||||
|
ssb_bitmap = 1;// Enable only first SSB with index ssb_indx=0
|
||||||
fix_scc(scc,ssb_bitmap);
|
fix_scc(scc,ssb_bitmap);
|
||||||
|
|
||||||
fill_default_secondaryCellGroup(scc,
|
fill_default_secondaryCellGroup(scc,
|
||||||
@@ -640,9 +640,9 @@ int main(int argc, char **argv)
|
|||||||
AssertFatal((gNB->if_inst = NR_IF_Module_init(0))!=NULL,"Cannot register interface");
|
AssertFatal((gNB->if_inst = NR_IF_Module_init(0))!=NULL,"Cannot register interface");
|
||||||
gNB->if_inst->NR_PHY_config_req = nr_phy_config_request;
|
gNB->if_inst->NR_PHY_config_req = nr_phy_config_request;
|
||||||
// common configuration
|
// common configuration
|
||||||
rrc_mac_config_req_gNB(0,0,1,pusch_tgt_snrx10,pucch_tgt_snrx10,scc,0,0,NULL);
|
rrc_mac_config_req_gNB(0,0,n_tx,pusch_tgt_snrx10,pucch_tgt_snrx10,scc,0,0,NULL);
|
||||||
// UE dedicated configuration
|
// UE dedicated configuration
|
||||||
rrc_mac_config_req_gNB(0,0,1,pusch_tgt_snrx10,pucch_tgt_snrx10,NULL,1,secondaryCellGroup->spCellConfig->reconfigurationWithSync->newUE_Identity,secondaryCellGroup);
|
rrc_mac_config_req_gNB(0,0,n_tx,pusch_tgt_snrx10,pucch_tgt_snrx10,NULL,1,secondaryCellGroup->spCellConfig->reconfigurationWithSync->newUE_Identity,secondaryCellGroup);
|
||||||
phy_init_nr_gNB(gNB,0,0);
|
phy_init_nr_gNB(gNB,0,0);
|
||||||
N_RB_DL = gNB->frame_parms.N_RB_DL;
|
N_RB_DL = gNB->frame_parms.N_RB_DL;
|
||||||
// stub to configure frame_parms
|
// stub to configure frame_parms
|
||||||
@@ -702,28 +702,28 @@ int main(int argc, char **argv)
|
|||||||
frame_length_complex_samples = frame_parms->samples_per_subframe*NR_NUMBER_OF_SUBFRAMES_PER_FRAME;
|
frame_length_complex_samples = frame_parms->samples_per_subframe*NR_NUMBER_OF_SUBFRAMES_PER_FRAME;
|
||||||
//frame_length_complex_samples_no_prefix = frame_parms->samples_per_subframe_wCP*NR_NUMBER_OF_SUBFRAMES_PER_FRAME;
|
//frame_length_complex_samples_no_prefix = frame_parms->samples_per_subframe_wCP*NR_NUMBER_OF_SUBFRAMES_PER_FRAME;
|
||||||
|
|
||||||
s_re = malloc(2*sizeof(double*));
|
s_re = malloc(n_tx*sizeof(double*));
|
||||||
s_im = malloc(2*sizeof(double*));
|
s_im = malloc(n_tx*sizeof(double*));
|
||||||
r_re = malloc(2*sizeof(double*));
|
r_re = malloc(n_rx*sizeof(double*));
|
||||||
r_im = malloc(2*sizeof(double*));
|
r_im = malloc(n_rx*sizeof(double*));
|
||||||
txdata = malloc(2*sizeof(int*));
|
txdata = malloc(n_tx*sizeof(int*));
|
||||||
|
|
||||||
for (i=0; i<2; i++) {
|
|
||||||
|
|
||||||
|
for (i=0; i<n_tx; i++) {
|
||||||
s_re[i] = malloc(frame_length_complex_samples*sizeof(double));
|
s_re[i] = malloc(frame_length_complex_samples*sizeof(double));
|
||||||
bzero(s_re[i],frame_length_complex_samples*sizeof(double));
|
bzero(s_re[i],frame_length_complex_samples*sizeof(double));
|
||||||
s_im[i] = malloc(frame_length_complex_samples*sizeof(double));
|
s_im[i] = malloc(frame_length_complex_samples*sizeof(double));
|
||||||
bzero(s_im[i],frame_length_complex_samples*sizeof(double));
|
bzero(s_im[i],frame_length_complex_samples*sizeof(double));
|
||||||
|
|
||||||
|
printf("Allocating %d samples for txdata\n",frame_length_complex_samples);
|
||||||
|
txdata[i] = malloc(frame_length_complex_samples*sizeof(int));
|
||||||
|
bzero(txdata[i],frame_length_complex_samples*sizeof(int));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i=0; i<n_rx; i++) {
|
||||||
r_re[i] = malloc(frame_length_complex_samples*sizeof(double));
|
r_re[i] = malloc(frame_length_complex_samples*sizeof(double));
|
||||||
bzero(r_re[i],frame_length_complex_samples*sizeof(double));
|
bzero(r_re[i],frame_length_complex_samples*sizeof(double));
|
||||||
r_im[i] = malloc(frame_length_complex_samples*sizeof(double));
|
r_im[i] = malloc(frame_length_complex_samples*sizeof(double));
|
||||||
bzero(r_im[i],frame_length_complex_samples*sizeof(double));
|
bzero(r_im[i],frame_length_complex_samples*sizeof(double));
|
||||||
|
|
||||||
printf("Allocating %d samples for txdata\n",frame_length_complex_samples);
|
|
||||||
txdata[i] = malloc(frame_length_complex_samples*sizeof(int));
|
|
||||||
bzero(txdata[i],frame_length_complex_samples*sizeof(int));
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pbch_file_fd!=NULL) {
|
if (pbch_file_fd!=NULL) {
|
||||||
@@ -738,6 +738,7 @@ int main(int argc, char **argv)
|
|||||||
PHY_vars_UE_g[0] = malloc(sizeof(PHY_VARS_NR_UE*));
|
PHY_vars_UE_g[0] = malloc(sizeof(PHY_VARS_NR_UE*));
|
||||||
PHY_vars_UE_g[0][0] = UE;
|
PHY_vars_UE_g[0][0] = UE;
|
||||||
memcpy(&UE->frame_parms,frame_parms,sizeof(NR_DL_FRAME_PARMS));
|
memcpy(&UE->frame_parms,frame_parms,sizeof(NR_DL_FRAME_PARMS));
|
||||||
|
UE->frame_parms.nb_antennas_rx = n_rx;
|
||||||
|
|
||||||
if (run_initial_sync==1) UE->is_synchronized = 0;
|
if (run_initial_sync==1) UE->is_synchronized = 0;
|
||||||
else {UE->is_synchronized = 1; UE->UE_mode[0]=PUSCH;}
|
else {UE->is_synchronized = 1; UE->UE_mode[0]=PUSCH;}
|
||||||
@@ -955,7 +956,15 @@ int main(int argc, char **argv)
|
|||||||
fwrite(txdata[0],sizeof(int32_t),frame_length_complex_samples,output_fd);
|
fwrite(txdata[0],sizeof(int32_t),frame_length_complex_samples,output_fd);
|
||||||
}
|
}
|
||||||
|
|
||||||
int txlev = signal_energy(&txdata[0][frame_parms->get_samples_slot_timestamp(slot,frame_parms,0)+5*frame_parms->ofdm_symbol_size + 4*frame_parms->nb_prefix_samples + frame_parms->nb_prefix_samples0], frame_parms->ofdm_symbol_size + frame_parms->nb_prefix_samples);
|
int txlev[n_tx];
|
||||||
|
int txlev_sum = 0;
|
||||||
|
int l_ofdm = 6;
|
||||||
|
for (aa=0; aa<n_tx; aa++) {
|
||||||
|
txlev[aa] = signal_energy(&txdata[aa][tx_offset+l_ofdm*frame_parms->ofdm_symbol_size + (l_ofdm-1)*frame_parms->nb_prefix_samples + frame_parms->nb_prefix_samples0],
|
||||||
|
frame_parms->ofdm_symbol_size + frame_parms->nb_prefix_samples);
|
||||||
|
txlev_sum += txlev[aa];
|
||||||
|
if (n_trials==1) printf("txlev[%d] = %d (%f dB) txlev_sum %d\n",aa,txlev[aa],10*log10((double)txlev[aa]),txlev_sum);
|
||||||
|
}
|
||||||
|
|
||||||
// if (n_trials==1) printf("txlev %d (%f)\n",txlev,10*log10((double)txlev));
|
// if (n_trials==1) printf("txlev %d (%f)\n",txlev,10*log10((double)txlev));
|
||||||
|
|
||||||
@@ -964,27 +973,37 @@ int main(int argc, char **argv)
|
|||||||
i++) {
|
i++) {
|
||||||
|
|
||||||
for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
|
for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
|
||||||
r_re[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)]);
|
s_re[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)]);
|
||||||
r_im[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)+1]);
|
s_im[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)+1]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
double ts = 1.0/(frame_parms->subcarrier_spacing * frame_parms->ofdm_symbol_size);
|
double ts = 1.0/(frame_parms->subcarrier_spacing * frame_parms->ofdm_symbol_size);
|
||||||
//AWGN
|
//AWGN
|
||||||
sigma2_dB = 10 * log10((double)txlev * ((double)UE->frame_parms.ofdm_symbol_size/(12*rel15->rbSize))) - SNR;
|
sigma2_dB = 10 * log10((double)txlev_sum * ((double)UE->frame_parms.ofdm_symbol_size/(12*rel15->rbSize))) - SNR;
|
||||||
sigma2 = pow(10, sigma2_dB/10);
|
sigma2 = pow(10, sigma2_dB/10);
|
||||||
if (n_trials==1) printf("sigma2 %f (%f dB), txlev %f (factor %f)\n",sigma2,sigma2_dB,10*log10((double)txlev),(double)(double)UE->frame_parms.ofdm_symbol_size/(12*rel15->rbSize));
|
if (n_trials==1) printf("sigma2 %f (%f dB), txlev_sum %f (factor %f)\n",sigma2,sigma2_dB,10*log10((double)txlev_sum),(double)(double)UE->frame_parms.ofdm_symbol_size/(12*rel15->rbSize));
|
||||||
|
for (aa=0; aa<n_rx; aa++) {
|
||||||
|
bzero(r_re[aa],frame_length_complex_samples*sizeof(double));
|
||||||
|
bzero(r_im[aa],frame_length_complex_samples*sizeof(double));
|
||||||
|
}
|
||||||
|
|
||||||
for (i=frame_parms->get_samples_slot_timestamp(slot,frame_parms,0);
|
for (i=frame_parms->get_samples_slot_timestamp(slot,frame_parms,0);
|
||||||
i<frame_parms->get_samples_slot_timestamp(slot+1,frame_parms,0);
|
i<frame_parms->get_samples_slot_timestamp(slot+1,frame_parms,0);
|
||||||
i++) {
|
i++) {
|
||||||
|
|
||||||
for (aa=0; aa<frame_parms->nb_antennas_rx; aa++) {
|
for (int aa_rx=0; aa_rx<n_rx; aa_rx++) {
|
||||||
((short*) UE->common_vars.rxdata[aa])[2*i] = (short) ((r_re[aa][i] + sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
|
// Apply MIMO Channel and then add noise
|
||||||
((short*) UE->common_vars.rxdata[aa])[2*i+1] = (short) ((r_im[aa][i] + sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
|
// sum up signals from different Tx antennas
|
||||||
|
for (aa=0; aa<n_tx; aa++) {
|
||||||
|
r_re[aa_rx][i] += s_re[aa][i];
|
||||||
|
r_im[aa_rx][i] += s_im[aa][i];
|
||||||
|
}
|
||||||
|
((short*) UE->common_vars.rxdata[aa_rx])[2*i] = (short) ((r_re[aa_rx][i] + sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
|
||||||
|
((short*) UE->common_vars.rxdata[aa_rx])[2*i+1] = (short) ((r_im[aa_rx][i] + sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
|
||||||
/* Add phase noise if enabled */
|
/* Add phase noise if enabled */
|
||||||
if (pdu_bit_map & 0x1) {
|
if (pdu_bit_map & 0x1) {
|
||||||
phase_noise(ts, &((short*) UE->common_vars.rxdata[aa])[2*i],
|
phase_noise(ts, &((short*) UE->common_vars.rxdata[aa_rx])[2*i],
|
||||||
&((short*) UE->common_vars.rxdata[aa])[2*i+1]);
|
&((short*) UE->common_vars.rxdata[aa_rx])[2*i+1]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1159,12 +1178,14 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
for (i = 0; i < 2; i++) {
|
for (i = 0; i < n_tx; i++) {
|
||||||
free(s_re[i]);
|
free(s_re[i]);
|
||||||
free(s_im[i]);
|
free(s_im[i]);
|
||||||
|
free(txdata[i]);
|
||||||
|
}
|
||||||
|
for (i = 0; i < n_rx; i++) {
|
||||||
free(r_re[i]);
|
free(r_re[i]);
|
||||||
free(r_im[i]);
|
free(r_im[i]);
|
||||||
free(txdata[i]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
free(s_re);
|
free(s_re);
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ gNBs =
|
|||||||
////////// Physical parameters:
|
////////// Physical parameters:
|
||||||
|
|
||||||
ssb_SubcarrierOffset = 0;
|
ssb_SubcarrierOffset = 0;
|
||||||
pdsch_AntennaPorts = 1;
|
pdsch_AntennaPorts = 2;
|
||||||
|
|
||||||
servingCellConfigCommon = (
|
servingCellConfigCommon = (
|
||||||
{
|
{
|
||||||
@@ -240,8 +240,8 @@ L1s = (
|
|||||||
RUs = (
|
RUs = (
|
||||||
{
|
{
|
||||||
local_rf = "yes"
|
local_rf = "yes"
|
||||||
nb_tx = 1
|
nb_tx = 2
|
||||||
nb_rx = 1
|
nb_rx = 2
|
||||||
att_tx = 0
|
att_tx = 0
|
||||||
att_rx = 0;
|
att_rx = 0;
|
||||||
bands = [7];
|
bands = [7];
|
||||||
@@ -249,7 +249,7 @@ RUs = (
|
|||||||
max_rxgain = 75;
|
max_rxgain = 75;
|
||||||
eNB_instances = [0];
|
eNB_instances = [0];
|
||||||
##beamforming 1x2 matrix: 1 layer x 2 antennas
|
##beamforming 1x2 matrix: 1 layer x 2 antennas
|
||||||
bf_weights = [0x00007fff, 0x0000];
|
bf_weights = [0x00007fff, 0x00007fff];
|
||||||
##beamforming 1x4 matrix: 1 layer x 4 antennas
|
##beamforming 1x4 matrix: 1 layer x 4 antennas
|
||||||
#bf_weights = [0x00007fff, 0x0000,0x0000, 0x0000];
|
#bf_weights = [0x00007fff, 0x0000,0x0000, 0x0000];
|
||||||
## beamforming 2x2 matrix:
|
## beamforming 2x2 matrix:
|
||||||
|
|||||||
Reference in New Issue
Block a user