ue txData more contextual, but still global as it is entangled with usrp driver
This commit is contained in:
+18
-11
@@ -504,7 +504,7 @@ static int nr_ue_slot_select(const fapi_nr_config_request_t *cfg, int nr_slot)
|
|||||||
return NR_DOWNLINK_SLOT;
|
return NR_DOWNLINK_SLOT;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void RU_write(nr_rxtx_thread_data_t *rxtxD, bool sl_tx_action)
|
static void RU_write(nr_rxtx_thread_data_t *rxtxD, bool sl_tx_action, c16_t **txp)
|
||||||
{
|
{
|
||||||
PHY_VARS_NR_UE *UE = rxtxD->UE;
|
PHY_VARS_NR_UE *UE = rxtxD->UE;
|
||||||
const fapi_nr_config_request_t *cfg = &UE->nrUE_config;
|
const fapi_nr_config_request_t *cfg = &UE->nrUE_config;
|
||||||
@@ -514,10 +514,7 @@ static void RU_write(nr_rxtx_thread_data_t *rxtxD, bool sl_tx_action)
|
|||||||
if (UE->sl_mode == 2)
|
if (UE->sl_mode == 2)
|
||||||
fp = &UE->SL_UE_PHY_PARAMS.sl_frame_params;
|
fp = &UE->SL_UE_PHY_PARAMS.sl_frame_params;
|
||||||
|
|
||||||
void *txp[NB_ANTENNAS_TX];
|
|
||||||
int slot = proc->nr_slot_tx;
|
int slot = proc->nr_slot_tx;
|
||||||
for (int i = 0; i < fp->nb_antennas_tx; i++)
|
|
||||||
txp[i] = (void *)&UE->common_vars.txData[i][fp->get_samples_slot_timestamp(slot, fp, 0)];
|
|
||||||
|
|
||||||
radio_tx_burst_flag_t flags = TX_BURST_INVALID;
|
radio_tx_burst_flag_t flags = TX_BURST_INVALID;
|
||||||
|
|
||||||
@@ -551,7 +548,7 @@ static void RU_write(nr_rxtx_thread_data_t *rxtxD, bool sl_tx_action)
|
|||||||
const int maxWriteBlockSize = fp->get_samples_per_slot(proc->nr_slot_tx, fp);
|
const int maxWriteBlockSize = fp->get_samples_per_slot(proc->nr_slot_tx, fp);
|
||||||
while (writeBlockSize > maxWriteBlockSize) {
|
while (writeBlockSize > maxWriteBlockSize) {
|
||||||
const int dummyBlockSize = min(writeBlockSize - maxWriteBlockSize, maxWriteBlockSize);
|
const int dummyBlockSize = min(writeBlockSize - maxWriteBlockSize, maxWriteBlockSize);
|
||||||
int tmp = openair0_write_reorder(&UE->rfdevice, writeTimestamp, txp, dummyBlockSize, fp->nb_antennas_tx, flags);
|
int tmp = openair0_write_reorder(&UE->rfdevice, writeTimestamp, (void **)txp, dummyBlockSize, fp->nb_antennas_tx, flags);
|
||||||
AssertFatal(tmp == dummyBlockSize, "");
|
AssertFatal(tmp == dummyBlockSize, "");
|
||||||
|
|
||||||
writeTimestamp += dummyBlockSize;
|
writeTimestamp += dummyBlockSize;
|
||||||
@@ -567,7 +564,7 @@ static void RU_write(nr_rxtx_thread_data_t *rxtxD, bool sl_tx_action)
|
|||||||
nr_fo_compensation(ul_freq_offset, fp->samples_per_subframe, writeTimestamp, txp[i], txp[i], writeBlockSize);
|
nr_fo_compensation(ul_freq_offset, fp->samples_per_subframe, writeTimestamp, txp[i], txp[i], writeBlockSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
int tmp = openair0_write_reorder(&UE->rfdevice, writeTimestamp, txp, writeBlockSize, fp->nb_antennas_tx, flags);
|
int tmp = openair0_write_reorder(&UE->rfdevice, writeTimestamp, (void **)txp, writeBlockSize, fp->nb_antennas_tx, flags);
|
||||||
AssertFatal(tmp == writeBlockSize, "");
|
AssertFatal(tmp == writeBlockSize, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -583,6 +580,17 @@ void processSlotTX(void *arg)
|
|||||||
if (UE->if_inst)
|
if (UE->if_inst)
|
||||||
UE->if_inst->slot_indication(UE->Mod_id, true);
|
UE->if_inst->slot_indication(UE->Mod_id, true);
|
||||||
|
|
||||||
|
LOG_D(PHY, "SlotTx %d.%d => slot type %d\n", proc->frame_tx, proc->nr_slot_tx, proc->tx_slot_type);
|
||||||
|
|
||||||
|
NR_DL_FRAME_PARMS *fp = &UE->frame_parms;
|
||||||
|
c16_t *txp[fp->nb_antennas_tx];
|
||||||
|
for (int i = 0; i < fp->nb_antennas_tx; i++) {
|
||||||
|
txp[i] = UE->common_vars.txData[i] + fp->get_samples_slot_timestamp(proc->nr_slot_tx, fp, 0);
|
||||||
|
// We should not need to set it to 0
|
||||||
|
// but in mixed slots, in TDD continuous tx (should not exist), ... we don't know the parts to ignore
|
||||||
|
memset(txp[i], 0, fp->get_samples_per_slot(proc->nr_slot_tx, fp) * sizeof(**txp));
|
||||||
|
}
|
||||||
|
|
||||||
if (proc->tx_slot_type == NR_UPLINK_SLOT || proc->tx_slot_type == NR_MIXED_SLOT) {
|
if (proc->tx_slot_type == NR_UPLINK_SLOT || proc->tx_slot_type == NR_MIXED_SLOT) {
|
||||||
if (UE->sl_mode == 2 && proc->tx_slot_type == NR_SIDELINK_SLOT) {
|
if (UE->sl_mode == 2 && proc->tx_slot_type == NR_SIDELINK_SLOT) {
|
||||||
// trigger L2 to run ue_sidelink_scheduler thru IF module
|
// trigger L2 to run ue_sidelink_scheduler thru IF module
|
||||||
@@ -608,7 +616,7 @@ void processSlotTX(void *arg)
|
|||||||
AssertFatal((phy_data.sl_tx_action >= SL_NR_CONFIG_TYPE_TX_PSBCH &&
|
AssertFatal((phy_data.sl_tx_action >= SL_NR_CONFIG_TYPE_TX_PSBCH &&
|
||||||
phy_data.sl_tx_action < SL_NR_CONFIG_TYPE_TX_MAXIMUM), "Incorrect SL TX Action Scheduled\n");
|
phy_data.sl_tx_action < SL_NR_CONFIG_TYPE_TX_MAXIMUM), "Incorrect SL TX Action Scheduled\n");
|
||||||
|
|
||||||
phy_procedures_nrUE_SL_TX(UE, proc, &phy_data);
|
phy_procedures_nrUE_SL_TX(UE, proc, &phy_data, txp);
|
||||||
|
|
||||||
sl_tx_action = true;
|
sl_tx_action = true;
|
||||||
}
|
}
|
||||||
@@ -630,12 +638,12 @@ void processSlotTX(void *arg)
|
|||||||
}
|
}
|
||||||
dynamic_barrier_join(rxtxD->next_barrier);
|
dynamic_barrier_join(rxtxD->next_barrier);
|
||||||
|
|
||||||
phy_procedures_nrUE_TX(UE, proc, &phy_data);
|
phy_procedures_nrUE_TX(UE, proc, &phy_data, txp);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
dynamic_barrier_join(rxtxD->next_barrier);
|
dynamic_barrier_join(rxtxD->next_barrier);
|
||||||
}
|
}
|
||||||
RU_write(rxtxD, sl_tx_action);
|
RU_write(rxtxD, sl_tx_action, txp);
|
||||||
TracyCZoneEnd(ctx);
|
TracyCZoneEnd(ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -723,7 +731,7 @@ static int UE_dl_preprocessing(PHY_VARS_NR_UE *UE,
|
|||||||
if (phy_data->dlsch[0].active && phy_data->dlsch[0].rnti_type == TYPE_C_RNTI_) {
|
if (phy_data->dlsch[0].active && phy_data->dlsch[0].rnti_type == TYPE_C_RNTI_) {
|
||||||
// indicate to tx thread to wait for DLSCH decoding
|
// indicate to tx thread to wait for DLSCH decoding
|
||||||
if (phy_data->dlsch[0].dlsch_config.k1_feedback) { // if feedback is 0 there is no HARQ associated with this DLSCH
|
if (phy_data->dlsch[0].dlsch_config.k1_feedback) { // if feedback is 0 there is no HARQ associated with this DLSCH
|
||||||
const int ack_nack_slot = (proc->nr_slot_rx + phy_data->dlsch[0].dlsch_config.k1_feedback) % UE->frame_parms.slots_per_frame;
|
const int ack_nack_slot = (proc->nr_slot_rx + phy_data->dlsch[0].dlsch_config.k1_feedback) % fp->slots_per_frame;
|
||||||
tx_wait_for_dlsch[ack_nack_slot]++;
|
tx_wait_for_dlsch[ack_nack_slot]++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1020,7 +1028,6 @@ void *UE_thread(void *arg)
|
|||||||
notifiedFIFO_elt_t *Msg = newNotifiedFIFO_elt(sizeof(syncData_t), 0, &nf, UE_synch);
|
notifiedFIFO_elt_t *Msg = newNotifiedFIFO_elt(sizeof(syncData_t), 0, &nf, UE_synch);
|
||||||
syncData_t *syncMsg = (syncData_t *)NotifiedFifoData(Msg);
|
syncData_t *syncMsg = (syncData_t *)NotifiedFifoData(Msg);
|
||||||
*syncMsg = (syncData_t){0};
|
*syncMsg = (syncData_t){0};
|
||||||
NR_DL_FRAME_PARMS *fp = &UE->frame_parms;
|
|
||||||
if (UE->UE_scan_carrier) {
|
if (UE->UE_scan_carrier) {
|
||||||
// Get list of GSCN in this band for UE's bandwidth and center frequency.
|
// Get list of GSCN in this band for UE's bandwidth and center frequency.
|
||||||
LOG_W(PHY, "UE set to scan all GSCN in current bandwidth\n");
|
LOG_W(PHY, "UE set to scan all GSCN in current bandwidth\n");
|
||||||
|
|||||||
@@ -275,7 +275,7 @@ uint32_t get_samples_slot_timestamp(int slot, const NR_DL_FRAME_PARMS *fp, unsig
|
|||||||
for(unsigned int idx_slot = 0; idx_slot < slot; idx_slot++)
|
for(unsigned int idx_slot = 0; idx_slot < slot; idx_slot++)
|
||||||
samp_count += fp->get_samples_per_slot(idx_slot, fp);
|
samp_count += fp->get_samples_per_slot(idx_slot, fp);
|
||||||
} else {
|
} else {
|
||||||
for(unsigned int idx_slot = slot; idx_slot < slot+sl_ahead; idx_slot++)
|
for (unsigned int idx_slot = slot; idx_slot < slot + sl_ahead; idx_slot++)
|
||||||
samp_count += fp->get_samples_per_slot(idx_slot, fp);
|
samp_count += fp->get_samples_per_slot(idx_slot, fp);
|
||||||
}
|
}
|
||||||
return samp_count;
|
return samp_count;
|
||||||
|
|||||||
@@ -52,8 +52,8 @@
|
|||||||
// - idft for short sequence assumes we are transmitting starting in symbol 0 of a PRACH slot
|
// - idft for short sequence assumes we are transmitting starting in symbol 0 of a PRACH slot
|
||||||
// - Assumes that PRACH SCS is same as PUSCH SCS @ 30 kHz, take values for formats 0-2 and adjust for others below
|
// - Assumes that PRACH SCS is same as PUSCH SCS @ 30 kHz, take values for formats 0-2 and adjust for others below
|
||||||
// - Preamble index different from 0 is not detected by gNB
|
// - Preamble index different from 0 is not detected by gNB
|
||||||
int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, int frame, uint8_t slot){
|
int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, int frame, uint8_t slot, c16_t **txData)
|
||||||
|
{
|
||||||
NR_DL_FRAME_PARMS *fp=&ue->frame_parms;
|
NR_DL_FRAME_PARMS *fp=&ue->frame_parms;
|
||||||
fapi_nr_config_request_t *nrUE_config = &ue->nrUE_config;
|
fapi_nr_config_request_t *nrUE_config = &ue->nrUE_config;
|
||||||
fapi_nr_ul_config_prach_pdu *prach_pdu = &ue->prach_vars[gNB_id]->prach_pdu;
|
fapi_nr_ul_config_prach_pdu *prach_pdu = &ue->prach_vars[gNB_id]->prach_pdu;
|
||||||
@@ -66,7 +66,7 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, int frame, uint8_t
|
|||||||
c16_t prachF_tmp[(4688 + 4 * 24576) * 4] __attribute__((aligned(32))) = {0};
|
c16_t prachF_tmp[(4688 + 4 * 24576) * 4] __attribute__((aligned(32))) = {0};
|
||||||
|
|
||||||
int Ncp = 0;
|
int Ncp = 0;
|
||||||
int prach_start, prach_sequence_length, prach_len, dftlen, mu, n_ra_prb, k, prachStartSymbol, sample_offset_slot;
|
int prach_start, prach_sequence_length, prach_len, dftlen, mu, n_ra_prb, k, prachStartSymbol;
|
||||||
|
|
||||||
fd_occasion = prach_pdu->num_ra;
|
fd_occasion = prach_pdu->num_ra;
|
||||||
prach_len = 0;
|
prach_len = 0;
|
||||||
@@ -98,23 +98,22 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, int frame, uint8_t
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (prachStartSymbol == 0) {
|
if (prachStartSymbol == 0) {
|
||||||
sample_offset_slot = 0;
|
prach_start = 0;
|
||||||
} else if (fp->slots_per_subframe == 1) {
|
} else if (fp->slots_per_subframe == 1) {
|
||||||
if (prachStartSymbol <= 7)
|
if (prachStartSymbol <= 7)
|
||||||
sample_offset_slot = (fp->ofdm_symbol_size + fp->nb_prefix_samples) * (prachStartSymbol - 1) + (fp->ofdm_symbol_size + fp->nb_prefix_samples0);
|
prach_start =
|
||||||
|
(fp->ofdm_symbol_size + fp->nb_prefix_samples) * (prachStartSymbol - 1) + (fp->ofdm_symbol_size + fp->nb_prefix_samples0);
|
||||||
else
|
else
|
||||||
sample_offset_slot = (fp->ofdm_symbol_size + fp->nb_prefix_samples) * (prachStartSymbol - 2) + (fp->ofdm_symbol_size + fp->nb_prefix_samples0) * 2;
|
prach_start = (fp->ofdm_symbol_size + fp->nb_prefix_samples) * (prachStartSymbol - 2)
|
||||||
|
+ (fp->ofdm_symbol_size + fp->nb_prefix_samples0) * 2;
|
||||||
} else {
|
} else {
|
||||||
if (slot % (fp->slots_per_subframe / 2) == 0)
|
if (slot % (fp->slots_per_subframe / 2) == 0)
|
||||||
sample_offset_slot = (fp->ofdm_symbol_size + fp->nb_prefix_samples) * (prachStartSymbol - 1) + (fp->ofdm_symbol_size + fp->nb_prefix_samples0);
|
prach_start =
|
||||||
|
(fp->ofdm_symbol_size + fp->nb_prefix_samples) * (prachStartSymbol - 1) + (fp->ofdm_symbol_size + fp->nb_prefix_samples0);
|
||||||
else
|
else
|
||||||
sample_offset_slot = (fp->ofdm_symbol_size + fp->nb_prefix_samples) * prachStartSymbol;
|
prach_start = (fp->ofdm_symbol_size + fp->nb_prefix_samples) * prachStartSymbol;
|
||||||
}
|
}
|
||||||
|
|
||||||
prach_start = fp->get_samples_slot_timestamp(slot, fp, 0) + sample_offset_slot;
|
|
||||||
|
|
||||||
//printf("prachstartsymbold %d, sample_offset_slot %d, prach_start %d\n",prachStartSymbol, sample_offset_slot, prach_start);
|
|
||||||
|
|
||||||
// First compute physical root sequence
|
// First compute physical root sequence
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
* 4G and NR NCS tables are slightly different and depend on prach format
|
* 4G and NR NCS tables are slightly different and depend on prach format
|
||||||
@@ -506,13 +505,12 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, int frame, uint8_t
|
|||||||
LOG_I(PHY, "PRACH [UE %d] N_RB_UL %d prach_start %d, prach_len %d\n", Mod_id, fp->N_RB_UL, prach_start, prach_len);
|
LOG_I(PHY, "PRACH [UE %d] N_RB_UL %d prach_start %d, prach_len %d\n", Mod_id, fp->N_RB_UL, prach_start, prach_len);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
memcpy(ue->common_vars.txData[0] + prach_start, prach, sizeof(c16_t) * prach_len);
|
memcpy(txData[0] + prach_start, prach, sizeof(c16_t) * prach_len);
|
||||||
|
|
||||||
#ifdef PRACH_WRITE_OUTPUT_DEBUG
|
#ifdef PRACH_WRITE_OUTPUT_DEBUG
|
||||||
LOG_M("prach_tx0.m", "prachtx0", prach + (Ncp << 1), prach_len - Ncp, 1, 1);
|
LOG_M("prach_tx0.m", "prachtx0", prach + (Ncp << 1), prach_len - Ncp, 1, 1);
|
||||||
LOG_M("Prach_txsig.m", "txs", (int16_t *)(&ue->common_vars.txdata[0][prach_start]), 2 * (prach_start + prach_len), 1, 1)
|
LOG_M("Prach_txsig.m", "txs", (int16_t *)(&txdata[0][prach_start]), 2 * (prach_start + prach_len), 1, 1)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return signal_energy((int *)prach, 256);
|
return signal_energy((int *)prach, 256);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -151,6 +151,7 @@ uint8_t nr_ue_pusch_common_procedures(PHY_VARS_NR_UE *UE,
|
|||||||
const NR_DL_FRAME_PARMS *frame_parms,
|
const NR_DL_FRAME_PARMS *frame_parms,
|
||||||
const uint8_t n_antenna_ports,
|
const uint8_t n_antenna_ports,
|
||||||
c16_t **txdataF,
|
c16_t **txdataF,
|
||||||
|
c16_t **txdata,
|
||||||
uint32_t linktype,
|
uint32_t linktype,
|
||||||
bool was_symbol_used[NR_NUMBER_OF_SYMBOLS_PER_SLOT]);
|
bool was_symbol_used[NR_NUMBER_OF_SYMBOLS_PER_SLOT]);
|
||||||
|
|
||||||
@@ -315,7 +316,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
int G,
|
int G,
|
||||||
uint32_t nvar);
|
uint32_t nvar);
|
||||||
|
|
||||||
int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, int frame, uint8_t slot);
|
int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, int frame, uint8_t slot, c16_t **txData);
|
||||||
|
|
||||||
void dump_nrdlsch(PHY_VARS_NR_UE *ue,uint8_t gNB_id,uint8_t nr_slot_rx,unsigned int *coded_bits_per_codeword,int round, unsigned char harq_pid);
|
void dump_nrdlsch(PHY_VARS_NR_UE *ue,uint8_t gNB_id,uint8_t nr_slot_rx,unsigned int *coded_bits_per_codeword,int round, unsigned char harq_pid);
|
||||||
void nr_a_sum_b(c16_t *input_x, c16_t *input_y, unsigned short nb_rb);
|
void nr_a_sum_b(c16_t *input_x, c16_t *input_y, unsigned short nb_rb);
|
||||||
|
|||||||
@@ -828,25 +828,17 @@ uint8_t nr_ue_pusch_common_procedures(PHY_VARS_NR_UE *UE,
|
|||||||
const NR_DL_FRAME_PARMS *frame_parms,
|
const NR_DL_FRAME_PARMS *frame_parms,
|
||||||
const uint8_t n_antenna_ports,
|
const uint8_t n_antenna_ports,
|
||||||
c16_t **txdataF,
|
c16_t **txdataF,
|
||||||
|
c16_t **txdata,
|
||||||
uint32_t linktype,
|
uint32_t linktype,
|
||||||
bool was_symbol_used[NR_NUMBER_OF_SYMBOLS_PER_SLOT])
|
bool was_symbol_used[NR_NUMBER_OF_SYMBOLS_PER_SLOT])
|
||||||
{
|
{
|
||||||
const int tx_offset = frame_parms->get_samples_slot_timestamp(slot, frame_parms, 0);
|
|
||||||
|
|
||||||
int N_RB = (linktype == link_type_sl) ? frame_parms->N_RB_SL : frame_parms->N_RB_UL;
|
int N_RB = (linktype == link_type_sl) ? frame_parms->N_RB_SL : frame_parms->N_RB_UL;
|
||||||
|
|
||||||
c16_t **txdata = UE->common_vars.txData;
|
|
||||||
for (int i = 0; i < NR_NUMBER_OF_SYMBOLS_PER_SLOT; i++) {
|
for (int i = 0; i < NR_NUMBER_OF_SYMBOLS_PER_SLOT; i++) {
|
||||||
if (was_symbol_used[i] == false)
|
if (was_symbol_used[i] == false)
|
||||||
continue;
|
continue;
|
||||||
for(int ap = 0; ap < n_antenna_ports; ap++) {
|
for (int ap = 0; ap < n_antenna_ports; ap++) {
|
||||||
apply_nr_rotation_TX(frame_parms,
|
apply_nr_rotation_TX(frame_parms, txdataF[ap], frame_parms->symbol_rotation[linktype], slot, N_RB, i, 1);
|
||||||
txdataF[ap],
|
|
||||||
frame_parms->symbol_rotation[linktype],
|
|
||||||
slot,
|
|
||||||
N_RB,
|
|
||||||
i,
|
|
||||||
1);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -855,25 +847,20 @@ uint8_t nr_ue_pusch_common_procedures(PHY_VARS_NR_UE *UE,
|
|||||||
if (frame_parms->Ncp == 1) { // extended cyclic prefix
|
if (frame_parms->Ncp == 1) { // extended cyclic prefix
|
||||||
for (int i = 0; i < NR_NUMBER_OF_SYMBOLS_PER_SLOT_EXTENDED_CP; i++) {
|
for (int i = 0; i < NR_NUMBER_OF_SYMBOLS_PER_SLOT_EXTENDED_CP; i++) {
|
||||||
if (was_symbol_used[i] == false) {
|
if (was_symbol_used[i] == false) {
|
||||||
memset(&txdata[ap][tx_offset + (frame_parms->ofdm_symbol_size + frame_parms->nb_prefix_samples) * i],
|
memset(&txdata[ap][(frame_parms->ofdm_symbol_size + frame_parms->nb_prefix_samples) * i],
|
||||||
0,
|
0,
|
||||||
(frame_parms->nb_prefix_samples + frame_parms->ofdm_symbol_size) * sizeof(int32_t));
|
(frame_parms->nb_prefix_samples + frame_parms->ofdm_symbol_size) * sizeof(int32_t));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
PHY_ofdm_mod((int *)&txdataF[ap][frame_parms->ofdm_symbol_size * i],
|
PHY_ofdm_mod((int *)&txdataF[ap][frame_parms->ofdm_symbol_size * i],
|
||||||
(int *)&txdata[ap][tx_offset + frame_parms->ofdm_symbol_size * i],
|
(int *)&txdata[ap][frame_parms->ofdm_symbol_size * i],
|
||||||
frame_parms->ofdm_symbol_size,
|
frame_parms->ofdm_symbol_size,
|
||||||
1,
|
1,
|
||||||
frame_parms->nb_prefix_samples,
|
frame_parms->nb_prefix_samples,
|
||||||
CYCLIC_PREFIX);
|
CYCLIC_PREFIX);
|
||||||
}
|
}
|
||||||
} else { // normal cyclic prefix
|
} else { // normal cyclic prefix
|
||||||
nr_normal_prefix_mod(txdataF[ap],
|
nr_normal_prefix_mod(txdataF[ap], txdata[ap], NR_NUMBER_OF_SYMBOLS_PER_SLOT, frame_parms, slot, was_symbol_used);
|
||||||
&txdata[ap][tx_offset],
|
|
||||||
NR_NUMBER_OF_SYMBOLS_PER_SLOT,
|
|
||||||
frame_parms,
|
|
||||||
slot,
|
|
||||||
was_symbol_used);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -578,7 +578,6 @@ typedef struct nr_phy_data_tx_s {
|
|||||||
// Sidelink Rx action decided by MAC
|
// Sidelink Rx action decided by MAC
|
||||||
sl_nr_tx_config_type_enum_t sl_tx_action;
|
sl_nr_tx_config_type_enum_t sl_tx_action;
|
||||||
sl_nr_tx_config_psbch_pdu_t psbch_vars;
|
sl_nr_tx_config_psbch_pdu_t psbch_vars;
|
||||||
|
|
||||||
} nr_phy_data_tx_t;
|
} nr_phy_data_tx_t;
|
||||||
|
|
||||||
typedef struct nr_phy_data_s {
|
typedef struct nr_phy_data_s {
|
||||||
|
|||||||
@@ -90,7 +90,7 @@
|
|||||||
@param proc Pointer to RXn-TXnp4 proc information
|
@param proc Pointer to RXn-TXnp4 proc information
|
||||||
@param phy_data
|
@param phy_data
|
||||||
*/
|
*/
|
||||||
void phy_procedures_nrUE_TX(PHY_VARS_NR_UE *ue, const UE_nr_rxtx_proc_t *proc, nr_phy_data_tx_t *phy_data);
|
void phy_procedures_nrUE_TX(PHY_VARS_NR_UE *ue, const UE_nr_rxtx_proc_t *proc, nr_phy_data_tx_t *phy_data, c16_t **txp);
|
||||||
|
|
||||||
int pbch_pdcch_processing(PHY_VARS_NR_UE *ue, const UE_nr_rxtx_proc_t *proc, nr_phy_data_t *phy_data);
|
int pbch_pdcch_processing(PHY_VARS_NR_UE *ue, const UE_nr_rxtx_proc_t *proc, nr_phy_data_t *phy_data);
|
||||||
|
|
||||||
@@ -100,7 +100,7 @@ void processSlotTX(void *arg);
|
|||||||
|
|
||||||
/*! \brief UE PRACH procedures.
|
/*! \brief UE PRACH procedures.
|
||||||
*/
|
*/
|
||||||
void nr_ue_prach_procedures(PHY_VARS_NR_UE *ue, const UE_nr_rxtx_proc_t *proc);
|
void nr_ue_prach_procedures(PHY_VARS_NR_UE *ue, const UE_nr_rxtx_proc_t *proc, c16_t **txData);
|
||||||
|
|
||||||
int8_t nr_find_ue(uint16_t rnti, PHY_VARS_eNB *phy_vars_eNB);
|
int8_t nr_find_ue(uint16_t rnti, PHY_VARS_eNB *phy_vars_eNB);
|
||||||
|
|
||||||
@@ -160,7 +160,7 @@ void nr_ue_csi_rs_procedures(PHY_VARS_NR_UE *ue,
|
|||||||
fapi_nr_dl_config_csirs_pdu_rel15_t *csirs_config_pdu);
|
fapi_nr_dl_config_csirs_pdu_rel15_t *csirs_config_pdu);
|
||||||
|
|
||||||
int psbch_pscch_processing(PHY_VARS_NR_UE *ue, const UE_nr_rxtx_proc_t *proc, nr_phy_data_t *phy_data);
|
int psbch_pscch_processing(PHY_VARS_NR_UE *ue, const UE_nr_rxtx_proc_t *proc, nr_phy_data_t *phy_data);
|
||||||
void phy_procedures_nrUE_SL_TX(PHY_VARS_NR_UE *ue, const UE_nr_rxtx_proc_t *proc, nr_phy_data_tx_t *phy_data);
|
void phy_procedures_nrUE_SL_TX(PHY_VARS_NR_UE *ue, const UE_nr_rxtx_proc_t *proc, nr_phy_data_tx_t *phy_data, c16_t **txp);
|
||||||
/*! \brief This function prepares the sl indication to pass to the MAC
|
/*! \brief This function prepares the sl indication to pass to the MAC
|
||||||
*/
|
*/
|
||||||
void nr_fill_sl_indication(nr_sidelink_indication_t *sl_ind,
|
void nr_fill_sl_indication(nr_sidelink_indication_t *sl_ind,
|
||||||
|
|||||||
@@ -268,7 +268,7 @@ void ue_ta_procedures(PHY_VARS_NR_UE *ue, int slot_tx, int frame_tx)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void phy_procedures_nrUE_TX(PHY_VARS_NR_UE *ue, const UE_nr_rxtx_proc_t *proc, nr_phy_data_tx_t *phy_data)
|
void phy_procedures_nrUE_TX(PHY_VARS_NR_UE *ue, const UE_nr_rxtx_proc_t *proc, nr_phy_data_tx_t *phy_data, c16_t **txp)
|
||||||
{
|
{
|
||||||
const int slot_tx = proc->nr_slot_tx;
|
const int slot_tx = proc->nr_slot_tx;
|
||||||
const int frame_tx = proc->frame_tx;
|
const int frame_tx = proc->frame_tx;
|
||||||
@@ -306,12 +306,13 @@ void phy_procedures_nrUE_TX(PHY_VARS_NR_UE *ue, const UE_nr_rxtx_proc_t *proc, n
|
|||||||
&ue->frame_parms,
|
&ue->frame_parms,
|
||||||
ue->frame_parms.nb_antennas_tx,
|
ue->frame_parms.nb_antennas_tx,
|
||||||
(c16_t **)txdataF,
|
(c16_t **)txdataF,
|
||||||
|
txp,
|
||||||
link_type_ul,
|
link_type_ul,
|
||||||
was_symbol_used);
|
was_symbol_used);
|
||||||
stop_meas_nr_ue_phy(ue, OFDM_MOD_STATS);
|
stop_meas_nr_ue_phy(ue, OFDM_MOD_STATS);
|
||||||
}
|
}
|
||||||
|
|
||||||
nr_ue_prach_procedures(ue, proc);
|
nr_ue_prach_procedures(ue, proc, txp);
|
||||||
|
|
||||||
LOG_D(PHY, "****** end TX-Chain for AbsSubframe %d.%d ******\n", proc->frame_tx, proc->nr_slot_tx);
|
LOG_D(PHY, "****** end TX-Chain for AbsSubframe %d.%d ******\n", proc->frame_tx, proc->nr_slot_tx);
|
||||||
|
|
||||||
@@ -1179,7 +1180,7 @@ void pdsch_processing(PHY_VARS_NR_UE *ue, const UE_nr_rxtx_proc_t *proc, nr_phy_
|
|||||||
|
|
||||||
// todo:
|
// todo:
|
||||||
// - power control as per 38.213 ch 7.4
|
// - power control as per 38.213 ch 7.4
|
||||||
void nr_ue_prach_procedures(PHY_VARS_NR_UE *ue, const UE_nr_rxtx_proc_t *proc)
|
void nr_ue_prach_procedures(PHY_VARS_NR_UE *ue, const UE_nr_rxtx_proc_t *proc, c16_t **txData)
|
||||||
{
|
{
|
||||||
int gNB_id = proc->gNB_id;
|
int gNB_id = proc->gNB_id;
|
||||||
int frame_tx = proc->frame_tx, nr_slot_tx = proc->nr_slot_tx, prach_power; // tx_amp
|
int frame_tx = proc->frame_tx, nr_slot_tx = proc->nr_slot_tx, prach_power; // tx_amp
|
||||||
@@ -1208,7 +1209,7 @@ void nr_ue_prach_procedures(PHY_VARS_NR_UE *ue, const UE_nr_rxtx_proc_t *proc)
|
|||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GENERATE_PRACH, VCD_FUNCTION_IN);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GENERATE_PRACH, VCD_FUNCTION_IN);
|
||||||
|
|
||||||
start_meas_nr_ue_phy(ue, PRACH_GEN_STATS);
|
start_meas_nr_ue_phy(ue, PRACH_GEN_STATS);
|
||||||
prach_power = generate_nr_prach(ue, gNB_id, frame_tx, nr_slot_tx);
|
prach_power = generate_nr_prach(ue, gNB_id, frame_tx, nr_slot_tx, txData);
|
||||||
stop_meas_nr_ue_phy(ue, PRACH_GEN_STATS);
|
stop_meas_nr_ue_phy(ue, PRACH_GEN_STATS);
|
||||||
if (cpumeas(CPUMEAS_GETSTATE)) {
|
if (cpumeas(CPUMEAS_GETSTATE)) {
|
||||||
LOG_D(PHY,
|
LOG_D(PHY,
|
||||||
|
|||||||
@@ -264,7 +264,7 @@ int psbch_pscch_processing(PHY_VARS_NR_UE *ue, const UE_nr_rxtx_proc_t *proc, nr
|
|||||||
return sampleShift;
|
return sampleShift;
|
||||||
}
|
}
|
||||||
|
|
||||||
void phy_procedures_nrUE_SL_TX(PHY_VARS_NR_UE *ue, const UE_nr_rxtx_proc_t *proc, nr_phy_data_tx_t *phy_data)
|
void phy_procedures_nrUE_SL_TX(PHY_VARS_NR_UE *ue, const UE_nr_rxtx_proc_t *proc, nr_phy_data_tx_t *phy_data, c16_t **txp)
|
||||||
{
|
{
|
||||||
int slot_tx = proc->nr_slot_tx;
|
int slot_tx = proc->nr_slot_tx;
|
||||||
int frame_tx = proc->frame_tx;
|
int frame_tx = proc->frame_tx;
|
||||||
@@ -313,7 +313,7 @@ void phy_procedures_nrUE_SL_TX(PHY_VARS_NR_UE *ue, const UE_nr_rxtx_proc_t *proc
|
|||||||
was_symbol_used[i] = true;
|
was_symbol_used[i] = true;
|
||||||
if (tx_action) {
|
if (tx_action) {
|
||||||
LOG_D(NR_PHY, "Sending Uplink data \n");
|
LOG_D(NR_PHY, "Sending Uplink data \n");
|
||||||
nr_ue_pusch_common_procedures(ue, proc->nr_slot_tx, fp, fp->nb_antennas_tx, txdataF, link_type_sl, was_symbol_used);
|
nr_ue_pusch_common_procedures(ue, proc->nr_slot_tx, fp, fp->nb_antennas_tx, txdataF, txp, link_type_sl, was_symbol_used);
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_D(NR_PHY, "****** end Sidelink TX-Chain for AbsSubframe %d.%d ******\n", frame_tx, slot_tx);
|
LOG_D(NR_PHY, "****** end Sidelink TX-Chain for AbsSubframe %d.%d ******\n", frame_tx, slot_tx);
|
||||||
|
|||||||
@@ -134,7 +134,7 @@ int main(int argc, char **argv){
|
|||||||
get_softmodem_params()->sl_mode = 0;
|
get_softmodem_params()->sl_mode = 0;
|
||||||
double sigma2, sigma2_dB = 0, SNR, snr0 = -2.0, snr1 = 0.0, ue_speed0 = 0.0, ue_speed1 = 0.0;
|
double sigma2, sigma2_dB = 0, SNR, snr0 = -2.0, snr1 = 0.0, ue_speed0 = 0.0, ue_speed1 = 0.0;
|
||||||
double **s_re, **s_im, **r_re, **r_im, iqim = 0.0, delay_avg = 0, ue_speed = 0, fs=-1, bw;
|
double **s_re, **s_im, **r_re, **r_im, iqim = 0.0, delay_avg = 0, ue_speed = 0, fs=-1, bw;
|
||||||
int i, l, aa, aarx, trial, n_frames = 1, prach_start, rx_prach_start; //, ntrials=1;
|
int i, l, aa, aarx, trial, n_frames = 1, rx_prach_start; //, ntrials=1;
|
||||||
c16_t **txdata;
|
c16_t **txdata;
|
||||||
int N_RB_UL = 106, delay = 0, NCS_config = 13, rootSequenceIndex = 1, threequarter_fs = 0, mu = 1, fd_occasion = 0, loglvl = OAILOG_INFO, numRA = 0, prachStartSymbol = 0;
|
int N_RB_UL = 106, delay = 0, NCS_config = 13, rootSequenceIndex = 1, threequarter_fs = 0, mu = 1, fd_occasion = 0, loglvl = OAILOG_INFO, numRA = 0, prachStartSymbol = 0;
|
||||||
uint8_t snr1set = 0, ue_speed1set = 0, transmission_mode = 1, n_tx = 1, n_rx = 1, awgn_flag = 0, msg1_frequencystart = 0, num_prach_fd_occasions = 1, prach_format=0;
|
uint8_t snr1set = 0, ue_speed1set = 0, transmission_mode = 1, n_tx = 1, n_rx = 1, awgn_flag = 0, msg1_frequencystart = 0, num_prach_fd_occasions = 1, prach_format=0;
|
||||||
@@ -666,14 +666,17 @@ int main(int argc, char **argv){
|
|||||||
ue_prach_config->num_prach_fd_occasions_list[fd_occasion].prach_root_sequence_index,
|
ue_prach_config->num_prach_fd_occasions_list[fd_occasion].prach_root_sequence_index,
|
||||||
UE->X_u);
|
UE->X_u);
|
||||||
|
|
||||||
generate_nr_prach(UE, 0, frame, slot);
|
int prach_start = subframe * frame_parms->samples_per_subframe;
|
||||||
|
int slot_start = frame_parms->get_samples_slot_timestamp(slot, frame_parms, 0);
|
||||||
|
c16_t *tx[frame_parms->nb_antennas_rx];
|
||||||
|
for (int i = 0; i < frame_parms->nb_antennas_rx; i++)
|
||||||
|
tx[i] = txdata[i] + slot_start;
|
||||||
|
generate_nr_prach(UE, 0, frame, slot, tx);
|
||||||
|
|
||||||
/* tx_lev_dB not used later, no need to set */
|
/* tx_lev_dB not used later, no need to set */
|
||||||
//tx_lev_dB = (unsigned int) dB_fixed(tx_lev);
|
//tx_lev_dB = (unsigned int) dB_fixed(tx_lev);
|
||||||
|
|
||||||
prach_start = subframe*frame_parms->samples_per_subframe;
|
#ifdef NR_PRACH_DEBUG
|
||||||
|
|
||||||
#ifdef NR_PRACH_DEBUG
|
|
||||||
LOG_M("txsig0.m", "txs0", &txdata[0][subframe*frame_parms->samples_per_subframe], frame_parms->samples_per_subframe, 1, 1);
|
LOG_M("txsig0.m", "txs0", &txdata[0][subframe*frame_parms->samples_per_subframe], frame_parms->samples_per_subframe, 1, 1);
|
||||||
LOG_M("txsig0_frame.m","txs0", txdata[0],frame_parms->samples_per_frame,1,1);
|
LOG_M("txsig0_frame.m","txs0", txdata[0],frame_parms->samples_per_frame,1,1);
|
||||||
#endif
|
#endif
|
||||||
@@ -750,8 +753,9 @@ int main(int argc, char **argv){
|
|||||||
|
|
||||||
for (i = 0; i< frame_parms->samples_per_subframe; i++) {
|
for (i = 0; i< frame_parms->samples_per_subframe; i++) {
|
||||||
for (aa = 0; aa < frame_parms->nb_antennas_rx; aa++) {
|
for (aa = 0; aa < frame_parms->nb_antennas_rx; aa++) {
|
||||||
((short*) &ru->common.rxdata[aa][rx_prach_start])[2*i] = (short) (.167*(r_re[aa][i] +sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
|
c16_t *tmp = (c16_t *)ru->common.rxdata[aa] + rx_prach_start + i;
|
||||||
((short*) &ru->common.rxdata[aa][rx_prach_start])[2*i+1] = (short) (.167*(r_im[aa][i] + (iqim*r_re[aa][i]) + sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
|
tmp->r = (short)(.167 * (r_re[aa][i] + sqrt(sigma2 / 2) * gaussdouble(0.0, 1.0)));
|
||||||
|
tmp->i = (short)(.167 * (r_im[aa][i] + (iqim * r_re[aa][i]) + sqrt(sigma2 / 2) * gaussdouble(0.0, 1.0)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -765,14 +769,9 @@ int main(int argc, char **argv){
|
|||||||
|
|
||||||
for (l = 0; l < frame_parms->symbols_per_slot; l++) {
|
for (l = 0; l < frame_parms->symbols_per_slot; l++) {
|
||||||
for (aa = 0; aa < frame_parms->nb_antennas_rx; aa++) {
|
for (aa = 0; aa < frame_parms->nb_antennas_rx; aa++) {
|
||||||
nr_slot_fep_ul(frame_parms,
|
nr_slot_fep_ul(frame_parms, ru->common.rxdata[aa], ru->common.rxdataF[aa], l, slot, ru->N_TA_offset);
|
||||||
(int32_t *)ru->common.rxdata[aa],
|
}
|
||||||
(int32_t *)ru->common.rxdataF[aa],
|
}
|
||||||
l,
|
|
||||||
slot,
|
|
||||||
ru->N_TA_offset);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
rx_nr_prach_ru(ru, prach_format, numRA, prachStartSymbol, slot, prachOccasion, frame, slot);
|
rx_nr_prach_ru(ru, prach_format, numRA, prachStartSymbol, slot, prachOccasion, frame, slot);
|
||||||
|
|
||||||
|
|||||||
@@ -576,8 +576,11 @@ int main(int argc, char **argv)
|
|||||||
proc.frame_rx,
|
proc.frame_rx,
|
||||||
proc.nr_slot_rx,
|
proc.nr_slot_rx,
|
||||||
sl_uerx->sl_config.sl_sync_source.rx_slss_id);
|
sl_uerx->sl_config.sl_sync_source.rx_slss_id);
|
||||||
|
int slot_start = frame_parms->get_samples_slot_timestamp(slot, frame_parms, 0);
|
||||||
phy_procedures_nrUE_SL_TX(UE_TX, &proc, &phy_data_tx);
|
c16_t *tx[frame_parms->nb_antennas_rx];
|
||||||
|
for (int i = 0; i < frame_parms->nb_antennas_rx; i++)
|
||||||
|
tx[i] = UE_TX->common_vars.txData[i] + slot_start;
|
||||||
|
phy_procedures_nrUE_SL_TX(UE_TX, &proc, &phy_data_tx, tx);
|
||||||
|
|
||||||
for (SNR = snr0; SNR >= snr1 && !stop; SNR -= 1) {
|
for (SNR = snr0; SNR >= snr1 && !stop; SNR -= 1) {
|
||||||
for (int trial = 0; trial < n_trials && !stop; trial++) {
|
for (int trial = 0; trial < n_trials && !stop; trial++) {
|
||||||
|
|||||||
@@ -190,8 +190,7 @@ int main(int argc, char *argv[])
|
|||||||
corr_level_t corr_level = CORR_LEVEL_LOW;
|
corr_level_t corr_level = CORR_LEVEL_LOW;
|
||||||
uint16_t N_RB_DL = 106, N_RB_UL = 106, mu = 1;
|
uint16_t N_RB_DL = 106, N_RB_UL = 106, mu = 1;
|
||||||
|
|
||||||
//unsigned char frame_type = 0;
|
// unsigned char frame_type = 0;
|
||||||
NR_DL_FRAME_PARMS *frame_parms;
|
|
||||||
int loglvl = OAILOG_WARNING;
|
int loglvl = OAILOG_WARNING;
|
||||||
uint16_t nb_symb_sch = 12;
|
uint16_t nb_symb_sch = 12;
|
||||||
int start_symbol = 0;
|
int start_symbol = 0;
|
||||||
@@ -612,11 +611,9 @@ int main(int argc, char *argv[])
|
|||||||
UL_INFO.crc_ind.number_crcs = 0;
|
UL_INFO.crc_ind.number_crcs = 0;
|
||||||
gNB->max_ldpc_iterations = max_ldpc_iterations;
|
gNB->max_ldpc_iterations = max_ldpc_iterations;
|
||||||
gNB->pusch_thres = -20;
|
gNB->pusch_thres = -20;
|
||||||
frame_parms = &gNB->frame_parms; //to be initialized I suppose (maybe not necessary for PBCH)
|
gNB->frame_parms.N_RB_DL = N_RB_DL;
|
||||||
|
gNB->frame_parms.N_RB_UL = N_RB_UL;
|
||||||
frame_parms->N_RB_DL = N_RB_DL;
|
gNB->frame_parms.Ncp = extended_prefix_flag ? EXTENDED : NORMAL;
|
||||||
frame_parms->N_RB_UL = N_RB_UL;
|
|
||||||
frame_parms->Ncp = extended_prefix_flag ? EXTENDED : NORMAL;
|
|
||||||
|
|
||||||
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;
|
||||||
@@ -682,8 +679,8 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
// UE dedicated configuration
|
// UE dedicated configuration
|
||||||
nr_mac_add_test_ue(RC.nrmac[0], rnti, secondaryCellGroup);
|
nr_mac_add_test_ue(RC.nrmac[0], rnti, secondaryCellGroup);
|
||||||
frame_parms->nb_antennas_tx = 1;
|
gNB->frame_parms.nb_antennas_tx = 1;
|
||||||
frame_parms->nb_antennas_rx = n_rx;
|
gNB->frame_parms.nb_antennas_rx = n_rx;
|
||||||
nfapi_nr_config_request_scf_t *cfg = &gNB->gNB_config;
|
nfapi_nr_config_request_scf_t *cfg = &gNB->gNB_config;
|
||||||
cfg->carrier_config.num_tx_ant.value = 1;
|
cfg->carrier_config.num_tx_ant.value = 1;
|
||||||
cfg->carrier_config.num_rx_ant.value = n_rx;
|
cfg->carrier_config.num_rx_ant.value = n_rx;
|
||||||
@@ -712,7 +709,7 @@ int main(int argc, char *argv[])
|
|||||||
n_rx,
|
n_rx,
|
||||||
channel_model,
|
channel_model,
|
||||||
sampling_frequency / 1e6,
|
sampling_frequency / 1e6,
|
||||||
frame_parms->ul_CarrierFreq,
|
gNB->frame_parms.ul_CarrierFreq,
|
||||||
tx_bandwidth,
|
tx_bandwidth,
|
||||||
DS_TDL,
|
DS_TDL,
|
||||||
maxDoppler,
|
maxDoppler,
|
||||||
@@ -732,7 +729,7 @@ int main(int argc, char *argv[])
|
|||||||
PHY_vars_UE_g = malloc(sizeof(PHY_VARS_NR_UE**));
|
PHY_vars_UE_g = malloc(sizeof(PHY_VARS_NR_UE**));
|
||||||
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));
|
UE->frame_parms = gNB->frame_parms;
|
||||||
UE->frame_parms.nb_antennas_tx = n_tx;
|
UE->frame_parms.nb_antennas_tx = n_tx;
|
||||||
UE->frame_parms.nb_antennas_rx = 0;
|
UE->frame_parms.nb_antennas_rx = 0;
|
||||||
UE->nrLDPC_coding_interface = gNB->nrLDPC_coding_interface;
|
UE->nrLDPC_coding_interface = gNB->nrLDPC_coding_interface;
|
||||||
@@ -865,7 +862,7 @@ int main(int argc, char *argv[])
|
|||||||
uint8_t ptrs_time_density = get_L_ptrs(ptrs_mcs1, ptrs_mcs2, ptrs_mcs3, Imcs, mcs_table);
|
uint8_t ptrs_time_density = get_L_ptrs(ptrs_mcs1, ptrs_mcs2, ptrs_mcs3, Imcs, mcs_table);
|
||||||
uint8_t ptrs_freq_density = get_K_ptrs(n_rb0, n_rb1, nb_rb);
|
uint8_t ptrs_freq_density = get_K_ptrs(n_rb0, n_rb1, nb_rb);
|
||||||
|
|
||||||
double ts = 1.0/(frame_parms->subcarrier_spacing * frame_parms->ofdm_symbol_size);
|
double ts = 1.0 / (gNB->frame_parms.subcarrier_spacing * gNB->frame_parms.ofdm_symbol_size);
|
||||||
|
|
||||||
/* -T option enable PTRS */
|
/* -T option enable PTRS */
|
||||||
if(enable_ptrs) {
|
if(enable_ptrs) {
|
||||||
@@ -897,7 +894,7 @@ int main(int argc, char *argv[])
|
|||||||
unsigned int available_bits = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, number_dmrs_symbols, unav_res, mod_order, precod_nbr_layers);
|
unsigned int available_bits = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, number_dmrs_symbols, unav_res, mod_order, precod_nbr_layers);
|
||||||
printf("[ULSIM]: VALUE OF G: %u, TBS: %u\n", available_bits, TBS);
|
printf("[ULSIM]: VALUE OF G: %u, TBS: %u\n", available_bits, TBS);
|
||||||
|
|
||||||
int frame_length_complex_samples = frame_parms->samples_per_subframe*NR_NUMBER_OF_SUBFRAMES_PER_FRAME;
|
int frame_length_complex_samples = gNB->frame_parms.samples_per_subframe * NR_NUMBER_OF_SUBFRAMES_PER_FRAME;
|
||||||
for (int aatx=0; aatx<n_tx; aatx++) {
|
for (int aatx=0; aatx<n_tx; aatx++) {
|
||||||
s_re[aatx] = calloc(1,frame_length_complex_samples*sizeof(double));
|
s_re[aatx] = calloc(1,frame_length_complex_samples*sizeof(double));
|
||||||
s_im[aatx] = calloc(1,frame_length_complex_samples*sizeof(double));
|
s_im[aatx] = calloc(1,frame_length_complex_samples*sizeof(double));
|
||||||
@@ -911,12 +908,14 @@ int main(int argc, char *argv[])
|
|||||||
//for (int i=0;i<16;i++) printf("%f\n",gaussdouble(0.0,1.0));
|
//for (int i=0;i<16;i++) printf("%f\n",gaussdouble(0.0,1.0));
|
||||||
int read_errors=0;
|
int read_errors=0;
|
||||||
|
|
||||||
int slot_offset = frame_parms->get_samples_slot_timestamp(slot,frame_parms,0);
|
int slot_offset = gNB->frame_parms.get_samples_slot_timestamp(slot, &gNB->frame_parms, 0);
|
||||||
int slot_length = slot_offset - frame_parms->get_samples_slot_timestamp(slot-1,frame_parms,0);
|
int slot_length = slot_offset - gNB->frame_parms.get_samples_slot_timestamp(slot - 1, &gNB->frame_parms, 0);
|
||||||
|
|
||||||
if (input_fd != NULL) {
|
if (input_fd != NULL) {
|
||||||
// 800 samples is N_TA_OFFSET for FR1 @ 30.72 Ms/s,
|
// 800 samples is N_TA_OFFSET for FR1 @ 30.72 Ms/s,
|
||||||
AssertFatal(frame_parms->subcarrier_spacing==30000,"only 30 kHz for file input for now (%d)\n",frame_parms->subcarrier_spacing);
|
AssertFatal(gNB->frame_parms.subcarrier_spacing == 30000,
|
||||||
|
"only 30 kHz for file input for now (%d)\n",
|
||||||
|
gNB->frame_parms.subcarrier_spacing);
|
||||||
|
|
||||||
if (params_from_file) {
|
if (params_from_file) {
|
||||||
fseek(input_fd,file_offset*((slot_length<<2)+4000+16),SEEK_SET);
|
fseek(input_fd,file_offset*((slot_length<<2)+4000+16),SEEK_SET);
|
||||||
@@ -942,7 +941,7 @@ int main(int argc, char *argv[])
|
|||||||
printf("harq_pid %d\n",harq_pid);
|
printf("harq_pid %d\n",harq_pid);
|
||||||
}
|
}
|
||||||
fseek(input_fd,file_offset*sizeof(int16_t)*2,SEEK_SET);
|
fseek(input_fd,file_offset*sizeof(int16_t)*2,SEEK_SET);
|
||||||
for (int irx=0; irx<frame_parms->nb_antennas_rx; irx++) {
|
for (int irx = 0; irx < gNB->frame_parms.nb_antennas_rx; irx++) {
|
||||||
fseek(input_fd,irx*(slot_length+15)*sizeof(int16_t)*2,SEEK_SET); // matlab adds samlples to the end to emulate channel delay
|
fseek(input_fd,irx*(slot_length+15)*sizeof(int16_t)*2,SEEK_SET); // matlab adds samlples to the end to emulate channel delay
|
||||||
read_errors += fread((void *)&rxdata[irx][slot_offset-delay], sizeof(int16_t), slot_length<<1, input_fd);
|
read_errors += fread((void *)&rxdata[irx][slot_offset-delay], sizeof(int16_t), slot_length<<1, input_fd);
|
||||||
if (read_errors==0) {
|
if (read_errors==0) {
|
||||||
@@ -1115,10 +1114,10 @@ int main(int argc, char *argv[])
|
|||||||
srs_pdu->rnti = n_rnti;
|
srs_pdu->rnti = n_rnti;
|
||||||
srs_pdu->bwp_size = NRRIV2BW(ubwp->bwp_Common->genericParameters.locationAndBandwidth, 275);
|
srs_pdu->bwp_size = NRRIV2BW(ubwp->bwp_Common->genericParameters.locationAndBandwidth, 275);
|
||||||
srs_pdu->bwp_start = NRRIV2PRBOFFSET(ubwp->bwp_Common->genericParameters.locationAndBandwidth, 275);
|
srs_pdu->bwp_start = NRRIV2PRBOFFSET(ubwp->bwp_Common->genericParameters.locationAndBandwidth, 275);
|
||||||
srs_pdu->subcarrier_spacing = frame_parms->subcarrier_spacing;
|
srs_pdu->subcarrier_spacing = gNB->frame_parms.subcarrier_spacing;
|
||||||
srs_pdu->num_ant_ports = n_tx == 4 ? 2 : n_tx == 2 ? 1 : 0;
|
srs_pdu->num_ant_ports = n_tx == 4 ? 2 : n_tx == 2 ? 1 : 0;
|
||||||
srs_pdu->sequence_id = 40;
|
srs_pdu->sequence_id = 40;
|
||||||
srs_pdu->time_start_position = frame_parms->symbols_per_slot - 1;
|
srs_pdu->time_start_position = gNB->frame_parms.symbols_per_slot - 1;
|
||||||
srs_pdu->config_index = rrc_get_max_nr_csrs(srs_pdu->bwp_size, srs_pdu->bandwidth_index);
|
srs_pdu->config_index = rrc_get_max_nr_csrs(srs_pdu->bwp_size, srs_pdu->bandwidth_index);
|
||||||
srs_pdu->resource_type = NR_SRS_Resource__resourceType_PR_periodic;
|
srs_pdu->resource_type = NR_SRS_Resource__resourceType_PR_periodic;
|
||||||
srs_pdu->t_srs = 1;
|
srs_pdu->t_srs = 1;
|
||||||
@@ -1197,7 +1196,7 @@ int main(int argc, char *argv[])
|
|||||||
srs_config_pdu->rnti = n_rnti;
|
srs_config_pdu->rnti = n_rnti;
|
||||||
srs_config_pdu->bwp_size = NRRIV2BW(ubwp->bwp_Common->genericParameters.locationAndBandwidth, 275);
|
srs_config_pdu->bwp_size = NRRIV2BW(ubwp->bwp_Common->genericParameters.locationAndBandwidth, 275);
|
||||||
srs_config_pdu->bwp_start = NRRIV2PRBOFFSET(ubwp->bwp_Common->genericParameters.locationAndBandwidth, 275);
|
srs_config_pdu->bwp_start = NRRIV2PRBOFFSET(ubwp->bwp_Common->genericParameters.locationAndBandwidth, 275);
|
||||||
srs_config_pdu->subcarrier_spacing = frame_parms->subcarrier_spacing;
|
srs_config_pdu->subcarrier_spacing = gNB->frame_parms.subcarrier_spacing;
|
||||||
srs_config_pdu->num_ant_ports = n_tx == 4 ? 2 : n_tx == 2 ? 1 : 0;
|
srs_config_pdu->num_ant_ports = n_tx == 4 ? 2 : n_tx == 2 ? 1 : 0;
|
||||||
srs_config_pdu->config_index = rrc_get_max_nr_csrs(srs_config_pdu->bwp_size, srs_config_pdu->bandwidth_index);
|
srs_config_pdu->config_index = rrc_get_max_nr_csrs(srs_config_pdu->bwp_size, srs_config_pdu->bandwidth_index);
|
||||||
srs_config_pdu->sequence_id = 40;
|
srs_config_pdu->sequence_id = 40;
|
||||||
@@ -1214,8 +1213,11 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
/////////////////////////phy_procedures_nr_ue_TX///////////////////////
|
/////////////////////////phy_procedures_nr_ue_TX///////////////////////
|
||||||
///////////
|
///////////
|
||||||
|
int slot_start = UE->frame_parms.get_samples_slot_timestamp(slot, &UE->frame_parms, 0);
|
||||||
phy_procedures_nrUE_TX(UE, &UE_proc, &phy_data);
|
c16_t *tx[UE->frame_parms.nb_antennas_tx];
|
||||||
|
for (int i = 0; i < UE->frame_parms.nb_antennas_tx; i++)
|
||||||
|
tx[i] = UE->common_vars.txData[i] + slot_start;
|
||||||
|
phy_procedures_nrUE_TX(UE, &UE_proc, &phy_data, tx);
|
||||||
|
|
||||||
if (n_trials == 1) {
|
if (n_trials == 1) {
|
||||||
LOG_M("txsig0.m", "txs0", &UE->common_vars.txData[0][slot_offset], slot_length, 1, 1 | log_format);
|
LOG_M("txsig0.m", "txs0", &UE->common_vars.txData[0][slot_offset], slot_length, 1, 1 | log_format);
|
||||||
@@ -1229,13 +1231,14 @@ int main(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
///////////
|
///////////
|
||||||
////////////////////////////////////////////////////
|
////////////////////////////////////////////////////
|
||||||
tx_offset = frame_parms->get_samples_slot_timestamp(slot, frame_parms, 0);
|
tx_offset = gNB->frame_parms.get_samples_slot_timestamp(slot, &gNB->frame_parms, 0);
|
||||||
txlev_sum = 0;
|
txlev_sum = 0;
|
||||||
for (int aa = 0; aa < UE->frame_parms.nb_antennas_tx; aa++) {
|
for (int aa = 0; aa < UE->frame_parms.nb_antennas_tx; aa++) {
|
||||||
atxlev[aa] = signal_energy(
|
atxlev[aa] =
|
||||||
(int32_t *)&UE->common_vars.txData[aa][tx_offset + 5 * frame_parms->ofdm_symbol_size
|
signal_energy((int32_t *)&UE->common_vars
|
||||||
+ 4 * frame_parms->nb_prefix_samples + frame_parms->nb_prefix_samples0],
|
.txData[aa][tx_offset + 5 * gNB->frame_parms.ofdm_symbol_size
|
||||||
frame_parms->ofdm_symbol_size + frame_parms->nb_prefix_samples);
|
+ 4 * gNB->frame_parms.nb_prefix_samples + gNB->frame_parms.nb_prefix_samples0],
|
||||||
|
gNB->frame_parms.ofdm_symbol_size + gNB->frame_parms.nb_prefix_samples);
|
||||||
|
|
||||||
txlev_sum += atxlev[aa];
|
txlev_sum += atxlev[aa];
|
||||||
|
|
||||||
@@ -1248,11 +1251,16 @@ int main(int argc, char *argv[])
|
|||||||
if (input_fd == NULL) {
|
if (input_fd == NULL) {
|
||||||
// Justification of division by precod_nbr_layers:
|
// Justification of division by precod_nbr_layers:
|
||||||
// When the channel is the identity matrix, the results in terms of SNR should be almost equal for 2x2 and 4x4.
|
// When the channel is the identity matrix, the results in terms of SNR should be almost equal for 2x2 and 4x4.
|
||||||
sigma_dB = 10 * log10((double)txlev_sum / precod_nbr_layers * ((double)frame_parms->ofdm_symbol_size / (12 * nb_rb))) - SNR;
|
sigma_dB =
|
||||||
|
10 * log10((double)txlev_sum / precod_nbr_layers * ((double)gNB->frame_parms.ofdm_symbol_size / (12 * nb_rb))) - SNR;
|
||||||
sigma = pow(10, sigma_dB / 10);
|
sigma = pow(10, sigma_dB / 10);
|
||||||
|
|
||||||
if (n_trials == 1)
|
if (n_trials == 1)
|
||||||
printf("sigma %f (%f dB), txlev_sum %f (factor %f)\n", sigma, sigma_dB, 10 * log10((double)txlev_sum), (double)(double)frame_parms->ofdm_symbol_size / (12 * nb_rb));
|
printf("sigma %f (%f dB), txlev_sum %f (factor %f)\n",
|
||||||
|
sigma,
|
||||||
|
sigma_dB,
|
||||||
|
10 * log10((double)txlev_sum),
|
||||||
|
(double)(double)gNB->frame_parms.ofdm_symbol_size / (12 * nb_rb));
|
||||||
|
|
||||||
for (i = 0; i < slot_length; i++) {
|
for (i = 0; i < slot_length; i++) {
|
||||||
for (int aa = 0; aa < UE->frame_parms.nb_antennas_tx; aa++) {
|
for (int aa = 0; aa < UE->frame_parms.nb_antennas_tx; aa++) {
|
||||||
@@ -1262,7 +1270,17 @@ int main(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
|
|
||||||
multipath_channel(UE2gNB, s_re, s_im, r_re, r_im, slot_length, 0, (n_trials == 1) ? 1 : 0);
|
multipath_channel(UE2gNB, s_re, s_im, r_re, r_im, slot_length, 0, (n_trials == 1) ? 1 : 0);
|
||||||
add_noise(rxdata, (const double **) r_re, (const double **) r_im, sigma, slot_length, slot_offset, ts, delay, pdu_bit_map, PUSCH_PDU_BITMAP_PUSCH_PTRS, frame_parms->nb_antennas_rx);
|
add_noise(rxdata,
|
||||||
|
(const double **)r_re,
|
||||||
|
(const double **)r_im,
|
||||||
|
sigma,
|
||||||
|
slot_length,
|
||||||
|
slot_offset,
|
||||||
|
ts,
|
||||||
|
delay,
|
||||||
|
pdu_bit_map,
|
||||||
|
PUSCH_PDU_BITMAP_PUSCH_PTRS,
|
||||||
|
gNB->frame_parms.nb_antennas_rx);
|
||||||
|
|
||||||
} /*End input_fd */
|
} /*End input_fd */
|
||||||
|
|
||||||
@@ -1298,15 +1316,25 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
if (n_trials == 1 && round == 0) {
|
if (n_trials == 1 && round == 0) {
|
||||||
LOG_M("rxsig0.m", "rx0", &rxdata[0][slot_offset], slot_length, 1, 1 | log_format);
|
LOG_M("rxsig0.m", "rx0", &rxdata[0][slot_offset], slot_length, 1, 1 | log_format);
|
||||||
LOG_M("rxsigF0.m", "rxsF0", gNB->common_vars.rxdataF[0][0], 14 * frame_parms->ofdm_symbol_size, 1, 1 | log_format);
|
LOG_M("rxsigF0.m", "rxsF0", gNB->common_vars.rxdataF[0][0], 14 * gNB->frame_parms.ofdm_symbol_size, 1, 1 | log_format);
|
||||||
if (precod_nbr_layers > 1) {
|
if (precod_nbr_layers > 1) {
|
||||||
LOG_M("rxsig1.m", "rx1", &rxdata[1][slot_offset], slot_length, 1, 1);
|
LOG_M("rxsig1.m", "rx1", &rxdata[1][slot_offset], slot_length, 1, 1);
|
||||||
LOG_M("rxsigF1.m", "rxsF1", gNB->common_vars.rxdataF[0][1], 14 * frame_parms->ofdm_symbol_size, 1, 1 | log_format);
|
LOG_M("rxsigF1.m", "rxsF1", gNB->common_vars.rxdataF[0][1], 14 * gNB->frame_parms.ofdm_symbol_size, 1, 1 | log_format);
|
||||||
if (precod_nbr_layers == 4) {
|
if (precod_nbr_layers == 4) {
|
||||||
LOG_M("rxsig2.m", "rx2", &rxdata[2][slot_offset], slot_length, 1, 1);
|
LOG_M("rxsig2.m", "rx2", &rxdata[2][slot_offset], slot_length, 1, 1);
|
||||||
LOG_M("rxsig3.m", "rx3", &rxdata[3][slot_offset], slot_length, 1, 1);
|
LOG_M("rxsig3.m", "rx3", &rxdata[3][slot_offset], slot_length, 1, 1);
|
||||||
LOG_M("rxsigF2.m", "rxsF2", gNB->common_vars.rxdataF[0][2], 14 * frame_parms->ofdm_symbol_size, 1, 1 | log_format);
|
LOG_M("rxsigF2.m",
|
||||||
LOG_M("rxsigF3.m", "rxsF3", gNB->common_vars.rxdataF[0][3], 14 * frame_parms->ofdm_symbol_size, 1, 1 | log_format);
|
"rxsF2",
|
||||||
|
gNB->common_vars.rxdataF[0][2],
|
||||||
|
14 * gNB->frame_parms.ofdm_symbol_size,
|
||||||
|
1,
|
||||||
|
1 | log_format);
|
||||||
|
LOG_M("rxsigF3.m",
|
||||||
|
"rxsF3",
|
||||||
|
gNB->common_vars.rxdataF[0][3],
|
||||||
|
14 * gNB->frame_parms.ofdm_symbol_size,
|
||||||
|
1,
|
||||||
|
1 | log_format);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1317,8 +1345,8 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
LOG_M("chestF0.m",
|
LOG_M("chestF0.m",
|
||||||
"chF0",
|
"chF0",
|
||||||
&pusch_vars->ul_ch_estimates[0][start_symbol * frame_parms->ofdm_symbol_size],
|
&pusch_vars->ul_ch_estimates[0][start_symbol * gNB->frame_parms.ofdm_symbol_size],
|
||||||
frame_parms->ofdm_symbol_size,
|
gNB->frame_parms.ofdm_symbol_size,
|
||||||
1,
|
1,
|
||||||
1 | log_format);
|
1 | log_format);
|
||||||
|
|
||||||
@@ -1332,8 +1360,8 @@ int main(int argc, char *argv[])
|
|||||||
if (precod_nbr_layers == 2) {
|
if (precod_nbr_layers == 2) {
|
||||||
LOG_M("chestF3.m",
|
LOG_M("chestF3.m",
|
||||||
"chF3",
|
"chF3",
|
||||||
&pusch_vars->ul_ch_estimates[3][start_symbol * frame_parms->ofdm_symbol_size],
|
&pusch_vars->ul_ch_estimates[3][start_symbol * gNB->frame_parms.ofdm_symbol_size],
|
||||||
frame_parms->ofdm_symbol_size,
|
gNB->frame_parms.ofdm_symbol_size,
|
||||||
1,
|
1,
|
||||||
1 | log_format);
|
1 | log_format);
|
||||||
|
|
||||||
@@ -1348,20 +1376,20 @@ int main(int argc, char *argv[])
|
|||||||
if (precod_nbr_layers == 4) {
|
if (precod_nbr_layers == 4) {
|
||||||
LOG_M("chestF5.m",
|
LOG_M("chestF5.m",
|
||||||
"chF5",
|
"chF5",
|
||||||
&pusch_vars->ul_ch_estimates[5][start_symbol * frame_parms->ofdm_symbol_size],
|
&pusch_vars->ul_ch_estimates[5][start_symbol * gNB->frame_parms.ofdm_symbol_size],
|
||||||
frame_parms->ofdm_symbol_size,
|
gNB->frame_parms.ofdm_symbol_size,
|
||||||
1,
|
1,
|
||||||
1 | log_format);
|
1 | log_format);
|
||||||
LOG_M("chestF10.m",
|
LOG_M("chestF10.m",
|
||||||
"chF10",
|
"chF10",
|
||||||
&pusch_vars->ul_ch_estimates[10][start_symbol * frame_parms->ofdm_symbol_size],
|
&pusch_vars->ul_ch_estimates[10][start_symbol * gNB->frame_parms.ofdm_symbol_size],
|
||||||
frame_parms->ofdm_symbol_size,
|
gNB->frame_parms.ofdm_symbol_size,
|
||||||
1,
|
1,
|
||||||
1 | log_format);
|
1 | log_format);
|
||||||
LOG_M("chestF15.m",
|
LOG_M("chestF15.m",
|
||||||
"chF15",
|
"chF15",
|
||||||
&pusch_vars->ul_ch_estimates[15][start_symbol * frame_parms->ofdm_symbol_size],
|
&pusch_vars->ul_ch_estimates[15][start_symbol * gNB->frame_parms.ofdm_symbol_size],
|
||||||
frame_parms->ofdm_symbol_size,
|
gNB->frame_parms.ofdm_symbol_size,
|
||||||
1,
|
1,
|
||||||
1 | log_format);
|
1 | log_format);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user