fixing/simplifying slot_fep for single thread, adding support extended CP
removing warnings for --emulate-rf mode, tx_frame now also written to binary file so that it can be read by UE in mode --loop-memory
This commit is contained in:
@@ -74,11 +74,20 @@ void nr_feptx0(RU_t *ru,int slot) {
|
||||
LOG_D(PHY,"SFN/SF:RU:TX:%d/%d Generating slot %d\n",ru->proc.frame_tx, ru->proc.subframe_tx,slot);
|
||||
|
||||
for (aa=0; aa<ru->nb_tx; aa++) {
|
||||
if (fp->Ncp == 1) {
|
||||
PHY_ofdm_mod(&ru->common.txdataF_BF[aa][slot*slot_sizeF],
|
||||
(int*)&ru->common.txdata[aa][slot_offset],
|
||||
fp->ofdm_symbol_size,
|
||||
12,
|
||||
fp->nb_prefix_samples,
|
||||
CYCLIC_PREFIX);
|
||||
}
|
||||
else {
|
||||
nr_normal_prefix_mod(&ru->common.txdataF_BF[aa][slot*slot_sizeF],
|
||||
(int*)&ru->common.txdata[aa][slot_offset],
|
||||
fp->symbols_per_slot,
|
||||
fp);
|
||||
|
||||
}
|
||||
}
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPTX_OFDM+slot , 0);
|
||||
}
|
||||
@@ -180,136 +189,41 @@ void nr_init_feptx_thread(RU_t *ru,pthread_attr_t *attr_feptx) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
// is this supposed to generate a slot or a subframe???
|
||||
// seems to be hardcoded to numerology 1 (2 slots=1 subframe)
|
||||
void nr_feptx_ofdm(RU_t *ru) {
|
||||
|
||||
NR_DL_FRAME_PARMS *fp=ru->nr_frame_parms;
|
||||
nfapi_nr_config_request_t *cfg = &ru->gNB_list[0]->gNB_config;
|
||||
|
||||
unsigned int aa,slot_offset, slot_offset_F;
|
||||
int dummy_tx_b[7680*4] __attribute__((aligned(32)));
|
||||
int i,j, tx_offset;
|
||||
unsigned int aa=0,slot=0;
|
||||
int slot_sizeF = (fp->ofdm_symbol_size)*
|
||||
((cfg->subframe_config.dl_cyclic_prefix_type.value == 1) ? 12 : 14);
|
||||
int len,len2;
|
||||
int16_t *txdata;
|
||||
int subframe = ru->proc.subframe_tx;
|
||||
|
||||
// int CC_id = ru->proc.CC_id;
|
||||
int *txdata = &ru->common.txdata[aa][subframe*fp->samples_per_subframe];
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPTX_OFDM , 1 );
|
||||
start_meas(&ru->ofdm_mod_stats);
|
||||
|
||||
slot_offset_F = 0;
|
||||
|
||||
slot_offset = subframe*fp->samples_per_subframe;
|
||||
// this copy should be done in the precoding thread (currently inactive)
|
||||
for (int aa=0;aa<ru->nb_tx;aa++)
|
||||
memcpy((void*)ru->common.txdataF_BF[aa],
|
||||
(void*)ru->gNB_list[0]->common_vars.txdataF[aa], fp->samples_per_subframe_wCP*sizeof(int32_t));
|
||||
|
||||
if ((nr_subframe_select(cfg,subframe)==SF_DL)||
|
||||
((nr_subframe_select(cfg,subframe)==SF_S))) {
|
||||
// LOG_D(HW,"Frame %d: Generating slot %d\n",frame,next_slot);
|
||||
|
||||
start_meas(&ru->ofdm_mod_stats);
|
||||
for (slot=0; slot<fp->slots_per_subframe;slot++)
|
||||
nr_feptx0(ru,slot);
|
||||
|
||||
for (aa=0; aa<ru->nb_tx; aa++) {
|
||||
if (cfg->subframe_config.dl_cyclic_prefix_type.value == 1) {
|
||||
PHY_ofdm_mod(&ru->common.txdataF_BF[aa][0],
|
||||
dummy_tx_b,
|
||||
fp->ofdm_symbol_size,
|
||||
12,
|
||||
fp->nb_prefix_samples,
|
||||
CYCLIC_PREFIX);
|
||||
PHY_ofdm_mod(&ru->common.txdataF_BF[aa][slot_sizeF],
|
||||
dummy_tx_b+(fp->samples_per_subframe / fp->slots_per_subframe),
|
||||
fp->ofdm_symbol_size,
|
||||
12,
|
||||
fp->nb_prefix_samples,
|
||||
CYCLIC_PREFIX);
|
||||
} else {
|
||||
nr_normal_prefix_mod(&ru->common.txdataF_BF[aa][slot_offset_F],
|
||||
dummy_tx_b,
|
||||
14,
|
||||
fp);
|
||||
// if S-subframe generate first slot only
|
||||
if (nr_subframe_select(cfg,subframe) == SF_DL)
|
||||
nr_normal_prefix_mod(&ru->common.txdataF_BF[aa][slot_offset_F+slot_sizeF],
|
||||
dummy_tx_b+(fp->samples_per_subframe / fp->slots_per_subframe),
|
||||
14,
|
||||
fp);
|
||||
}
|
||||
|
||||
// if S-subframe generate first slot only
|
||||
if (nr_subframe_select(cfg,subframe) == SF_S)
|
||||
len = fp->samples_per_subframe / fp->slots_per_subframe;
|
||||
else
|
||||
len = fp->samples_per_subframe;
|
||||
|
||||
if (slot_offset<0) {
|
||||
txdata = (int16_t*)&ru->common.txdata[aa][(LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*fp->samples_per_subframe)+tx_offset];
|
||||
len2 = -(slot_offset);
|
||||
len2 = (len2>len) ? len : len2;
|
||||
for (i=0; i<(len2<<1); i++) {
|
||||
txdata[i] = ((int16_t*)dummy_tx_b)[i];
|
||||
}
|
||||
if (len2<len) {
|
||||
txdata = (int16_t*)&ru->common.txdata[aa][0];
|
||||
for (j=0; i<(len<<1); i++,j++) {
|
||||
txdata[j++] = ((int16_t*)dummy_tx_b)[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
else if ((slot_offset+len)>(fp->samples_per_frame)) {
|
||||
tx_offset = (int)slot_offset;
|
||||
txdata = (int16_t*)&ru->common.txdata[aa][tx_offset];
|
||||
len2 = -tx_offset + fp->samples_per_frame;
|
||||
for (i=0; i<(len2<<1); i++) {
|
||||
txdata[i] = ((int16_t*)dummy_tx_b)[i];
|
||||
}
|
||||
txdata = (int16_t*)&ru->common.txdata[aa][0];
|
||||
for (j=0; i<(len<<1); i++,j++) {
|
||||
txdata[j++] = ((int16_t*)dummy_tx_b)[i];
|
||||
}
|
||||
}
|
||||
else {
|
||||
//LOG_D(PHY,"feptx_ofdm: Writing to position %d\n",slot_offset);
|
||||
tx_offset = (int)slot_offset;
|
||||
txdata = (int16_t*)&ru->common.txdata[aa][tx_offset];
|
||||
|
||||
for (i=0; i<(len<<1); i++) {
|
||||
txdata[i] = ((int16_t*)dummy_tx_b)[i];
|
||||
}
|
||||
}
|
||||
|
||||
// if S-subframe switch to RX in second subframe
|
||||
/*
|
||||
if (subframe_select(fp,subframe) == SF_S) {
|
||||
for (i=0; i<len; i++) {
|
||||
ru->common_vars.txdata[0][aa][tx_offset++] = 0x00010001;
|
||||
}
|
||||
}
|
||||
*/
|
||||
/*if ((fp->frame_type == TDD) &&
|
||||
((fp->tdd_config==0) ||
|
||||
(fp->tdd_config==1) ||
|
||||
(fp->tdd_config==2) ||
|
||||
(fp->tdd_config==6)) &&
|
||||
((subframe==0) || (subframe==5))) {
|
||||
// turn on tx switch N_TA_offset before
|
||||
//LOG_D(HW,"subframe %d, time to switch to tx (N_TA_offset %d, slot_offset %d) \n",subframe,ru->N_TA_offset,slot_offset);
|
||||
for (i=0; i<ru->N_TA_offset; i++) {
|
||||
tx_offset = (int)slot_offset+i-ru->N_TA_offset/2;
|
||||
if (tx_offset<0)
|
||||
tx_offset += fp->samples_per_frame;
|
||||
|
||||
if (tx_offset>=(fp->samples_per_frame))
|
||||
tx_offset -= fp->samples_per_frame;
|
||||
|
||||
ru->common.txdata[aa][tx_offset] = 0x00000000;
|
||||
}
|
||||
}*/
|
||||
stop_meas(&ru->ofdm_mod_stats);
|
||||
LOG_D(PHY,"feptx_ofdm (TXPATH): frame %d, subframe %d: txp (time %p) %d dB, txp (freq) %d dB\n",
|
||||
ru->proc.frame_tx,subframe,txdata,dB_fixed(signal_energy((int32_t*)txdata,fp->samples_per_subframe)),
|
||||
dB_fixed(signal_energy_nodc(ru->common.txdataF_BF[aa],2*slot_sizeF)));
|
||||
}
|
||||
}
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPTX_OFDM , 0 );
|
||||
stop_meas(&ru->ofdm_mod_stats);
|
||||
|
||||
LOG_D(PHY,"feptx_ofdm (TXPATH): frame %d, subframe %d: txp (time %p) %d dB, txp (freq) %d dB\n",
|
||||
ru->proc.frame_tx,subframe,txdata,dB_fixed(signal_energy((int32_t*)txdata,fp->samples_per_subframe)),
|
||||
dB_fixed(signal_energy_nodc(ru->common.txdataF_BF[aa],2*slot_sizeF)));
|
||||
|
||||
}
|
||||
|
||||
@@ -163,6 +163,8 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB,
|
||||
NR_DL_FRAME_PARMS *fp=&gNB->frame_parms;
|
||||
nfapi_nr_config_request_t *cfg = &gNB->gNB_config;
|
||||
|
||||
int offset = gNB->CC_id;
|
||||
|
||||
if ((cfg->subframe_config.duplex_mode.value == TDD) && (nr_subframe_select(cfg,subframe)==SF_UL)) return;
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_TX+offset,1);
|
||||
|
||||
+15
-2
@@ -719,7 +719,8 @@ void rx_rf(RU_t *ru,int *frame,int *subframe) {
|
||||
if(emulate_rf){
|
||||
wait_on_condition(&proc->mutex_emulateRF,&proc->cond_emulateRF,&proc->instance_cnt_emulateRF,"emulatedRF_thread");
|
||||
release_thread(&proc->mutex_emulateRF,&proc->instance_cnt_emulateRF,"emulatedRF_thread");
|
||||
rxs = fp->samples_per_tti;
|
||||
rxs = fp->samples_per_subframe;
|
||||
ts = old_ts + rxs;
|
||||
}
|
||||
else{
|
||||
rxs = ru->rfdevice.trx_read_func(&ru->rfdevice,
|
||||
@@ -794,7 +795,7 @@ void rx_rf(RU_t *ru,int *frame,int *subframe) {
|
||||
if (rxs != fp->samples_per_subframe)
|
||||
{
|
||||
//exit_fun( "problem receiving samples" );
|
||||
LOG_E(PHY, "problem receiving samples");
|
||||
LOG_E(PHY, "problem receiving samples\n");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1543,6 +1544,18 @@ static void* ru_thread( void* param ) {
|
||||
{
|
||||
sprintf(filename,"tx%ddata_frame%d.m", i, print_frame);
|
||||
LOG_M(filename,"txdata_frame",&ru->common.txdata[i][0],fp->samples_per_frame, 1, 1);
|
||||
sprintf(filename,"tx%ddata_frame%d.dat", i, print_frame);
|
||||
FILE *output_fd = fopen(filename,"w");
|
||||
if (output_fd) {
|
||||
fwrite(&ru->common.txdata[i][0],
|
||||
sizeof(int32_t),
|
||||
fp->samples_per_frame,
|
||||
output_fd);
|
||||
fclose(output_fd);
|
||||
}
|
||||
else {
|
||||
LOG_E(PHY,"Cannot write to file %s\n",filename);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user