* add test case 02 for performance benchmarking of the softmodem
git-svn-id: http://svn.eurecom.fr/openair4G/trunk@5328 818b1a75-f10b-46b9-bf7c-635c3b92a50f
This commit is contained in:
@@ -194,25 +194,28 @@ int main(int argc, char **argv) {
|
|||||||
unsigned int coded_bits_per_codeword,nsymb;
|
unsigned int coded_bits_per_codeword,nsymb;
|
||||||
int subframe=3;
|
int subframe=3;
|
||||||
unsigned int tx_lev=0,tx_lev_dB,trials,errs[4]={0,0,0,0},round_trials[4]={0,0,0,0};
|
unsigned int tx_lev=0,tx_lev_dB,trials,errs[4]={0,0,0,0},round_trials[4]={0,0,0,0};
|
||||||
uint8_t transmission_mode=1,n_rx=1;
|
uint8_t transmission_mode=1,n_rx=1,n_tx=1;
|
||||||
|
|
||||||
FILE *bler_fd;
|
FILE *bler_fd=NULL;
|
||||||
char bler_fname[512];
|
char bler_fname[512];
|
||||||
|
|
||||||
|
FILE *time_meas_fd=NULL;
|
||||||
|
char time_meas_fname[256];
|
||||||
|
|
||||||
FILE *input_fdUL=NULL,*trch_out_fdUL=NULL;
|
FILE *input_fdUL=NULL,*trch_out_fdUL=NULL;
|
||||||
// unsigned char input_file=0;
|
// unsigned char input_file=0;
|
||||||
char input_val_str[50],input_val_str2[50];
|
char input_val_str[50],input_val_str2[50];
|
||||||
|
|
||||||
// FILE *rx_frame_file;
|
// FILE *rx_frame_file;
|
||||||
FILE *csv_fdUL;
|
FILE *csv_fdUL=NULL;
|
||||||
|
|
||||||
FILE *fperen;
|
FILE *fperen=NULL;
|
||||||
char fperen_name[512];
|
char fperen_name[512];
|
||||||
|
|
||||||
FILE *fmageren;
|
FILE *fmageren=NULL;
|
||||||
char fmageren_name[512];
|
char fmageren_name[512];
|
||||||
|
|
||||||
FILE *flogeren;
|
FILE *flogeren=NULL;
|
||||||
char flogeren_name[512];
|
char flogeren_name[512];
|
||||||
|
|
||||||
/* FILE *ftxlev;
|
/* FILE *ftxlev;
|
||||||
@@ -246,7 +249,11 @@ int main(int argc, char **argv) {
|
|||||||
uint32_t UL_alloc_pdu;
|
uint32_t UL_alloc_pdu;
|
||||||
int s,Kr,Kr_bytes;
|
int s,Kr,Kr_bytes;
|
||||||
int dump_perf=0;
|
int dump_perf=0;
|
||||||
|
int test_perf=0;
|
||||||
|
|
||||||
|
double effective_rate=0.0;
|
||||||
|
char channel_model_input[10];
|
||||||
|
|
||||||
uint8_t max_turbo_iterations=4;
|
uint8_t max_turbo_iterations=4;
|
||||||
uint8_t llr8_flag=0;
|
uint8_t llr8_flag=0;
|
||||||
int nb_rb_set = 0;
|
int nb_rb_set = 0;
|
||||||
@@ -260,7 +267,7 @@ int main(int argc, char **argv) {
|
|||||||
|
|
||||||
logInit();
|
logInit();
|
||||||
|
|
||||||
while ((c = getopt (argc, argv, "hapbm:n:Y:X:s:w:e:q:d:D:c:r:i:f:y:c:oA:C:R:g:N:l:S:T:QB:PI:L")) != -1) {
|
while ((c = getopt (argc, argv, "hapbm:n:Y:X:x:s:w:e:q:d:D:O:c:r:i:f:y:c:oA:C:R:g:N:l:S:T:QB:PI:L")) != -1) {
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case 'a':
|
case 'a':
|
||||||
channel_model = AWGN;
|
channel_model = AWGN;
|
||||||
@@ -288,6 +295,7 @@ int main(int argc, char **argv) {
|
|||||||
abstx= atoi(optarg);
|
abstx= atoi(optarg);
|
||||||
break;
|
break;
|
||||||
case 'g':
|
case 'g':
|
||||||
|
sprintf(channel_model_input,optarg,10);
|
||||||
switch((char)*optarg) {
|
switch((char)*optarg) {
|
||||||
case 'A':
|
case 'A':
|
||||||
channel_model=SCM_A;
|
channel_model=SCM_A;
|
||||||
@@ -341,6 +349,10 @@ int main(int argc, char **argv) {
|
|||||||
channel_model=Rice1;
|
channel_model=Rice1;
|
||||||
chMod = 14;
|
chMod = 14;
|
||||||
break;
|
break;
|
||||||
|
case 'N':
|
||||||
|
channel_model=AWGN;
|
||||||
|
chMod = 1;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
msg("Unsupported channel model!\n");
|
msg("Unsupported channel model!\n");
|
||||||
exit(-1);
|
exit(-1);
|
||||||
@@ -356,6 +368,17 @@ int main(int argc, char **argv) {
|
|||||||
case 'e':
|
case 'e':
|
||||||
input_snr_step= atof(optarg);
|
input_snr_step= atof(optarg);
|
||||||
break;
|
break;
|
||||||
|
case 'x':
|
||||||
|
transmission_mode=atoi(optarg);
|
||||||
|
if ((transmission_mode!=1) &&
|
||||||
|
(transmission_mode!=2)) {
|
||||||
|
msg("Unsupported transmission mode %d\n",transmission_mode);
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
if (transmission_mode>1) {
|
||||||
|
n_tx = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
case 'y':
|
case 'y':
|
||||||
n_rx = atoi(optarg);
|
n_rx = atoi(optarg);
|
||||||
break;
|
break;
|
||||||
@@ -428,6 +451,10 @@ int main(int argc, char **argv) {
|
|||||||
dump_perf=1;
|
dump_perf=1;
|
||||||
opp_enabled=1;
|
opp_enabled=1;
|
||||||
break;
|
break;
|
||||||
|
case 'O':
|
||||||
|
test_perf=atoi(optarg);
|
||||||
|
//print_perf =1;
|
||||||
|
break;
|
||||||
case 'L':
|
case 'L':
|
||||||
llr8_flag=1;
|
llr8_flag=1;
|
||||||
break;
|
break;
|
||||||
@@ -487,6 +514,13 @@ int main(int argc, char **argv) {
|
|||||||
bler_fd = fopen(bler_fname,"w");
|
bler_fd = fopen(bler_fname,"w");
|
||||||
|
|
||||||
fprintf(bler_fd,"#SNR;mcs;nb_rb;TBS;rate;errors[0];trials[0];errors[1];trials[1];errors[2];trials[2];errors[3];trials[3]\n");
|
fprintf(bler_fd,"#SNR;mcs;nb_rb;TBS;rate;errors[0];trials[0];errors[1];trials[1];errors[2];trials[2];errors[3];trials[3]\n");
|
||||||
|
|
||||||
|
if (test_perf != 0) {
|
||||||
|
sprintf(time_meas_fname,"%s/TEST/OAI/PERF/time_meas_prb%d_mcs%d_antrx%d_channel%s_tx%d.csv",
|
||||||
|
getenv("OPENAIR_TARGETS"),
|
||||||
|
N_RB_DL,mcs,n_rx,channel_model_input,transmission_mode);
|
||||||
|
time_meas_fd = fopen(time_meas_fname,"w");
|
||||||
|
}
|
||||||
|
|
||||||
if(abstx){
|
if(abstx){
|
||||||
sprintf(fperen_name,"ULchan_estims_F_mcs%d_rb%d_chanMod%d_nframes%d_chanReal%d.m",mcs,nb_rb,chMod,n_frames,n_ch_rlz);
|
sprintf(fperen_name,"ULchan_estims_F_mcs%d_rb%d_chanMod%d_nframes%d_chanReal%d.m",mcs,nb_rb,chMod,n_frames,n_ch_rlz);
|
||||||
@@ -807,6 +841,7 @@ int main(int argc, char **argv) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
avg_iter = 0; iter_trials=0;
|
avg_iter = 0; iter_trials=0;
|
||||||
|
reset_meas(&PHY_vars_UE->phy_proc_tx);
|
||||||
reset_meas(&PHY_vars_UE->ofdm_mod_stats);
|
reset_meas(&PHY_vars_UE->ofdm_mod_stats);
|
||||||
reset_meas(&PHY_vars_UE->ulsch_modulation_stats);
|
reset_meas(&PHY_vars_UE->ulsch_modulation_stats);
|
||||||
reset_meas(&PHY_vars_UE->ulsch_encoding_stats);
|
reset_meas(&PHY_vars_UE->ulsch_encoding_stats);
|
||||||
@@ -815,6 +850,8 @@ int main(int argc, char **argv) {
|
|||||||
reset_meas(&PHY_vars_UE->ulsch_turbo_encoding_stats);
|
reset_meas(&PHY_vars_UE->ulsch_turbo_encoding_stats);
|
||||||
reset_meas(&PHY_vars_UE->ulsch_segmentation_stats);
|
reset_meas(&PHY_vars_UE->ulsch_segmentation_stats);
|
||||||
reset_meas(&PHY_vars_UE->ulsch_multiplexing_stats);
|
reset_meas(&PHY_vars_UE->ulsch_multiplexing_stats);
|
||||||
|
|
||||||
|
reset_meas(&PHY_vars_eNB->phy_proc_rx);
|
||||||
reset_meas(&PHY_vars_eNB->ofdm_demod_stats);
|
reset_meas(&PHY_vars_eNB->ofdm_demod_stats);
|
||||||
reset_meas(&PHY_vars_eNB->ulsch_channel_estimation_stats);
|
reset_meas(&PHY_vars_eNB->ulsch_channel_estimation_stats);
|
||||||
reset_meas(&PHY_vars_eNB->ulsch_freq_offset_estimation_stats);
|
reset_meas(&PHY_vars_eNB->ulsch_freq_offset_estimation_stats);
|
||||||
@@ -877,6 +914,9 @@ int main(int argc, char **argv) {
|
|||||||
///////////////////////////////////////
|
///////////////////////////////////////
|
||||||
|
|
||||||
if (input_fdUL == NULL) {
|
if (input_fdUL == NULL) {
|
||||||
|
|
||||||
|
start_meas(&PHY_vars_UE->phy_proc_tx);
|
||||||
|
|
||||||
#ifdef OFDMA_ULSCH
|
#ifdef OFDMA_ULSCH
|
||||||
if (srs_flag)
|
if (srs_flag)
|
||||||
generate_srs_tx(PHY_vars_UE,0,AMP,subframe);
|
generate_srs_tx(PHY_vars_UE,0,AMP,subframe);
|
||||||
@@ -925,7 +965,7 @@ int main(int argc, char **argv) {
|
|||||||
PHY_vars_UE->ulsch_ue[0]);
|
PHY_vars_UE->ulsch_ue[0]);
|
||||||
#endif
|
#endif
|
||||||
stop_meas(&PHY_vars_UE->ulsch_modulation_stats);
|
stop_meas(&PHY_vars_UE->ulsch_modulation_stats);
|
||||||
|
|
||||||
if (n_frames==1) {
|
if (n_frames==1) {
|
||||||
write_output("txsigF0UL.m","txsF0", &PHY_vars_UE->lte_ue_common_vars.txdataF[0][PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size*nsymb*subframe],PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size*nsymb,1,1);
|
write_output("txsigF0UL.m","txsF0", &PHY_vars_UE->lte_ue_common_vars.txdataF[0][PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size*nsymb*subframe],PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size*nsymb,1,1);
|
||||||
//write_output("txsigF1.m","txsF1", PHY_vars_UE->lte_ue_common_vars.txdataF[0],FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX,1,1);
|
//write_output("txsigF1.m","txsF1", PHY_vars_UE->lte_ue_common_vars.txdataF[0],FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX,1,1);
|
||||||
@@ -954,7 +994,7 @@ int main(int argc, char **argv) {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
stop_meas(&PHY_vars_UE->ofdm_mod_stats);
|
stop_meas(&PHY_vars_UE->ofdm_mod_stats);
|
||||||
|
stop_meas(&PHY_vars_UE->phy_proc_tx);
|
||||||
tx_lev += signal_energy(&txdata[aa][PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe],
|
tx_lev += signal_energy(&txdata[aa][PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe],
|
||||||
PHY_vars_eNB->lte_frame_parms.samples_per_tti);
|
PHY_vars_eNB->lte_frame_parms.samples_per_tti);
|
||||||
|
|
||||||
@@ -1067,7 +1107,7 @@ int main(int argc, char **argv) {
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
start_meas(&PHY_vars_eNB->phy_proc_rx);
|
||||||
start_meas(&PHY_vars_eNB->ofdm_demod_stats);
|
start_meas(&PHY_vars_eNB->ofdm_demod_stats);
|
||||||
lte_eNB_I0_measurements(PHY_vars_eNB,
|
lte_eNB_I0_measurements(PHY_vars_eNB,
|
||||||
0,
|
0,
|
||||||
@@ -1123,7 +1163,7 @@ int main(int argc, char **argv) {
|
|||||||
1, // Nbundled
|
1, // Nbundled
|
||||||
llr8_flag);
|
llr8_flag);
|
||||||
stop_meas(&PHY_vars_eNB->ulsch_decoding_stats);
|
stop_meas(&PHY_vars_eNB->ulsch_decoding_stats);
|
||||||
|
stop_meas(&PHY_vars_eNB->phy_proc_rx);
|
||||||
if (cqi_flag > 0) {
|
if (cqi_flag > 0) {
|
||||||
cqi_error = 0;
|
cqi_error = 0;
|
||||||
if (PHY_vars_eNB->ulsch_eNB[0]->Or1 < 32) {
|
if (PHY_vars_eNB->ulsch_eNB[0]->Or1 < 32) {
|
||||||
@@ -1215,22 +1255,24 @@ int main(int argc, char **argv) {
|
|||||||
dB_fixed(PHY_vars_eNB->lte_eNB_pusch_vars[0]->ulsch_power[1]),
|
dB_fixed(PHY_vars_eNB->lte_eNB_pusch_vars[0]->ulsch_power[1]),
|
||||||
PHY_vars_eNB->PHY_measurements_eNB->n0_power_dB[0],
|
PHY_vars_eNB->PHY_measurements_eNB->n0_power_dB[0],
|
||||||
PHY_vars_eNB->PHY_measurements_eNB->n0_power_dB[1]);
|
PHY_vars_eNB->PHY_measurements_eNB->n0_power_dB[1]);
|
||||||
|
|
||||||
|
effective_rate = ((double)(round_trials[0])/((double)round_trials[0] + round_trials[1] + round_trials[2] + round_trials[3]));
|
||||||
|
|
||||||
printf("Errors (%d/%d %d/%d %d/%d %d/%d), Pe = (%e,%e,%e,%e) => effective rate %f (%3.1f%%,%f), normalized delay %f (%f)\n",
|
printf("Errors (%d/%d %d/%d %d/%d %d/%d), Pe = (%e,%e,%e,%e) => effective rate %f (%3.1f%%,%f), normalized delay %f (%f)\n",
|
||||||
errs[0],
|
errs[0],
|
||||||
round_trials[0],
|
round_trials[0],
|
||||||
errs[1],
|
errs[1],
|
||||||
round_trials[0],
|
round_trials[1],
|
||||||
errs[2],
|
errs[2],
|
||||||
round_trials[0],
|
round_trials[2],
|
||||||
errs[3],
|
errs[3],
|
||||||
round_trials[0],
|
round_trials[3],
|
||||||
(double)errs[0]/(round_trials[0]),
|
(double)errs[0]/(round_trials[0]),
|
||||||
(double)errs[1]/(round_trials[0]),
|
(double)errs[1]/(round_trials[0]),
|
||||||
(double)errs[2]/(round_trials[0]),
|
(double)errs[2]/(round_trials[0]),
|
||||||
(double)errs[3]/(round_trials[0]),
|
(double)errs[3]/(round_trials[0]),
|
||||||
rate*((double)(round_trials[0])/((double)round_trials[0] + round_trials[1] + round_trials[2] + round_trials[3])),
|
rate*effective_rate,
|
||||||
100*((double)(round_trials[0])/((double)round_trials[0] + round_trials[1] + round_trials[2] + round_trials[3])),
|
100*effective_rate,
|
||||||
rate,
|
rate,
|
||||||
(1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0])/(double)PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->TBS,
|
(1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0])/(double)PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->TBS,
|
||||||
(1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0]));
|
(1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0]));
|
||||||
@@ -1263,6 +1305,7 @@ int main(int argc, char **argv) {
|
|||||||
|
|
||||||
if (dump_perf==1) {
|
if (dump_perf==1) {
|
||||||
printf("UE TX function statistics (per 1ms subframe)\n\n");
|
printf("UE TX function statistics (per 1ms subframe)\n\n");
|
||||||
|
printf("Total PHY proc tx :%f us (%d trials)\n",(double)PHY_vars_UE->phy_proc_tx.diff/PHY_vars_UE->phy_proc_tx.trials/cpu_freq_GHz/1000.0,PHY_vars_UE->phy_proc_tx.trials);
|
||||||
printf("OFDM_mod time :%f us (%d trials)\n",(double)PHY_vars_UE->ofdm_mod_stats.diff/PHY_vars_UE->ofdm_mod_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_UE->ofdm_mod_stats.trials);
|
printf("OFDM_mod time :%f us (%d trials)\n",(double)PHY_vars_UE->ofdm_mod_stats.diff/PHY_vars_UE->ofdm_mod_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_UE->ofdm_mod_stats.trials);
|
||||||
printf("ULSCH modulation time :%f us (%d trials)\n",(double)PHY_vars_UE->ulsch_modulation_stats.diff/PHY_vars_UE->ulsch_modulation_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_UE->ulsch_modulation_stats.trials);
|
printf("ULSCH modulation time :%f us (%d trials)\n",(double)PHY_vars_UE->ulsch_modulation_stats.diff/PHY_vars_UE->ulsch_modulation_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_UE->ulsch_modulation_stats.trials);
|
||||||
printf("ULSCH encoding time :%f us (%d trials)\n",(double)PHY_vars_UE->ulsch_encoding_stats.diff/PHY_vars_UE->ulsch_encoding_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_UE->ulsch_encoding_stats.trials);
|
printf("ULSCH encoding time :%f us (%d trials)\n",(double)PHY_vars_UE->ulsch_encoding_stats.diff/PHY_vars_UE->ulsch_encoding_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_UE->ulsch_encoding_stats.trials);
|
||||||
@@ -1273,6 +1316,7 @@ int main(int argc, char **argv) {
|
|||||||
printf("|__ ULSCH multiplexing time :%f us (%d trials)\n",((double)PHY_vars_UE->ulsch_multiplexing_stats.trials/PHY_vars_UE->ulsch_encoding_stats.trials)*(double)PHY_vars_UE->ulsch_multiplexing_stats.diff/PHY_vars_UE->ulsch_multiplexing_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_UE->ulsch_multiplexing_stats.trials);
|
printf("|__ ULSCH multiplexing time :%f us (%d trials)\n",((double)PHY_vars_UE->ulsch_multiplexing_stats.trials/PHY_vars_UE->ulsch_encoding_stats.trials)*(double)PHY_vars_UE->ulsch_multiplexing_stats.diff/PHY_vars_UE->ulsch_multiplexing_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_UE->ulsch_multiplexing_stats.trials);
|
||||||
|
|
||||||
printf("\n\neNB RX function statistics (per 1ms subframe)\n\n");
|
printf("\n\neNB RX function statistics (per 1ms subframe)\n\n");
|
||||||
|
printf("Total PHY proc rx :%f us (%d trials)\n",(double)PHY_vars_eNB->phy_proc_rx.diff/PHY_vars_eNB->phy_proc_rx.trials/cpu_freq_GHz/1000.0,PHY_vars_eNB->phy_proc_rx.trials);
|
||||||
printf("OFDM_demod time :%f us (%d trials)\n",(double)PHY_vars_eNB->ofdm_demod_stats.diff/PHY_vars_eNB->ofdm_demod_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_eNB->ofdm_demod_stats.trials);
|
printf("OFDM_demod time :%f us (%d trials)\n",(double)PHY_vars_eNB->ofdm_demod_stats.diff/PHY_vars_eNB->ofdm_demod_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_eNB->ofdm_demod_stats.trials);
|
||||||
printf("ULSCH demodulation time :%f us (%d trials)\n",(double)PHY_vars_eNB->ulsch_demodulation_stats.diff/PHY_vars_eNB->ulsch_demodulation_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_eNB->ulsch_demodulation_stats.trials);
|
printf("ULSCH demodulation time :%f us (%d trials)\n",(double)PHY_vars_eNB->ulsch_demodulation_stats.diff/PHY_vars_eNB->ulsch_demodulation_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_eNB->ulsch_demodulation_stats.trials);
|
||||||
printf("ULSCH Decoding time (%.2f Mbit/s, avg iter %f) :%f us (%d trials, max %f)\n",
|
printf("ULSCH Decoding time (%.2f Mbit/s, avg iter %f) :%f us (%d trials, max %f)\n",
|
||||||
@@ -1338,7 +1382,73 @@ int main(int argc, char **argv) {
|
|||||||
|
|
||||||
} //ABStraction
|
} //ABStraction
|
||||||
|
|
||||||
|
if ( (test_perf != 0) && (100 * effective_rate > test_perf )) {
|
||||||
|
fprintf(time_meas_fd,"SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3\n");
|
||||||
|
fprintf(time_meas_fd,"%f;%d;%d;%f;%d;%d;%d;%d;%d;%d;%d;%d\n",
|
||||||
|
SNR,
|
||||||
|
mcs,
|
||||||
|
PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->TBS,
|
||||||
|
rate,
|
||||||
|
errs[0],
|
||||||
|
round_trials[0],
|
||||||
|
errs[1],
|
||||||
|
round_trials[1],
|
||||||
|
errs[2],
|
||||||
|
round_trials[2],
|
||||||
|
errs[3],
|
||||||
|
round_trials[3]);
|
||||||
|
|
||||||
|
fprintf(time_meas_fd,"SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3;ND;\n");
|
||||||
|
fprintf(time_meas_fd,"%f;%d;%d;%f(%2.1f%%,%f);%d;%d;%d;%d;%d;%d;%d;%d;(%e,%e,%e,%e);%f(%f);\n",
|
||||||
|
SNR,
|
||||||
|
mcs,
|
||||||
|
PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->TBS,
|
||||||
|
rate*effective_rate,
|
||||||
|
100*effective_rate,
|
||||||
|
rate,
|
||||||
|
errs[0],
|
||||||
|
round_trials[0],
|
||||||
|
errs[1],
|
||||||
|
round_trials[1],
|
||||||
|
errs[2],
|
||||||
|
round_trials[2],
|
||||||
|
errs[3],
|
||||||
|
round_trials[3],
|
||||||
|
(double)errs[0]/(round_trials[0]),
|
||||||
|
(double)errs[1]/(round_trials[0]),
|
||||||
|
(double)errs[2]/(round_trials[0]),
|
||||||
|
(double)errs[3]/(round_trials[0]),
|
||||||
|
(1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0])/(double)PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->TBS,
|
||||||
|
(1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0]));
|
||||||
|
|
||||||
|
fprintf(time_meas_fd,"UE_PROC_TX(%d); OFDM_MOD(%d); UL_MOD(%d); UL_ENC(%d); eNB_PROC_RX(%d); OFDM_DEMOD(%d); UL_DEMOD(%d); UL_DECOD(%d);\n",
|
||||||
|
PHY_vars_UE->phy_proc_tx.trials,
|
||||||
|
PHY_vars_UE->ofdm_mod_stats.trials,
|
||||||
|
PHY_vars_UE->ulsch_modulation_stats.trials,
|
||||||
|
PHY_vars_UE->ulsch_encoding_stats.trials,
|
||||||
|
PHY_vars_eNB->phy_proc_rx.trials,
|
||||||
|
PHY_vars_eNB->ofdm_demod_stats.trials,
|
||||||
|
PHY_vars_eNB->ulsch_demodulation_stats.trials,
|
||||||
|
PHY_vars_eNB->ulsch_decoding_stats.trials
|
||||||
|
);
|
||||||
|
fprintf(time_meas_fd,"%f;%f;%f;%f;%f;%f;%f;%f",
|
||||||
|
get_time_meas_us(&PHY_vars_UE->phy_proc_tx),
|
||||||
|
get_time_meas_us(&PHY_vars_UE->ofdm_mod_stats),
|
||||||
|
get_time_meas_us(&PHY_vars_UE->ulsch_modulation_stats),
|
||||||
|
get_time_meas_us(&PHY_vars_UE->ulsch_encoding_stats),
|
||||||
|
get_time_meas_us(&PHY_vars_eNB->phy_proc_rx),
|
||||||
|
get_time_meas_us(&PHY_vars_eNB->ofdm_demod_stats),
|
||||||
|
get_time_meas_us(&PHY_vars_eNB->ulsch_demodulation_stats),
|
||||||
|
get_time_meas_us(&PHY_vars_eNB->ulsch_decoding_stats)
|
||||||
|
);
|
||||||
|
|
||||||
|
printf("[passed] effective rate : %f (%2.1f%%,%f)): log and break \n",rate*effective_rate, 100*effective_rate, rate );
|
||||||
|
break;
|
||||||
|
} else if (test_perf !=0 ){
|
||||||
|
printf("[continue] effective rate : %f (%2.1f%%,%f)): increase snr \n",rate*effective_rate, 100*effective_rate, rate);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if (((double)errs[0]/(round_trials[0]))<1e-2)
|
if (((double)errs[0]/(round_trials[0]))<1e-2)
|
||||||
break;
|
break;
|
||||||
} // SNR
|
} // SNR
|
||||||
@@ -1377,6 +1487,8 @@ int main(int argc, char **argv) {
|
|||||||
fclose(csv_fdUL);
|
fclose(csv_fdUL);
|
||||||
}
|
}
|
||||||
fclose(bler_fd);
|
fclose(bler_fd);
|
||||||
|
if (test_perf !=0)
|
||||||
|
fclose (time_meas_fd);
|
||||||
|
|
||||||
printf("Freeing channel I/O\n");
|
printf("Freeing channel I/O\n");
|
||||||
for (i=0;i<2;i++) {
|
for (i=0;i<2;i++) {
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ makerr1 = '***'
|
|||||||
makerr2 = 'Error 1'
|
makerr2 = 'Error 1'
|
||||||
|
|
||||||
|
|
||||||
def execute(oai, user, pw, logfile,logdir):
|
def execute(oai, user, pw, logfile,logdir,debug):
|
||||||
|
|
||||||
case = '101'
|
case = '101'
|
||||||
|
|
||||||
|
|||||||
@@ -48,8 +48,8 @@ NUM_UE=2
|
|||||||
NUM_eNB=1
|
NUM_eNB=1
|
||||||
NUM_TRIALS=3
|
NUM_TRIALS=3
|
||||||
|
|
||||||
PRB=[25,50,75,100]
|
PRB=[25]#,50,75,100]
|
||||||
MCS=[4,5,7,9,12,15,18,21,24,27]
|
MCS=[4,5]#,7,9,12,15,18,21,24,27]
|
||||||
ANT_TX=2 # 2
|
ANT_TX=2 # 2
|
||||||
ANT_RX=2 # 2
|
ANT_RX=2 # 2
|
||||||
PDCCH=2 #, 2, 3, 4
|
PDCCH=2 #, 2, 3, 4
|
||||||
@@ -57,12 +57,15 @@ CHANNEL=["N"] # A,B,C,D,E,F,
|
|||||||
TX_MODE=2 # 2,
|
TX_MODE=2 # 2,
|
||||||
MIN_SNR=2
|
MIN_SNR=2
|
||||||
MAX_SNR=18
|
MAX_SNR=18
|
||||||
|
PERF=80
|
||||||
|
OPT="-L"
|
||||||
|
FRAME=500
|
||||||
|
|
||||||
#OPT="-L -d" # 8bit decoder , activate dci decoding at UE
|
#OPT="-L -d" # 8bit decoder , activate dci decoding at UE
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def execute(oai, user, pw, logfile,logdir):
|
def execute(oai, user, pw, logfile,logdir,debug):
|
||||||
|
|
||||||
case = '102'
|
case = '102'
|
||||||
oai.send('cd $OPENAIR1_DIR;')
|
oai.send('cd $OPENAIR1_DIR;')
|
||||||
@@ -94,8 +97,7 @@ def execute(oai, user, pw, logfile,logdir):
|
|||||||
name = 'Run oai.dlsim.perf.70%'
|
name = 'Run oai.dlsim.perf.70%'
|
||||||
diag = 'no diagnostic is available, check the log file'
|
diag = 'no diagnostic is available, check the log file'
|
||||||
for i in range(len(PRB)):
|
for i in range(len(PRB)):
|
||||||
#for j in range(len(MCS)):
|
for j in range(len(MCS)):
|
||||||
for j in range(0,28):
|
|
||||||
for k in range(1,ANT_TX):
|
for k in range(1,ANT_TX):
|
||||||
for m in range (1,ANT_RX):
|
for m in range (1,ANT_RX):
|
||||||
for n in range(1,PDCCH):
|
for n in range(1,PDCCH):
|
||||||
@@ -106,16 +108,17 @@ def execute(oai, user, pw, logfile,logdir):
|
|||||||
|
|
||||||
#conf = '-B' + str(PRB[i]) + ' -m'+str(MCS[j]) + ' -y'+str(k) + ' -z'+str(m) +' -c'+str(n) + ' -g'+str(CHANNEL[o]) + ' -x'+str(p) + ' -s'+str(q) + ' -w1.0 -f.1 -n500 -P -O80' #+ OPT
|
#conf = '-B' + str(PRB[i]) + ' -m'+str(MCS[j]) + ' -y'+str(k) + ' -z'+str(m) +' -c'+str(n) + ' -g'+str(CHANNEL[o]) + ' -x'+str(p) + ' -s'+str(q) + ' -w1.0 -f.1 -n500 -P -O80' #+ OPT
|
||||||
#trace = logdir + '/time_meas' + '_prb'+str(PRB[i])+'_mcs'+ str(MCS[j])+ '_anttx' + str(k)+ '_antrx' + str(m) + '_pdcch' + str(n) + '_channel' +str(CHANNEL[o]) + '_tx' +str(p) + '_snr' +str(q)+'.'+case+str(test)+ '.log'
|
#trace = logdir + '/time_meas' + '_prb'+str(PRB[i])+'_mcs'+ str(MCS[j])+ '_anttx' + str(k)+ '_antrx' + str(m) + '_pdcch' + str(n) + '_channel' +str(CHANNEL[o]) + '_tx' +str(p) + '_snr' +str(q)+'.'+case+str(test)+ '.log'
|
||||||
conf = '-B' + str(PRB[i]) + ' -m'+str(j) + ' -y'+str(k) + ' -z'+str(m) +' -c'+str(n) + ' -g'+str(CHANNEL[o]) + ' -x'+str(p) + ' -s'+str(q) + ' -w1.0 -f.1 -n500 -P -O80' #+ OPT
|
conf = '-B' + str(PRB[i]) + ' -m'+str(MCS[j]) + ' -y'+str(k) + ' -z'+str(m) +' -c'+str(n) + ' -g'+str(CHANNEL[o]) + ' -x'+str(p) + ' -s'+str(q) + ' -w1.0 -f.1 -P -n'+str(FRAME)+' -O'+str(PERF)+' '+ OPT
|
||||||
trace = logdir + '/time_meas' + '_prb'+str(PRB[i])+'_mcs'+ str(j)+ '_anttx' + str(k)+ '_antrx' + str(m) + '_pdcch' + str(n) + '_channel' +str(CHANNEL[o]) + '_tx' +str(p) + '_snr' +str(q)+'.'+case+str(test)+ '.log'
|
trace = logdir + '/time_meas' + '_prb'+str(PRB[i])+'_mcs'+ str(MCS[j])+ '_anttx' + str(k)+ '_antrx' + str(m) + '_pdcch' + str(n) + '_channel' +str(CHANNEL[o]) + '_tx' +str(p) + '_snr' +str(q)+'.'+case+str(test)+ '.log'
|
||||||
tee = ' 2>&1 | tee ' + trace
|
tee = ' 2>&1 | tee ' + trace
|
||||||
match = oai.send_expect_re('./dlsim.rel8 ' + conf + tee, 'passed', 0, 1000)
|
match = oai.send_expect_re('./dlsim.rel8 ' + conf + tee, 'passed', 0, 1000)
|
||||||
#print conf
|
if debug :
|
||||||
|
print conf
|
||||||
if match :
|
if match :
|
||||||
log.ok(case, str(test), name, conf, '', logfile)
|
log.ok(case, str(test), name, conf, '', logfile)
|
||||||
MIN_SNR = q # just to speed up the test
|
MIN_SNR = q # just to speed up the test
|
||||||
test+=1
|
test+=1
|
||||||
break; # found smallest snr
|
break; # found the smallest snr
|
||||||
else :
|
else :
|
||||||
try:
|
try:
|
||||||
if os.path.isfile(trace) :
|
if os.path.isfile(trace) :
|
||||||
|
|||||||
@@ -0,0 +1,130 @@
|
|||||||
|
#******************************************************************************
|
||||||
|
|
||||||
|
# Eurecom OpenAirInterface
|
||||||
|
# Copyright(c) 1999 - 2013 Eurecom
|
||||||
|
|
||||||
|
# This program is free software; you can redistribute it and/or modify it
|
||||||
|
# under the terms and conditions of the GNU General Public License,
|
||||||
|
# version 2, as published by the Free Software Foundation.
|
||||||
|
|
||||||
|
# This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
|
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
# more details.
|
||||||
|
|
||||||
|
# You should have received a copy of the GNU General Public License along with
|
||||||
|
# this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
# 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
|
||||||
|
# The full GNU General Public License is included in this distribution in
|
||||||
|
# the file called "COPYING".
|
||||||
|
|
||||||
|
# Contact Information
|
||||||
|
# Openair Admin: openair_admin@eurecom.fr
|
||||||
|
# Openair Tech : openair_tech@eurecom.fr
|
||||||
|
# Forums : http://forums.eurecom.fsr/openairinterface
|
||||||
|
# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France
|
||||||
|
|
||||||
|
#*****************************************************************************
|
||||||
|
|
||||||
|
# \file case02.py
|
||||||
|
# \brief test case 02 for OAI: executions
|
||||||
|
# \author Navid Nikaein
|
||||||
|
# \date 2013
|
||||||
|
# \version 0.1
|
||||||
|
# @ingroup _test
|
||||||
|
|
||||||
|
import time
|
||||||
|
import random
|
||||||
|
import log
|
||||||
|
import openair
|
||||||
|
import core
|
||||||
|
import os
|
||||||
|
|
||||||
|
|
||||||
|
import shutil # copy file
|
||||||
|
|
||||||
|
NUM_UE=2
|
||||||
|
NUM_eNB=1
|
||||||
|
NUM_TRIALS=3
|
||||||
|
|
||||||
|
PRB=[25]#,50,75,100]
|
||||||
|
MCS=[4,5,7,9,12,15,18,21,24,27]
|
||||||
|
ANT_TX=1 # 2
|
||||||
|
ANT_RX=2 # 2
|
||||||
|
CHANNEL=["N"] # A,B,C,D,E,F,
|
||||||
|
TX_MODE=2 # 2,
|
||||||
|
MIN_SNR=2
|
||||||
|
MAX_SNR=34
|
||||||
|
PERF=80
|
||||||
|
OPT="-L"
|
||||||
|
FRAME=500
|
||||||
|
#OPT="-L -d" # 8bit decoder , activate dci decoding at UE
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def execute(oai, user, pw, logfile,logdir,debug):
|
||||||
|
|
||||||
|
case = '103'
|
||||||
|
oai.send('cd $OPENAIR1_DIR;')
|
||||||
|
oai.send('cd SIMULATION/LTE_PHY;')
|
||||||
|
|
||||||
|
try:
|
||||||
|
test = '0'
|
||||||
|
name = 'Run oai.ulsim.sanity'
|
||||||
|
conf = '-a -n 100'
|
||||||
|
diag = 'ulsim is not running normally (Segmentation fault / Exiting / FATAL), debugging might be needed'
|
||||||
|
trace = logdir + '/log_' + case + test + '_1.txt;'
|
||||||
|
tee = ' 2>&1 | tee ' + trace
|
||||||
|
oai.send_expect_false('./ulsim.rel8 ' + conf + tee, 'Segmentation fault', 30)
|
||||||
|
trace = logdir + '/log_' + case + test + '_2.txt;'
|
||||||
|
tee = ' 2>&1 | tee ' + trace
|
||||||
|
oai.send_expect_false('./ulsim.rel8 ' + conf + tee, 'Exiting', 30)
|
||||||
|
trace = logdir + '/log_' + case + test + '_3.txt;'
|
||||||
|
tee = ' 2>&1 | tee ' + trace
|
||||||
|
oai.send_expect_false('./ulsim.rel8 ' + conf + tee, 'FATAL', 30)
|
||||||
|
|
||||||
|
except log.err, e:
|
||||||
|
log.fail(case, test, name, conf, e.value, diag, logfile,trace)
|
||||||
|
else:
|
||||||
|
log.ok(case, test, name, conf, '', logfile)
|
||||||
|
|
||||||
|
try:
|
||||||
|
test = 1
|
||||||
|
MIN_SNR=2
|
||||||
|
name = 'Run oai.ulsim.perf.'+str(PERF)+'%'
|
||||||
|
diag = 'no diagnostic is available, check the log file'
|
||||||
|
for i in range(len(PRB)):
|
||||||
|
for j in range(len(MCS)):
|
||||||
|
for m in range (1,ANT_RX):
|
||||||
|
for o in range(len(CHANNEL)):
|
||||||
|
for p in range(1,TX_MODE):
|
||||||
|
for q in range(MIN_SNR,MAX_SNR):
|
||||||
|
#if if PRB[i] :
|
||||||
|
|
||||||
|
conf = '-B' + str(PRB[i]) + ' -m'+str(MCS[j]) + ' -y'+str(m) + ' -g'+str(CHANNEL[o]) + ' -x'+str(p) + ' -s'+str(q) + ' -w1.0 -e.1 -P -n'+str(FRAME)+' -O'+str(PERF)+' '+ OPT
|
||||||
|
trace = logdir + '/time_meas' + '_prb'+str(PRB[i])+'_mcs'+ str(MCS[j])+ '_antrx' + str(m) + '_channel' +str(CHANNEL[o]) + '_tx' +str(p) + '_snr' +str(q)+'.'+case+str(test)+ '.log'
|
||||||
|
tee = ' 2>&1 | tee ' + trace
|
||||||
|
match = oai.send_expect_re('./ulsim.rel8 ' + conf + tee, 'passed', 0, 1000)
|
||||||
|
if debug :
|
||||||
|
print conf
|
||||||
|
if q == MAX_SNR :
|
||||||
|
log.skip(case,str(test), name, conf,'','',logfile)
|
||||||
|
|
||||||
|
if match :
|
||||||
|
log.ok(case, str(test), name, conf, '', logfile)
|
||||||
|
MIN_SNR = q # just to speed up the test
|
||||||
|
test+=1
|
||||||
|
break; # found the smallest snr
|
||||||
|
else :
|
||||||
|
try:
|
||||||
|
if os.path.isfile(trace) :
|
||||||
|
os.remove(trace)
|
||||||
|
except OSError, e: ## if failed, report it back to the user ##
|
||||||
|
print ("Error: %s - %s." % (e.filename,e.strerror))
|
||||||
|
|
||||||
|
except log.err, e:
|
||||||
|
log.fail(case, str(test), name, conf, e.value, diag, logfile,trace)
|
||||||
|
#else:
|
||||||
|
# log.ok(case, test, name, conf, '', logfile)
|
||||||
|
|
||||||
@@ -46,6 +46,7 @@ import math #from time import clock
|
|||||||
import log
|
import log
|
||||||
import case11
|
import case11
|
||||||
import case12
|
import case12
|
||||||
|
import case13
|
||||||
|
|
||||||
|
|
||||||
from openair import *
|
from openair import *
|
||||||
@@ -109,8 +110,10 @@ oai.kill(user, pw)
|
|||||||
#oai.rm_driver(oai,user,pw)
|
#oai.rm_driver(oai,user,pw)
|
||||||
|
|
||||||
# start te test cases
|
# start te test cases
|
||||||
case11.execute(oai, user, pw, logfile,logdir)
|
#case11.execute(oai, user, pw, logfile,logdir,debug)
|
||||||
case12.execute(oai, user, pw, logfile,logdir)
|
#case12.execute(oai, user, pw, logfile,logdir,debug)
|
||||||
|
case13.execute(oai, user, pw, logfile,logdir,debug)
|
||||||
|
|
||||||
|
|
||||||
oai.kill(user, pw)
|
oai.kill(user, pw)
|
||||||
#oai.rm_driver(oai,user,pw)
|
#oai.rm_driver(oai,user,pw)
|
||||||
|
|||||||
Reference in New Issue
Block a user