Merge branch NR_RRC_harq_hacks into NR_RRC_PDCP
This commit is contained in:
@@ -59,6 +59,7 @@
|
||||
#include "unitary_defs.h"
|
||||
#include "dummy_functions.c"
|
||||
#include "executables/thread-common.h"
|
||||
#include "executables/split_headers.h"
|
||||
|
||||
void feptx_ofdm(RU_t *ru, int frame, int subframe);
|
||||
void feptx_prec(RU_t *ru, int frame, int subframe);
|
||||
@@ -78,6 +79,13 @@ int n_tx_dropped = 0; /*!< \brief initial max process time for tx */
|
||||
int n_rx_dropped = 0; /*!< \brief initial max process time for rx */
|
||||
|
||||
int emulate_rf = 0;
|
||||
int split73=0;
|
||||
void sendFs6Ul(PHY_VARS_eNB *eNB, int UE_id, int harq_pid, int segmentID, int16_t *data, int dataLen, int r_offset) {
|
||||
AssertFatal(false, "Must not be called in this context\n");
|
||||
}
|
||||
void sendFs6Ulharq(enum pckType type, int UEid, PHY_VARS_eNB *eNB, LTE_eNB_UCI *uci, int frame, int subframe, uint8_t *harq_ack, uint8_t tdd_mapping_mode, uint16_t tdd_multiplexing_mask, uint16_t rnti, int32_t stat) {
|
||||
AssertFatal(false, "Must not be called in this context\n");
|
||||
}
|
||||
|
||||
void handler(int sig) {
|
||||
void *array[10];
|
||||
@@ -515,7 +523,7 @@ int main(int argc, char **argv) {
|
||||
char fname[32],vname[32];
|
||||
FILE *bler_fd;
|
||||
char bler_fname[256];
|
||||
FILE *time_meas_fd;
|
||||
FILE *time_meas_fd=NULL;
|
||||
char time_meas_fname[256];
|
||||
// FILE *tikz_fd;
|
||||
// char tikz_fname[256];
|
||||
@@ -1266,6 +1274,13 @@ int main(int argc, char **argv) {
|
||||
}
|
||||
|
||||
L1_rxtx_proc_t *proc_eNB = &eNB->proc.L1_proc;
|
||||
proc_eNB->threadPool=(tpool_t*)malloc(sizeof(tpool_t));
|
||||
proc_eNB->respEncode=(notifiedFIFO_t*) malloc(sizeof(notifiedFIFO_t));
|
||||
proc_eNB->respDecode=(notifiedFIFO_t*) malloc(sizeof(notifiedFIFO_t));
|
||||
initTpool("n", proc_eNB->threadPool, true);
|
||||
initNotifiedFIFO(proc_eNB->respEncode);
|
||||
initNotifiedFIFO(proc_eNB->respDecode);
|
||||
|
||||
proc_eNB->frame_tx=0;
|
||||
|
||||
if (input_fd==NULL) {
|
||||
@@ -1446,7 +1461,7 @@ int main(int argc, char **argv) {
|
||||
sched_resp.subframe=subframe;
|
||||
sched_resp.frame=proc_eNB->frame_tx;
|
||||
eNB->abstraction_flag=0;
|
||||
schedule_response(&sched_resp);
|
||||
schedule_response(&sched_resp, proc_eNB);
|
||||
phy_procedures_eNB_TX(eNB,proc_eNB,1);
|
||||
|
||||
if (uncoded_ber_bit == NULL) {
|
||||
@@ -1480,7 +1495,7 @@ int main(int argc, char **argv) {
|
||||
TX_req.tx_request_body.number_of_pdus=0;
|
||||
proc_eNB->subframe_tx = subframe+1;
|
||||
sched_resp.subframe=subframe+1;
|
||||
schedule_response(&sched_resp);
|
||||
schedule_response(&sched_resp, proc_eNB);
|
||||
phy_procedures_eNB_TX(eNB,proc_eNB,0);
|
||||
ru->proc.tti_tx=(subframe+1)%10;
|
||||
feptx_prec(ru,proc_eNB->frame_tx,subframe+1);
|
||||
@@ -1583,11 +1598,11 @@ int main(int argc, char **argv) {
|
||||
subframe<<1);
|
||||
|
||||
for (i=0; i<coded_bits_per_codeword; i++)
|
||||
if ((eNB->dlsch[0][0]->harq_processes[0]->e[i]==1 && UE->pdsch_vars[UE->current_thread_id[subframe]][0]->llr[0][i] > 0)||
|
||||
(eNB->dlsch[0][0]->harq_processes[0]->e[i]==0 && UE->pdsch_vars[UE->current_thread_id[subframe]][0]->llr[0][i] < 0)) {
|
||||
if ((eNB->dlsch[0][0]->harq_processes[0]->eDL[i]==1 && UE->pdsch_vars[UE->current_thread_id[subframe]][0]->llr[0][i] > 0)||
|
||||
(eNB->dlsch[0][0]->harq_processes[0]->eDL[i]==0 && UE->pdsch_vars[UE->current_thread_id[subframe]][0]->llr[0][i] < 0)) {
|
||||
uncoded_ber_bit[bit_errors++] = 1;
|
||||
printf("error in pos %d : %d => %d\n",i,
|
||||
eNB->dlsch[0][0]->harq_processes[0]->e[i],
|
||||
eNB->dlsch[0][0]->harq_processes[0]->eDL[i],
|
||||
UE->pdsch_vars[UE->current_thread_id[subframe]][0]->llr[0][i]);
|
||||
} else {
|
||||
/*
|
||||
@@ -1634,7 +1649,7 @@ int main(int argc, char **argv) {
|
||||
//pdsch_vars
|
||||
printf("coded_bits_per_codeword %u\n",coded_bits_per_codeword);
|
||||
dump_dlsch2(UE,eNB_id,subframe,&coded_bits_per_codeword,round, UE->dlsch[UE->current_thread_id[subframe]][0][0]->current_harq_pid);
|
||||
LOG_M("dlsch_e.m","e",eNB->dlsch[0][0]->harq_processes[0]->e,coded_bits_per_codeword,1,4);
|
||||
LOG_M("dlsch_e.m","e",eNB->dlsch[0][0]->harq_processes[0]->eDL,coded_bits_per_codeword,1,4);
|
||||
//pdcch_vars
|
||||
LOG_M("pdcchF0_ext.m","pdcchF_ext", UE->pdcch_vars[0][eNB_id]->rxdataF_ext[0],2*3*UE->frame_parms.ofdm_symbol_size,1,1);
|
||||
LOG_M("pdcch00_ch0_ext.m","pdcch00_ch0_ext",UE->pdcch_vars[0][eNB_id]->dl_ch_estimates_ext[0],300*3,1,1);
|
||||
|
||||
@@ -54,6 +54,7 @@
|
||||
#include "common/config/config_load_configmodule.h"
|
||||
#include "executables/thread-common.h"
|
||||
#include "targets/RT/USER/lte-softmodem.h"
|
||||
#include "executables/split_headers.h"
|
||||
|
||||
double cpuf;
|
||||
#define inMicroS(a) (((double)(a))/(cpu_freq_GHz*1000.0))
|
||||
@@ -81,6 +82,14 @@ int n_tx_dropped = 0; /*!< \brief initial max process time for tx */
|
||||
int n_rx_dropped = 0; /*!< \brief initial max process time for rx */
|
||||
|
||||
|
||||
int split73=0;
|
||||
void sendFs6Ul(PHY_VARS_eNB *eNB, int UE_id, int harq_pid, int segmentID, int16_t *data, int dataLen, int r_offset) {
|
||||
AssertFatal(false, "Must not be called in this context\n");
|
||||
}
|
||||
void sendFs6Ulharq(enum pckType type, int UEid, PHY_VARS_eNB *eNB, LTE_eNB_UCI *uci, int frame, int subframe, uint8_t *harq_ack, uint8_t tdd_mapping_mode, uint16_t tdd_multiplexing_mask, uint16_t rnti, int32_t stat) {
|
||||
AssertFatal(false, "Must not be called in this context\n");
|
||||
}
|
||||
|
||||
extern void fep_full(RU_t *ru, int subframe);
|
||||
extern void ru_fep_full_2thread(RU_t *ru, int subframe);
|
||||
//extern void eNB_fep_full(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc);
|
||||
@@ -793,6 +802,13 @@ int main(int argc, char **argv) {
|
||||
proc_rxtx_ue->frame_rx = (subframe<4)?(proc_rxtx->frame_tx-1):(proc_rxtx->frame_tx);
|
||||
proc_rxtx_ue->subframe_tx = proc_rxtx->subframe_rx;
|
||||
proc_rxtx_ue->subframe_rx = (proc_rxtx->subframe_tx+6)%10;
|
||||
proc_rxtx->threadPool=(tpool_t*)malloc(sizeof(tpool_t));
|
||||
proc_rxtx->respEncode=(notifiedFIFO_t*) malloc(sizeof(notifiedFIFO_t));
|
||||
proc_rxtx->respDecode=(notifiedFIFO_t*) malloc(sizeof(notifiedFIFO_t));
|
||||
initTpool("n",proc_rxtx->threadPool, true);
|
||||
initNotifiedFIFO(proc_rxtx->respEncode);
|
||||
initNotifiedFIFO(proc_rxtx->respDecode);
|
||||
|
||||
printf("Init UL hopping UE\n");
|
||||
init_ul_hopping(&UE->frame_parms);
|
||||
printf("Init UL hopping eNB\n");
|
||||
@@ -995,7 +1011,7 @@ int main(int argc, char **argv) {
|
||||
srs_flag);
|
||||
sched_resp.subframe=(subframe+6)%10;
|
||||
sched_resp.frame=(1024+eNB->proc.frame_rx+((subframe<4)?-1:0))&1023;
|
||||
schedule_response(&sched_resp);
|
||||
schedule_response(&sched_resp, proc_rxtx);
|
||||
|
||||
/////////////////////
|
||||
if (abstx) {
|
||||
@@ -1270,7 +1286,7 @@ int main(int argc, char **argv) {
|
||||
LOG_UDUMPMSG(SIM,dataArray(table_rx),table_rx->size,LOG_DUMP_DOUBLE,"The receiver raw data: \n");
|
||||
}
|
||||
|
||||
printf("\n**********rb: %d ***mcs : %d *********SNR = %f dB (%f): TX %u dB (gain %f dB), N0W %f dB, I0 %d dB, delta_IF %d [ (%d,%d) dB / (%d,%d) dB ]**************************\n",
|
||||
printf("\n**********rb: %d ***mcs : %d *********SNR = %f dB (%f): TX %u dB (gain %f dB), N0W %f dB, I0 %u dB, delta_IF %d [ (%d,%d) dB / (%u,%u) dB ]**************************\n",
|
||||
nb_rb,mcs,SNR,SNR2,
|
||||
tx_lev_dB,
|
||||
20*log10(tx_gain),
|
||||
@@ -1352,7 +1368,7 @@ int main(int argc, char **argv) {
|
||||
printStatIndent2(&eNB->ulsch_deinterleaving_stats,"sub-block interleaving" );
|
||||
printStatIndent2(&eNB->ulsch_demultiplexing_stats,"sub-block demultiplexing" );
|
||||
printStatIndent2(&eNB->ulsch_rate_unmatching_stats,"sub-block rate-matching" );
|
||||
printf("|__ turbo_decoder(%d bits), avg iterations: %.1f %.2f us (%d cycles, %d trials)\n",
|
||||
printf(" |__ turbo_decoder(%d bits), avg iterations: %.1f %.2f us (%d cycles, %d trials)\n",
|
||||
eNB->ulsch[0]->harq_processes[harq_pid]->Cminus ?
|
||||
eNB->ulsch[0]->harq_processes[harq_pid]->Kminus :
|
||||
eNB->ulsch[0]->harq_processes[harq_pid]->Kplus,
|
||||
|
||||
+161
-117
@@ -137,6 +137,12 @@ int main(int argc, char **argv)
|
||||
int i,aa;//,l;
|
||||
double sigma2, sigma2_dB=10, SNR, snr0=-2.0, snr1=2.0;
|
||||
uint8_t snr1set=0;
|
||||
float roundStats[50];
|
||||
float effRate;
|
||||
float psnr;
|
||||
float eff_tp_check = 0.7;
|
||||
uint8_t snrRun;
|
||||
uint32_t TBS;
|
||||
int **txdata;
|
||||
double **s_re,**s_im,**r_re,**r_im;
|
||||
//double iqim = 0.0;
|
||||
@@ -152,6 +158,8 @@ int main(int argc, char **argv)
|
||||
int trial, n_trials = 1, n_errors = 0, n_false_positive = 0;
|
||||
//int n_errors2, n_alamouti;
|
||||
uint8_t transmission_mode = 1,n_tx=1,n_rx=1;
|
||||
uint8_t round;
|
||||
uint8_t num_rounds = 4;
|
||||
|
||||
channel_desc_t *gNB2UE;
|
||||
//uint32_t nsymb,tx_lev,tx_lev1 = 0,tx_lev2 = 0;
|
||||
@@ -382,6 +390,10 @@ int main(int argc, char **argv)
|
||||
mu = atoi(optarg);
|
||||
break;
|
||||
|
||||
case 't':
|
||||
eff_tp_check = (float)atoi(optarg)/100;
|
||||
break;
|
||||
|
||||
default:
|
||||
case 'h':
|
||||
printf("%s -h(elp) -p(extended_prefix) -N cell_id -f output_filename -F input_filename -g channel_model -n n_frames -t Delayspread -s snr0 -S snr1 -x transmission_mode -y TXant -z RXant -i Intefrence0 -j Interference1 -A interpolation_file -C(alibration offset dB) -N CellId\n",
|
||||
@@ -411,6 +423,7 @@ int main(int argc, char **argv)
|
||||
printf("-c Start symbol for PDSCH (fixed for now)\n");
|
||||
printf("-j Number of symbols for PDSCH (fixed for now)\n");
|
||||
printf("-e MSC index\n");
|
||||
printf("-t Acceptable effective throughput (in percentage)\n");
|
||||
printf("-P Print DLSCH performances\n");
|
||||
exit (-1);
|
||||
break;
|
||||
@@ -677,6 +690,9 @@ int main(int argc, char **argv)
|
||||
|
||||
|
||||
nr_ue_phy_config_request(&UE_mac->phy_config);
|
||||
NR_UE_list_t *UE_list = &RC.nrmac[0]->UE_list;
|
||||
NR_COMMON_channels_t *cc = RC.nrmac[0]->common_channels;
|
||||
snrRun = 0;
|
||||
|
||||
for (SNR = snr0; SNR < snr1; SNR += .2) {
|
||||
|
||||
@@ -694,6 +710,7 @@ int main(int argc, char **argv)
|
||||
reset_meas(&gNB->toutput);
|
||||
|
||||
n_errors = 0;
|
||||
effRate = 0;
|
||||
//n_errors2 = 0;
|
||||
//n_alamouti = 0;
|
||||
errors_scrambling=0;
|
||||
@@ -703,95 +720,7 @@ int main(int argc, char **argv)
|
||||
errors_bit = 0;
|
||||
//multipath channel
|
||||
//multipath_channel(gNB2UE,s_re,s_im,r_re,r_im,frame_length_complex_samples,0);
|
||||
memset(RC.nrmac[0]->cce_list[1][0],0,MAX_NUM_CCE*sizeof(int));
|
||||
memset(RC.nrmac[0]->cce_list[1][1],0,MAX_NUM_CCE*sizeof(int));
|
||||
clear_nr_nfapi_information(RC.nrmac[0], 0, frame, slot);
|
||||
if (css_flag == 0) nr_schedule_uss_dlsch_phytest(0,frame,slot,&pucch_sched,&dlsch_config);
|
||||
else nr_schedule_css_dlsch_phytest(0,frame,slot);
|
||||
|
||||
|
||||
Sched_INFO.module_id = 0;
|
||||
Sched_INFO.CC_id = 0;
|
||||
Sched_INFO.frame = frame;
|
||||
Sched_INFO.slot = slot;
|
||||
Sched_INFO.DL_req = &gNB_mac->DL_req[0];
|
||||
Sched_INFO.UL_tti_req = &gNB_mac->UL_tti_req[0];
|
||||
Sched_INFO.UL_dci_req = NULL;
|
||||
Sched_INFO.TX_req = &gNB_mac->TX_req[0];
|
||||
nr_schedule_response(&Sched_INFO);
|
||||
|
||||
if (run_initial_sync)
|
||||
nr_common_signal_procedures(gNB,frame,slot);
|
||||
else
|
||||
phy_procedures_gNB_TX(gNB,frame,slot,0);
|
||||
|
||||
int txdataF_offset = (slot%2) * frame_parms->samples_per_slot_wCP;
|
||||
|
||||
if (n_trials==1) {
|
||||
LOG_M("txsigF0.m","txsF0", gNB->common_vars.txdataF[0],frame_length_complex_samples_no_prefix,1,1);
|
||||
if (gNB->frame_parms.nb_antennas_tx>1)
|
||||
LOG_M("txsigF1.m","txsF1", gNB->common_vars.txdataF[1],frame_length_complex_samples_no_prefix,1,1);
|
||||
}
|
||||
int tx_offset = frame_parms->get_samples_slot_timestamp(slot,frame_parms,0);
|
||||
if (n_trials==1) printf("samples_per_slot_wCP = %d\n", frame_parms->samples_per_slot_wCP);
|
||||
|
||||
//TODO: loop over slots
|
||||
for (aa=0; aa<gNB->frame_parms.nb_antennas_tx; aa++) {
|
||||
|
||||
if (cyclic_prefix_type == 1) {
|
||||
PHY_ofdm_mod(&gNB->common_vars.txdataF[aa][txdataF_offset],
|
||||
&txdata[aa][tx_offset],
|
||||
frame_parms->ofdm_symbol_size,
|
||||
12,
|
||||
frame_parms->nb_prefix_samples,
|
||||
CYCLIC_PREFIX);
|
||||
} else {
|
||||
nr_normal_prefix_mod(&gNB->common_vars.txdataF[aa][txdataF_offset],
|
||||
&txdata[aa][tx_offset],
|
||||
14,
|
||||
frame_parms);
|
||||
}
|
||||
}
|
||||
|
||||
if (n_trials==1) {
|
||||
LOG_M("txsig0.m","txs0", txdata[0],frame_length_complex_samples,1,1);
|
||||
if (gNB->frame_parms.nb_antennas_tx>1)
|
||||
LOG_M("txsig1.m","txs1", txdata[1],frame_length_complex_samples,1,1);
|
||||
}
|
||||
if (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);
|
||||
|
||||
// if (n_trials==1) printf("txlev %d (%f)\n",txlev,10*log10((double)txlev));
|
||||
|
||||
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++) {
|
||||
for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
|
||||
r_re[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)]);
|
||||
r_im[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)+1]);
|
||||
}
|
||||
}
|
||||
|
||||
NR_gNB_DLSCH_t *gNB_dlsch = gNB->dlsch[0][0];
|
||||
nfapi_nr_dl_tti_pdsch_pdu_rel15_t rel15 = gNB_dlsch->harq_processes[0]->pdsch_pdu.pdsch_pdu_rel15;
|
||||
|
||||
//AWGN
|
||||
sigma2_dB = 10 * log10((double)txlev * ((double)UE->frame_parms.ofdm_symbol_size/(12*rel15.rbSize))) - SNR;
|
||||
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));
|
||||
|
||||
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++) {
|
||||
for (aa=0; aa<frame_parms->nb_antennas_rx; aa++) {
|
||||
((short*) UE->common_vars.rxdata[aa])[2*i] = (short) ((r_re[aa][i] + sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
|
||||
((short*) UE->common_vars.rxdata[aa])[2*i+1] = (short) ((r_im[aa][i] + sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
UE->rx_offset=0;
|
||||
UE_proc.frame_rx = frame;
|
||||
UE_proc.nr_tti_rx= slot;
|
||||
@@ -799,43 +728,144 @@ int main(int argc, char **argv)
|
||||
|
||||
dcireq.frame = frame;
|
||||
dcireq.slot = slot;
|
||||
|
||||
NR_UE_DLSCH_t *dlsch0 = UE->dlsch[UE->current_thread_id[UE_proc.nr_tti_rx]][0][0];
|
||||
|
||||
int harq_pid = dlsch0->current_harq_pid;
|
||||
NR_DL_UE_HARQ_t *UE_harq_process = dlsch0->harq_processes[harq_pid];
|
||||
|
||||
NR_gNB_DLSCH_t *gNB_dlsch = gNB->dlsch[0][0];
|
||||
nfapi_nr_dl_tti_pdsch_pdu_rel15_t *rel15 = &gNB_dlsch->harq_processes[0]->pdsch_pdu.pdsch_pdu_rel15;
|
||||
|
||||
nr_ue_dcireq(&dcireq); //to be replaced with function pointer later
|
||||
nr_ue_scheduled_response(&scheduled_response);
|
||||
UE_harq_process->harq_ack.ack = 0;
|
||||
round = 0;
|
||||
UE_harq_process->round = round;
|
||||
UE_harq_process->first_tx = 1;
|
||||
|
||||
while ((round<num_rounds) && (UE_harq_process->harq_ack.ack==0)) {
|
||||
memset(RC.nrmac[0]->cce_list[1][0],0,MAX_NUM_CCE*sizeof(int));
|
||||
memset(RC.nrmac[0]->cce_list[1][1],0,MAX_NUM_CCE*sizeof(int));
|
||||
clear_nr_nfapi_information(RC.nrmac[0], 0, frame, slot);
|
||||
|
||||
UE_list->UE_sched_ctrl[0].harq_processes[0].ndi = !(trial&1);
|
||||
|
||||
UE_list->UE_sched_ctrl[0].harq_processes[0].round = round;
|
||||
gNB->dlsch[0][0]->harq_processes[0]->round = round;
|
||||
|
||||
phy_procedures_nrUE_RX(UE,
|
||||
&UE_proc,
|
||||
0,
|
||||
do_pdcch_flag,
|
||||
normal_txrx);
|
||||
|
||||
if (UE->dlsch[UE->current_thread_id[slot]][0][0]->last_iteration_cnt >=
|
||||
UE->dlsch[UE->current_thread_id[slot]][0][0]->max_ldpc_iterations+1)
|
||||
n_errors++;
|
||||
if (css_flag == 0) nr_schedule_uss_dlsch_phytest(0,frame,slot,&pucch_sched,&dlsch_config);
|
||||
else nr_schedule_css_dlsch_phytest(0,frame,slot);
|
||||
Sched_INFO.module_id = 0;
|
||||
Sched_INFO.CC_id = 0;
|
||||
Sched_INFO.frame = frame;
|
||||
Sched_INFO.slot = slot;
|
||||
Sched_INFO.DL_req = &gNB_mac->DL_req[0];
|
||||
Sched_INFO.UL_tti_req = &gNB_mac->UL_tti_req[0];
|
||||
Sched_INFO.UL_dci_req = NULL;
|
||||
Sched_INFO.TX_req = &gNB_mac->TX_req[0];
|
||||
nr_schedule_response(&Sched_INFO);
|
||||
|
||||
if (run_initial_sync)
|
||||
nr_common_signal_procedures(gNB,frame,slot);
|
||||
else
|
||||
phy_procedures_gNB_TX(gNB,frame,slot,0);
|
||||
|
||||
int txdataF_offset = (slot%2) * frame_parms->samples_per_slot_wCP;
|
||||
|
||||
if (n_trials==1) {
|
||||
LOG_M("txsigF0.m","txsF0", gNB->common_vars.txdataF[0],frame_length_complex_samples_no_prefix,1,1);
|
||||
if (gNB->frame_parms.nb_antennas_tx>1)
|
||||
LOG_M("txsigF1.m","txsF1", gNB->common_vars.txdataF[1],frame_length_complex_samples_no_prefix,1,1);
|
||||
}
|
||||
int tx_offset = frame_parms->get_samples_slot_timestamp(slot,frame_parms,0);
|
||||
if (n_trials==1) printf("samples_per_slot_wCP = %d\n", frame_parms->samples_per_slot_wCP);
|
||||
|
||||
//TODO: loop over slots
|
||||
for (aa=0; aa<gNB->frame_parms.nb_antennas_tx; aa++) {
|
||||
|
||||
if (cyclic_prefix_type == 1) {
|
||||
PHY_ofdm_mod(&gNB->common_vars.txdataF[aa][txdataF_offset],
|
||||
&txdata[aa][tx_offset],
|
||||
frame_parms->ofdm_symbol_size,
|
||||
12,
|
||||
frame_parms->nb_prefix_samples,
|
||||
CYCLIC_PREFIX);
|
||||
} else {
|
||||
nr_normal_prefix_mod(&gNB->common_vars.txdataF[aa][txdataF_offset],
|
||||
&txdata[aa][tx_offset],
|
||||
14,
|
||||
frame_parms);
|
||||
}
|
||||
}
|
||||
|
||||
if (n_trials==1) {
|
||||
LOG_M("txsig0.m","txs0", txdata[0],frame_length_complex_samples,1,1);
|
||||
if (gNB->frame_parms.nb_antennas_tx>1)
|
||||
LOG_M("txsig1.m","txs1", txdata[1],frame_length_complex_samples,1,1);
|
||||
}
|
||||
if (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);
|
||||
|
||||
// if (n_trials==1) printf("txlev %d (%f)\n",txlev,10*log10((double)txlev));
|
||||
|
||||
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++) {
|
||||
|
||||
for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
|
||||
r_re[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)]);
|
||||
r_im[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)+1]);
|
||||
}
|
||||
}
|
||||
|
||||
//AWGN
|
||||
sigma2_dB = 10 * log10((double)txlev * ((double)UE->frame_parms.ofdm_symbol_size/(12*rel15->rbSize))) - SNR;
|
||||
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));
|
||||
|
||||
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++) {
|
||||
|
||||
for (aa=0; aa<frame_parms->nb_antennas_rx; aa++) {
|
||||
((short*) UE->common_vars.rxdata[aa])[2*i] = (short) ((r_re[aa][i] + sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
|
||||
((short*) UE->common_vars.rxdata[aa])[2*i+1] = (short) ((r_im[aa][i] + sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
|
||||
}
|
||||
}
|
||||
|
||||
nr_ue_dcireq(&dcireq); //to be replaced with function pointer later
|
||||
nr_ue_scheduled_response(&scheduled_response);
|
||||
|
||||
phy_procedures_nrUE_RX(UE,
|
||||
&UE_proc,
|
||||
0,
|
||||
do_pdcch_flag,
|
||||
normal_txrx);
|
||||
|
||||
//printf("dlsim round %d ends\n",round);
|
||||
round++;
|
||||
} // round
|
||||
|
||||
//----------------------------------------------------------
|
||||
//---------------------- count errors ----------------------
|
||||
//----------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
NR_UE_DLSCH_t *dlsch0 = UE->dlsch[UE->current_thread_id[UE_proc.nr_tti_rx]][0][0];
|
||||
|
||||
int harq_pid = dlsch0->current_harq_pid;
|
||||
NR_DL_UE_HARQ_t *UE_harq_process = dlsch0->harq_processes[harq_pid];
|
||||
|
||||
if (UE->dlsch[UE->current_thread_id[slot]][0][0]->last_iteration_cnt >=
|
||||
UE->dlsch[UE->current_thread_id[slot]][0][0]->max_ldpc_iterations+1)
|
||||
n_errors++;
|
||||
|
||||
NR_UE_PDSCH **pdsch_vars = UE->pdsch_vars[UE->current_thread_id[UE_proc.nr_tti_rx]];
|
||||
int16_t *UE_llr = pdsch_vars[0]->llr[0];
|
||||
|
||||
|
||||
uint32_t TBS = rel15.TBSize[0];
|
||||
TBS = rel15->TBSize[0];
|
||||
uint16_t length_dmrs = 1;
|
||||
uint16_t nb_rb = rel15.rbSize;
|
||||
uint8_t nb_re_dmrs = rel15.dmrsConfigType == NFAPI_NR_DMRS_TYPE1 ? 6 : 4;
|
||||
uint8_t mod_order = rel15.qamModOrder[0];
|
||||
uint8_t nb_symb_sch = rel15.NrOfSymbols;
|
||||
uint16_t nb_rb = rel15->rbSize;
|
||||
uint8_t nb_re_dmrs = rel15->dmrsConfigType == NFAPI_NR_DMRS_TYPE1 ? 6 : 4;
|
||||
uint8_t mod_order = rel15->qamModOrder[0];
|
||||
uint8_t nb_symb_sch = rel15->NrOfSymbols;
|
||||
|
||||
available_bits = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs, mod_order, rel15.nrOfLayers);
|
||||
available_bits = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs, mod_order, rel15->nrOfLayers);
|
||||
|
||||
for (i = 0; i < available_bits; i++) {
|
||||
|
||||
@@ -875,15 +905,18 @@ int main(int argc, char **argv)
|
||||
if (n_trials == 1)
|
||||
printf("errors_bit = %u (trial %d)\n", errors_bit, trial);
|
||||
}
|
||||
|
||||
roundStats[snrRun]+=((float)round);
|
||||
if (UE_harq_process->harq_ack.ack==1) effRate += ((float)TBS)/round;
|
||||
} // noise trials
|
||||
|
||||
roundStats[snrRun]/=((float)n_trials);
|
||||
effRate /= n_trials;
|
||||
printf("*****************************************\n");
|
||||
printf("SNR %f, (false positive %f)\n", SNR,
|
||||
(float) n_errors / (float) n_trials);
|
||||
printf("*****************************************\n");
|
||||
printf("\n");
|
||||
printf("SNR %f : n_errors (negative CRC) = %d/%d, Channel BER %e\n", SNR, n_errors, n_trials,(double)errors_scrambling/available_bits/n_trials);
|
||||
printf("SNR %f : n_errors (negative CRC) = %d/%d, Avg round %.2f, Channel BER %e, Eff Rate %.4f bits/slot, Eff Throughput %.2f\%, TBS %d bits/slot\n", SNR, n_errors, n_trials,roundStats[snrRun],(double)errors_scrambling/available_bits/n_trials,effRate,effRate/TBS*100,TBS);
|
||||
printf("\n");
|
||||
|
||||
if (n_trials == 1) {
|
||||
@@ -896,7 +929,8 @@ int main(int argc, char **argv)
|
||||
break;
|
||||
}
|
||||
|
||||
if ((float)n_errors/(float)n_trials <= target_error_rate) {
|
||||
//if ((float)n_errors/(float)n_trials <= target_error_rate) {
|
||||
if (effRate >= (eff_tp_check*TBS)) {
|
||||
printf("PDSCH test OK\n");
|
||||
break;
|
||||
}
|
||||
@@ -951,8 +985,18 @@ int main(int argc, char **argv)
|
||||
printStatIndent2(&UE->dlsch_tc_intl2_stats,"intl2+HardDecode+CRC");
|
||||
*/
|
||||
}
|
||||
snrRun++;
|
||||
} // NSR
|
||||
|
||||
/*if (n_trials>1) {
|
||||
printf("HARQ stats:\nSNR\tRounds\n");
|
||||
psnr = snr0;
|
||||
for (uint8_t i=0; i<snrRun; i++) {
|
||||
printf("%.1f\t%.2f\n",psnr,roundStats[i]);
|
||||
psnr+=0.2;
|
||||
}
|
||||
}*/
|
||||
|
||||
for (i = 0; i < 2; i++) {
|
||||
free(s_re[i]);
|
||||
free(s_im[i]);
|
||||
|
||||
@@ -410,7 +410,7 @@ int main(int argc, char **argv)
|
||||
uint8_t n_hf = 0;
|
||||
int cyclic_prefix_type = NFAPI_CP_NORMAL;
|
||||
|
||||
double fs, eps;
|
||||
double fs=0, eps;
|
||||
double scs = 30000;
|
||||
double bw = 100e6;
|
||||
|
||||
|
||||
@@ -83,21 +83,24 @@ int8_t nr_mac_rrc_data_ind_ue(const module_id_t module_id, const int CC_id, cons
|
||||
int main(int argc, char **argv){
|
||||
|
||||
char c;
|
||||
|
||||
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, bw;
|
||||
int i, aa, aarx, **txdata, trial, n_frames = 1, prach_start, rx_prach_start; //, ntrials=1;
|
||||
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;
|
||||
uint8_t frame = 1, subframe = 19, config_index = 98, prach_sequence_length = 1, num_root_sequences = 16, restrictedSetConfig = 0, N_dur, N_t_slot, start_symbol;
|
||||
uint8_t frame = 1, subframe = 9, slot=19, slot_gNB=19, config_index = 98, prach_sequence_length = 1, num_root_sequences = 16, restrictedSetConfig = 0, N_dur, N_t_slot, start_symbol;
|
||||
uint16_t Nid_cell = 0, preamble_tx = 0, preamble_delay, format, format0, format1;
|
||||
uint32_t tx_lev = 10000, prach_errors = 0, samp_count; //,tx_lev_dB;
|
||||
uint64_t SSB_positions = 0x01, absoluteFrequencyPointA = 640000;
|
||||
|
||||
// int8_t interf1=-19,interf2=-19;
|
||||
// uint8_t abstraction_flag=0,calibration_flag=0;
|
||||
// double prach_sinr;
|
||||
// uint32_t nsymb;
|
||||
// uint16_t preamble_max, preamble_energy_max;
|
||||
|
||||
|
||||
NR_DL_FRAME_PARMS *frame_parms;
|
||||
NR_PRACH_RESOURCES_t prach_resources;
|
||||
nfapi_nr_prach_config_t *prach_config;
|
||||
@@ -115,7 +118,7 @@ int main(int argc, char **argv){
|
||||
|
||||
randominit(0);
|
||||
|
||||
while ((c = getopt (argc, argv, "hHaA:Cr:p:g:n:s:S:t:x:y:v:V:z:N:F:d:Z:L:R:E")) != -1) {
|
||||
while ((c = getopt (argc, argv, "hHaA:Cc:r:p:g:n:s:S:t:x:y:v:V:z:N:F:d:Z:L:R:E")) != -1) {
|
||||
switch (c) {
|
||||
case 'a':
|
||||
printf("Running AWGN simulation\n");
|
||||
@@ -124,6 +127,10 @@ int main(int argc, char **argv){
|
||||
//ntrials=1;
|
||||
break;
|
||||
|
||||
case 'c':
|
||||
config_index = atoi(optarg);
|
||||
break;
|
||||
|
||||
case 'd':
|
||||
delay = atoi(optarg);
|
||||
break;
|
||||
@@ -310,6 +317,11 @@ int main(int argc, char **argv){
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (config_index<67) { prach_sequence_length=0; slot = subframe*2; slot_gNB = 1+(subframe*2); }
|
||||
|
||||
printf("Config_index %d, prach_sequence_length %d\n",config_index,prach_sequence_length);
|
||||
|
||||
// Configure log
|
||||
logInit();
|
||||
set_glog(loglvl);
|
||||
@@ -370,11 +382,11 @@ int main(int argc, char **argv){
|
||||
gNB->gNB_config.prach_config.num_prach_fd_occasions.value = num_prach_fd_occasions;
|
||||
gNB->gNB_config.prach_config.num_prach_fd_occasions_list = (nfapi_nr_num_prach_fd_occasions_t *) malloc(num_prach_fd_occasions*sizeof(nfapi_nr_num_prach_fd_occasions_t));
|
||||
|
||||
gNB->proc.slot_rx = subframe;
|
||||
gNB->proc.slot_rx = slot;
|
||||
|
||||
get_nr_prach_info_from_index(config_index,
|
||||
int ret = get_nr_prach_info_from_index(config_index,
|
||||
(int)frame,
|
||||
(int)subframe,
|
||||
(int)slot_gNB,
|
||||
absoluteFrequencyPointA,
|
||||
mu,
|
||||
frame_parms->frame_type,
|
||||
@@ -383,6 +395,7 @@ int main(int argc, char **argv){
|
||||
&N_t_slot,
|
||||
&N_dur);
|
||||
|
||||
if (ret == 0) {printf("No prach in %d.%d, mu %d, config_index %d\n",frame,slot,mu,config_index); exit(-1);}
|
||||
format0 = format&0xff; // first column of format from table
|
||||
format1 = (format>>8)&0xff; // second column of format from table
|
||||
|
||||
@@ -559,7 +572,7 @@ int main(int argc, char **argv){
|
||||
|
||||
UE_nr_rxtx_proc_t proc={0};
|
||||
proc.frame_tx = frame;
|
||||
proc.nr_tti_tx = subframe;
|
||||
proc.nr_tti_tx = slot;
|
||||
nr_ue_prach_procedures(UE,&proc,0,0);
|
||||
|
||||
/* tx_lev_dB not used later, no need to set */
|
||||
@@ -568,19 +581,19 @@ int main(int argc, char **argv){
|
||||
if (mu == 0)
|
||||
samp_count = frame_parms->samples_per_subframe;
|
||||
else
|
||||
samp_count = (subframe%(frame_parms->slots_per_subframe/2)) ? frame_parms->samples_per_slotN0 : frame_parms->samples_per_slot0;
|
||||
samp_count = ((slot)%(frame_parms->slots_per_subframe/2)) ? frame_parms->samples_per_slotN0 : frame_parms->samples_per_slot0;
|
||||
|
||||
prach_start = subframe*samp_count - UE->N_TA_offset;
|
||||
prach_start = slot*samp_count - UE->N_TA_offset;
|
||||
|
||||
#ifdef NR_PRACH_DEBUG
|
||||
LOG_M("txsig0.m", "txs0", &txdata[0][prach_start], samp_count, 1, 1);
|
||||
LOG_M("txsig0.m", "txs0", &txdata[0][prach_start], frame_parms->samples_per_subframe, 1, 1);
|
||||
//LOG_M("txsig1.m","txs1", txdata[1],FRAME_LENGTH_COMPLEX_SAMPLES,1,1);
|
||||
#endif
|
||||
|
||||
// multipath channel
|
||||
// dump_nr_prach_config(&gNB->frame_parms,subframe);
|
||||
|
||||
for (i = 0; i < samp_count<<1; i++) {
|
||||
for (i = 0; i < frame_parms->samples_per_subframe<<1; i++) {
|
||||
for (aa=0; aa<1; aa++) {
|
||||
if (awgn_flag == 0) {
|
||||
s_re[aa][i] = ((double)(((short *)&txdata[aa][prach_start]))[(i<<1)]);
|
||||
@@ -615,7 +628,10 @@ int main(int argc, char **argv){
|
||||
ue_speed1 = ue_speed0 + 50;
|
||||
}
|
||||
|
||||
rx_prach_start = subframe*frame_parms->get_samples_per_slot(subframe,frame_parms);
|
||||
rx_prach_start = slot*frame_parms->get_samples_per_slot(slot,frame_parms);
|
||||
if (n_frames==1) printf("slot %d, rx_prach_start %d\n",slot,rx_prach_start);
|
||||
uint16_t preamble_rx, preamble_energy, N_ZC;
|
||||
N_ZC = prach_sequence_length == 0 ? 839 : 139;
|
||||
|
||||
for (SNR=snr0; SNR<snr1; SNR+=.1) {
|
||||
for (ue_speed=ue_speed0; ue_speed<ue_speed1; ue_speed+=10) {
|
||||
@@ -627,9 +643,8 @@ int main(int argc, char **argv){
|
||||
|
||||
for (trial=0; trial<n_frames; trial++) {
|
||||
|
||||
uint16_t preamble_rx, preamble_energy, N_ZC;
|
||||
|
||||
sigma2_dB = 10*log10((double)tx_lev) - SNR;
|
||||
sigma2_dB = 10*log10((double)tx_lev) - SNR - 10*log10(N_RB_UL*12/N_ZC);
|
||||
|
||||
if (n_frames==1)
|
||||
printf("sigma2_dB %f (SNR %f dB) tx_lev_dB %f\n",sigma2_dB,SNR,10*log10((double)tx_lev));
|
||||
@@ -648,20 +663,20 @@ int main(int argc, char **argv){
|
||||
10*log10(tx_lev));
|
||||
}
|
||||
|
||||
for (i = 0; i< frame_parms->get_samples_per_slot(subframe,frame_parms); i++) {
|
||||
for (i = 0; i< frame_parms->samples_per_subframe; i++) {
|
||||
for (aa = 0; aa < frame_parms->nb_antennas_rx; aa++) {
|
||||
((short*) &gNB->common_vars.rxdata[aa][rx_prach_start])[2*i] = (short) (.167*(r_re[aa][i] +sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
|
||||
((short*) &gNB->common_vars.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)));
|
||||
((short*) &ru->common.rxdata[aa][rx_prach_start])[2*i] = (short) (.167*(r_re[aa][i] +sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
|
||||
((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)));
|
||||
}
|
||||
}
|
||||
|
||||
rx_nr_prach_ru(ru, prach_format, numRA, prachStartSymbol, frame, subframe);
|
||||
rx_nr_prach_ru(ru, prach_format, numRA, prachStartSymbol, frame, slot);
|
||||
|
||||
gNB->prach_vars.rxsigF = ru->prach_rxsigF;
|
||||
|
||||
rx_nr_prach(gNB, prach_pdu, frame, subframe, &preamble_rx, &preamble_energy, &preamble_delay);
|
||||
|
||||
printf(" preamble_energy %d preamble_rx %d preamble_tx %d \n", preamble_energy, preamble_rx, preamble_tx);
|
||||
// printf(" preamble_energy %d preamble_rx %d preamble_tx %d \n", preamble_energy, preamble_rx, preamble_tx);
|
||||
|
||||
if (preamble_rx != preamble_tx)
|
||||
prach_errors++;
|
||||
|
||||
@@ -93,16 +93,18 @@ int main(int argc, char **argv)
|
||||
uint8_t nrofSymbols=1; //number of OFDM symbols can be 1-2 for format 1
|
||||
uint8_t startingSymbolIndex=0; // resource allocated see 9.2.1, 38.213 for more info.should be actually present in the resource set provided
|
||||
uint16_t startingPRB=0,startingPRB_intraSlotHopping=0; //PRB number not sure see 9.2.1, 38.213 for more info. Should be actually present in the resource set provided
|
||||
uint16_t nrofPRB=2;
|
||||
uint8_t timeDomainOCC=0;
|
||||
SCM_t channel_model=AWGN;//Rayleigh1_anticorr;
|
||||
|
||||
int N_RB_DL=273,mu=1;
|
||||
float target_error_rate=0.01;
|
||||
float target_error_rate=0.001;
|
||||
int frame_length_complex_samples;
|
||||
//int frame_length_complex_samples_no_prefix;
|
||||
NR_DL_FRAME_PARMS *frame_parms;
|
||||
//unsigned char frame_type = 0;
|
||||
int loglvl=OAILOG_WARNING;
|
||||
int sr_flag = 0;
|
||||
|
||||
cpuf = get_cpu_freq_GHz();
|
||||
|
||||
@@ -112,9 +114,8 @@ int main(int argc, char **argv)
|
||||
|
||||
randominit(0);
|
||||
logInit();
|
||||
set_glog(loglvl);
|
||||
|
||||
while ((c = getopt (argc, argv, "f:hA:f:g:i:I:P:B:b:T:m:n:r:o:s:S:x:y:z:N:F:GR:IL")) != -1) {
|
||||
while ((c = getopt (argc, argv, "f:hA:f:g:i:I:P:B:b:T:m:n:r:o:s:S:x:y:z:N:F:GR:IL:q:c")) != -1) {
|
||||
switch (c) {
|
||||
case 'f':
|
||||
//write_output_file=1;
|
||||
@@ -263,6 +264,9 @@ int main(int argc, char **argv)
|
||||
case 'r':
|
||||
startingPRB=atoi(optarg);
|
||||
break;
|
||||
case 'q':
|
||||
nrofPRB=atoi(optarg);
|
||||
break;
|
||||
case 'P':
|
||||
format=atoi(optarg);
|
||||
break;
|
||||
@@ -272,6 +276,9 @@ int main(int argc, char **argv)
|
||||
case 'b':
|
||||
nr_bit=atoi(optarg);
|
||||
break;
|
||||
case 'c':
|
||||
sr_flag=1;
|
||||
break;
|
||||
case 'B':
|
||||
actual_payload=atoi(optarg);
|
||||
break;
|
||||
@@ -305,7 +312,8 @@ int main(int argc, char **argv)
|
||||
printf("-F Input filename (.txt format) for RX conformance testing\n");
|
||||
printf("-i Enter number of ofdm symbols for pucch\n");
|
||||
printf("-I Starting symbol index for pucch\n");
|
||||
printf("-r PUCCCH starting PRB\n");
|
||||
printf("-r PUCCH starting PRB\n");
|
||||
printf("-q PUCCH number of PRB\n");
|
||||
printf("-P Enter the format of PUCCH\n");
|
||||
printf("-b number of HARQ bits (1-2)\n");
|
||||
printf("-B payload to be transmitted on PUCCH\n");
|
||||
@@ -316,18 +324,22 @@ int main(int argc, char **argv)
|
||||
}
|
||||
}
|
||||
|
||||
set_glog(loglvl);
|
||||
|
||||
if (snr1set==0) snr1 = snr0+10;
|
||||
|
||||
printf("Initializing gNodeB for mu %d, N_RB_DL %d\n",mu,N_RB_DL);
|
||||
|
||||
if((format!=0) && (format!=1)){
|
||||
if((format!=0) && (format!=1) && (format!=2)){
|
||||
printf("PUCCH format %d not supported\n",format);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
AssertFatal((nr_bit<3)&&(actual_payload<4),"Only format 0 and 1 currently supported. 2 bits max supported");
|
||||
AssertFatal(((format < 2)&&(nr_bit<3)&&(actual_payload<4)) ||
|
||||
((format == 2)&&(nr_bit>2)&&(nr_bit<12)),"illegal combination format %d, nr_bit %d\n",
|
||||
format,nr_bit);
|
||||
|
||||
if (nr_bit==1) actual_payload = actual_payload&1;
|
||||
actual_payload &= ((1<<nr_bit)-1);
|
||||
|
||||
printf("Transmitted payload is %ld\n",actual_payload);
|
||||
|
||||
@@ -417,9 +429,9 @@ int main(int argc, char **argv)
|
||||
bzero(r_im[i],frame_length_complex_samples*sizeof(double));
|
||||
|
||||
printf("Allocating %d samples for txdataF/rxdataF\n",14*frame_parms->ofdm_symbol_size);
|
||||
txdataF[i] = malloc(14*frame_parms->ofdm_symbol_size*sizeof(int));
|
||||
txdataF[i] = memalign(32,14*frame_parms->ofdm_symbol_size*sizeof(int));
|
||||
bzero(txdataF[i],14*frame_parms->ofdm_symbol_size*sizeof(int));
|
||||
rxdataF[i] = malloc(14*frame_parms->ofdm_symbol_size*sizeof(int));
|
||||
rxdataF[i] = memalign(32,14*frame_parms->ofdm_symbol_size*sizeof(int));
|
||||
bzero(rxdataF[i],14*frame_parms->ofdm_symbol_size*sizeof(int));
|
||||
}
|
||||
|
||||
@@ -443,14 +455,17 @@ int main(int argc, char **argv)
|
||||
uint8_t mcs=0;
|
||||
startingPRB_intraSlotHopping=N_RB_DL-1;
|
||||
pucch_GroupHopping_t PUCCH_GroupHopping=UE->pucch_config_common_nr->pucch_GroupHopping;
|
||||
uint32_t n_id=UE->pucch_config_common_nr->hoppingId;
|
||||
|
||||
uint32_t hopping_id=UE->pucch_config_common_nr->hoppingId;
|
||||
uint32_t dmrs_scrambling_id = 0, data_scrambling_id=0;
|
||||
if(format==0){
|
||||
// for now we are not considering SR just HARQ-ACK
|
||||
if(nr_bit==1)
|
||||
if (nr_bit ==0)
|
||||
mcs=table1_mcs[0];
|
||||
else if(nr_bit==1)
|
||||
mcs=table1_mcs[actual_payload];
|
||||
else if(nr_bit==2)
|
||||
mcs=table2_mcs[actual_payload];
|
||||
else AssertFatal(1==0,"Either nr_bit %d or sr_flag %d must be non-zero\n");
|
||||
}
|
||||
|
||||
for(SNR=snr0;SNR<=snr1;SNR=SNR+1){
|
||||
@@ -461,16 +476,20 @@ int main(int argc, char **argv)
|
||||
if(format==0){
|
||||
nr_generate_pucch0(UE,txdataF,frame_parms,UE->pucch_config_dedicated,amp,nr_tti_tx,m0,mcs,nrofSymbols,startingSymbolIndex,startingPRB);
|
||||
}
|
||||
else{
|
||||
else if (format == 1){
|
||||
nr_generate_pucch1(UE,txdataF,frame_parms,UE->pucch_config_dedicated,actual_payload,amp,nr_tti_tx,m0,nrofSymbols,startingSymbolIndex,startingPRB,startingPRB_intraSlotHopping,0,nr_bit);
|
||||
}
|
||||
else {
|
||||
nr_generate_pucch2(UE,0x1234,dmrs_scrambling_id,data_scrambling_id,txdataF,frame_parms,UE->pucch_config_dedicated,actual_payload,amp,nr_tti_tx,nrofSymbols,startingSymbolIndex,nrofPRB,startingPRB,nr_bit);
|
||||
}
|
||||
|
||||
int txlev = signal_energy(&txdataF[aa][startingSymbolIndex*frame_parms->ofdm_symbol_size],
|
||||
frame_parms->ofdm_symbol_size);
|
||||
// printf("txlev %d (%d dB), offset %d\n",txlev,dB_fixed(txlev),startingSymbolIndex*frame_parms->ofdm_symbol_size);
|
||||
|
||||
// note : this scaling is for 1 PRB, to be updated for PUCCH 2
|
||||
sigma2_dB = 10*log10((double)txlev*UE->frame_parms.ofdm_symbol_size/12)-SNR;
|
||||
// note : this scaling
|
||||
int nb_re = (format == 0 || format == 1)? 12 : 12*nrofPRB;
|
||||
sigma2_dB = 10*log10((double)txlev*UE->frame_parms.ofdm_symbol_size/nb_re)-SNR;
|
||||
sigma2 = pow(10,sigma2_dB/10);
|
||||
|
||||
for(i=startingSymbolIndex*frame_parms->ofdm_symbol_size; i<(startingSymbolIndex+1)*frame_parms->ofdm_symbol_size; i++) {
|
||||
@@ -487,9 +506,9 @@ int main(int argc, char **argv)
|
||||
pucch_pdu.group_hop_flag = PUCCH_GroupHopping&1;
|
||||
pucch_pdu.sequence_hop_flag = (PUCCH_GroupHopping>>1)&1;
|
||||
pucch_pdu.bit_len_harq = nr_bit;
|
||||
pucch_pdu.sr_flag = 0;
|
||||
pucch_pdu.sr_flag = sr_flag;
|
||||
pucch_pdu.nr_of_symbols = nrofSymbols;
|
||||
pucch_pdu.hopping_id = n_id;
|
||||
pucch_pdu.hopping_id = hopping_id;
|
||||
pucch_pdu.initial_cyclic_shift = 0;
|
||||
pucch_pdu.start_symbol_index = startingSymbolIndex;
|
||||
pucch_pdu.prb_start = startingPRB;
|
||||
@@ -497,21 +516,49 @@ int main(int argc, char **argv)
|
||||
if(nr_bit==1)
|
||||
ack_nack_errors+=(actual_payload^uci_pdu.harq->harq_list[0].harq_value);
|
||||
else
|
||||
ack_nack_errors+=((actual_payload^uci_pdu.harq->harq_list[0].harq_value)+((actual_payload>>1)^uci_pdu.harq->harq_list[1].harq_value));
|
||||
ack_nack_errors+=(((actual_payload&1)^uci_pdu.harq->harq_list[0].harq_value)+((actual_payload>>1)^uci_pdu.harq->harq_list[1].harq_value));
|
||||
free(uci_pdu.harq->harq_list);
|
||||
}
|
||||
else{
|
||||
else if (format==1) {
|
||||
|
||||
nr_decode_pucch1(rxdataF,PUCCH_GroupHopping,n_id,&(payload_received),frame_parms,amp,nr_tti_tx,m0,nrofSymbols,startingSymbolIndex,startingPRB,startingPRB_intraSlotHopping,timeDomainOCC,nr_bit);
|
||||
nr_decode_pucch1(rxdataF,PUCCH_GroupHopping,hopping_id,&(payload_received),frame_parms,amp,nr_tti_tx,m0,nrofSymbols,startingSymbolIndex,startingPRB,startingPRB_intraSlotHopping,timeDomainOCC,nr_bit);
|
||||
if(nr_bit==1)
|
||||
ack_nack_errors+=((actual_payload^payload_received)&1);
|
||||
else
|
||||
ack_nack_errors+=((actual_payload^payload_received)&1) + (((actual_payload^payload_received)&2)>>1);
|
||||
}
|
||||
else if (format==2) {
|
||||
nfapi_nr_uci_pucch_pdu_format_2_3_4_t uci_pdu;
|
||||
nfapi_nr_pucch_pdu_t pucch_pdu;
|
||||
pucch_pdu.rnti = 0x1234;
|
||||
pucch_pdu.subcarrier_spacing = 1;
|
||||
pucch_pdu.group_hop_flag = PUCCH_GroupHopping&1;
|
||||
pucch_pdu.sequence_hop_flag = (PUCCH_GroupHopping>>1)&1;
|
||||
pucch_pdu.bit_len_harq = nr_bit;
|
||||
pucch_pdu.sr_flag = 0;
|
||||
pucch_pdu.nr_of_symbols = nrofSymbols;
|
||||
pucch_pdu.hopping_id = hopping_id;
|
||||
pucch_pdu.initial_cyclic_shift = 0;
|
||||
pucch_pdu.start_symbol_index = startingSymbolIndex;
|
||||
pucch_pdu.prb_size = nrofPRB;
|
||||
pucch_pdu.prb_start = startingPRB;
|
||||
pucch_pdu.dmrs_scrambling_id = dmrs_scrambling_id;
|
||||
pucch_pdu.data_scrambling_id = data_scrambling_id;
|
||||
nr_decode_pucch2(gNB,nr_tti_tx,&uci_pdu,&pucch_pdu);
|
||||
int harq_bytes=pucch_pdu.bit_len_harq>>3;
|
||||
if ((pucch_pdu.bit_len_harq&7) > 0) harq_bytes++;
|
||||
for (int i=0;i<harq_bytes;i++)
|
||||
if (uci_pdu.harq.harq_payload[i] != ((int8_t*)&actual_payload)[i]) {
|
||||
ack_nack_errors++;
|
||||
break;
|
||||
}
|
||||
free(uci_pdu.harq.harq_payload);
|
||||
|
||||
}
|
||||
n_errors=((actual_payload^payload_received)&1)+(((actual_payload^payload_received)&2)>>1)+(((actual_payload^payload_received)&4)>>2)+n_errors;
|
||||
}
|
||||
printf("SNR=%f, n_trials=%d, n_bit_errors=%d\n",SNR,n_trials,ack_nack_errors);
|
||||
if((float)ack_nack_errors/(float)(nr_bit*n_trials)<=target_error_rate){
|
||||
if((float)ack_nack_errors/(float)(n_trials)<=target_error_rate){
|
||||
printf("PUCCH test OK\n");
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -109,7 +109,7 @@ openair0_config_t openair0_cfg[MAX_CARDS];
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
char c;
|
||||
int i,sf;
|
||||
int i;
|
||||
double SNR, snr0 = -2.0, snr1 = 2.0;
|
||||
double sigma, sigma_dB;
|
||||
double snr_step = 1;
|
||||
@@ -426,7 +426,7 @@ int main(int argc, char **argv)
|
||||
for (i = 0; i < RC.nb_nr_macrlc_inst; i++)
|
||||
RC.nb_nr_mac_CC[i] = 1;
|
||||
mac_top_init_gNB();
|
||||
gNB_MAC_INST* gNB_mac = RC.nrmac[0];
|
||||
//gNB_MAC_INST* gNB_mac = RC.nrmac[0];
|
||||
gNB_RRC_INST rrc;
|
||||
memset((void*)&rrc,0,sizeof(rrc));
|
||||
|
||||
@@ -487,7 +487,7 @@ int main(int argc, char **argv)
|
||||
init_nr_ue_transport(UE, 0);
|
||||
|
||||
/*
|
||||
for (sf = 0; sf < 2; sf++) {
|
||||
for (int sf = 0; sf < 2; sf++) {
|
||||
for (i = 0; i < 2; i++) {
|
||||
|
||||
UE->ulsch[sf][0][i] = new_nr_ue_ulsch(N_RB_UL, 8, 0);
|
||||
@@ -747,6 +747,7 @@ int main(int argc, char **argv)
|
||||
((int16_t*)&gNB->common_vars.rxdata[0][slot_offset])[i],
|
||||
((int16_t*)&gNB->common_vars.rxdata[0][slot_offset])[1+i]);
|
||||
fclose(input_fd);
|
||||
LOG_M("rxsig0.m","rx0",gNB->common_vars.rxdata[0][slot_offset],slot_length,1,1);
|
||||
}
|
||||
////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
@@ -21,7 +21,8 @@
|
||||
|
||||
#include <time.h>
|
||||
#include <stdlib.h>
|
||||
#include "SIMULATION/TOOLS/sim.h"
|
||||
//#include "SIMULATION/TOOLS/sim.h"
|
||||
|
||||
|
||||
unsigned int s0, s1, s2, b;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user