From f8160bd34ab10a1077fb117c67243d4cf974e60f Mon Sep 17 00:00:00 2001 From: Roberto Louro Magueta Date: Wed, 31 Aug 2022 14:38:42 +0100 Subject: [PATCH] Change input command line from -g 2 A l to -g A,l and add channel correlation level as command line option in ulsim --- openair1/SIMULATION/NR_PHY/ulsim.c | 111 +++++++++++++---------------- 1 file changed, 49 insertions(+), 62 deletions(-) diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c index def47fb3db..d1a06393b4 100644 --- a/openair1/SIMULATION/NR_PHY/ulsim.c +++ b/openair1/SIMULATION/NR_PHY/ulsim.c @@ -291,6 +291,7 @@ int main(int argc, char **argv) //int8_t interf1 = -21, interf2 = -21; FILE *input_fd = NULL; SCM_t channel_model = AWGN; //Rayleigh1_anticorr; + corr_level_t corr_level = CORR_LEVEL_LOW; uint16_t N_RB_DL = 106, N_RB_UL = 106, mu = 1; NB_UE_INST = 1; @@ -398,70 +399,52 @@ int main(int argc, char **argv) break; case 'g': + switch ((char) *optarg) { case 'A': - channel_model = SCM_A; - printf("Channel model: SCM-A\n"); - break; - - case 'B': - channel_model = SCM_B; - printf("Channel model: SCM-B\n"); - break; - - case 'C': - channel_model = SCM_C; - printf("Channel model: SCM-C\n"); - break; - - case 'D': - channel_model = SCM_D; - printf("Channel model: SCM-D\n"); - break; - - case 'E': - channel_model = EPA; - printf("Channel model: EPA\n"); - break; - - case 'F': - channel_model = EVA; - printf("Channel model: EVA\n"); - break; - - case 'G': - channel_model = ETU; - printf("Channel model: ETU\n"); - break; - - case 'H': channel_model = TDL_A; DS_TDL = 0.030; // 30 ns printf("Channel model: TDLA30\n"); break; - - case 'I': + case 'B': channel_model = TDL_B; DS_TDL = 0.100; // 100ns printf("Channel model: TDLB100\n"); break; - - case 'J': + case 'C': channel_model = TDL_C; DS_TDL = 0.300; // 300 ns printf("Channel model: TDLC300\n"); break; - default: printf("Unsupported channel model!\n"); exit(-1); } + + if (optarg[1] == ',') { + switch (optarg[2]) { + case 'l': + corr_level = CORR_LEVEL_LOW; + break; + case 'm': + corr_level = CORR_LEVEL_MEDIUM; + break; + case 'h': + corr_level = CORR_LEVEL_HIGH; + break; + default: + printf("Invalid correlation level!\n"); + } + } + break; case 'i': - for(i=0; i < atoi(optarg); i++){ - chest_type[i] = atoi(argv[optind++]); - } + i=0; + do { + chest_type[i>>1] = atoi(&optarg[i]); + i+=2; + } while (optarg[i-1] == ','); break; case 'k': @@ -523,7 +506,7 @@ int main(int argc, char **argv) break; case 't': - eff_tp_check = (float)atoi(optarg); + eff_tp_check = atof(optarg); break; /* @@ -606,16 +589,20 @@ int main(int argc, char **argv) case 'T': enable_ptrs=1; - for(i=0; i < atoi(optarg); i++){ - ptrs_arg[i] = atoi(argv[optind++]); - } + i=0; + do { + ptrs_arg[i>>1] = atoi(&optarg[i]); + i+=2; + } while (optarg[i-1] == ','); break; case 'U': modify_dmrs = 1; - for(i=0; i < atoi(optarg); i++){ - dmrs_arg[i] = atoi(argv[optind++]); - } + i=0; + do { + dmrs_arg[i>>1] = atoi(&optarg[i]); + i+=2; + } while (optarg[i-1] == ','); break; case 'Q': @@ -635,11 +622,12 @@ int main(int argc, char **argv) //printf("-d Use TDD\n"); printf("-d Introduce delay in terms of number of samples\n"); printf("-f Number of frames to simulate\n"); - printf("-g and the channel model [A] SCM-A, [B] SCM-B, [C] SCM-C, [D] SCM-D, [E] EPA, [F] EVA, [G] ETU, [H] TDLA30, [I] TDLB100, [J] TDLC300\n"); + printf("-g Channel model configuration. Arguments list: Number of arguments = 2, {Channel model: [A] TDLA30, [B] TDLB100, [C] TDLC300}, {Correlation: [l] Low, [m] Medium, [h] High}, e.g. -g A,l\n"); printf("-h This message\n"); - printf("-i Change channel estimation technique. Arguments list: Number of arguments=2, Frequency domain {0:Linear interpolation, 1:PRB based averaging}, Time domain {0:Estimates of last DMRS symbol, 1:Average of DMRS symbols}. e.g. -i 2 1 0\n"); + printf("-i Change channel estimation technique. Arguments list: Number of arguments=2, Frequency domain {0:Linear interpolation, 1:PRB based averaging}, Time domain {0:Estimates of last DMRS symbol, 1:Average of DMRS symbols}. e.g. -i 1,0\n"); //printf("-j Relative strength of second intefering eNB (in dB) - cell_id mod 3 = 2\n"); printf("-s Starting SNR, runs from SNR0 to SNR0 + 10 dB if ending SNR isn't given\n"); + printf("-S Ending SNR, runs from SNR0 to SNR1\n"); printf("-m MCS value\n"); printf("-n Number of trials to simulate\n"); printf("-o ldpc offload flag\n"); @@ -663,10 +651,9 @@ int main(int argc, char **argv) printf("-O oversampling factor (1,2,4,8,16)\n"); printf("-R Maximum number of available resorce blocks (N_RB_DL)\n"); printf("-t Acceptable effective throughput (in percentage)\n"); - printf("-S Ending SNR, runs from SNR0 to SNR1\n"); printf("-P Print ULSCH performances\n"); - printf("-T Enable PTRS, arguments list: Number of arguments=2 L_PTRS{0,1,2} K_PTRS{2,4}, e.g. -T 2 0 2 \n"); - printf("-U Change DMRS Config, arguments list: Number of arguments=4, DMRS Mapping Type{0=A,1=B}, DMRS AddPos{0:3}, DMRS Config Type{1,2}, Number of CDM groups without data{1,2,3} e.g. -U 4 0 2 0 1 \n"); + printf("-T Enable PTRS, arguments list: Number of arguments=2 L_PTRS{0,1,2} K_PTRS{2,4}, e.g. -T 0,2 \n"); + printf("-U Change DMRS Config, arguments list: Number of arguments=4, DMRS Mapping Type{0=A,1=B}, DMRS AddPos{0:3}, DMRS Config Type{1,2}, Number of CDM groups without data{1,2,3} e.g. -U 0,2,0,1 \n"); printf("-Q If -F used, read parameters from file\n"); printf("-Z If -Z is used, SC-FDMA or transform precoding is enabled in Uplink \n"); printf("-W Num of layer for PUSCH\n"); @@ -699,7 +686,6 @@ int main(int argc, char **argv) LOG_I( PHY,"++++++++++++++++++++++++++++++++++++++++++++++%i+++++++++++++++++++++++++++++++++++++++++",loglvl); - corr_level_t corr_level = CORR_LEVEL_MEDIUM; // FIXME: Remove this hardcoded value UE2gNB = new_channel_desc_scm(n_tx, n_rx, channel_model, sampling_frequency/1e6, @@ -1020,7 +1006,6 @@ int main(int argc, char **argv) //for (int i=0;i<16;i++) printf("%f\n",gaussdouble(0.0,1.0)); snrRun = 0; - int n_errs = 0; int read_errors=0; int slot_offset = frame_parms->get_samples_slot_timestamp(slot,frame_parms,0); @@ -1071,7 +1056,8 @@ int main(int argc, char **argv) mod_order = nr_get_Qm_ul(Imcs, mcs_table); code_rate = nr_get_code_rate_ul(Imcs, mcs_table); } - + + int ret = 1; uint32_t errors_scrambling[4][100]; int n_errors[4][100]; int round_trials[4][100]; @@ -1083,8 +1069,9 @@ int main(int argc, char **argv) memset(round_trials, 0, sizeof(int)*4*100); memset(blerStats, 0, sizeof(double)*4*100); memset(berStats, 0, sizeof(double)*4*100); - memset(snrStats, 0, sizeof(double)*100); - for (SNR = snr0; SNR < snr1; SNR += snr_step) { + memset(snrStats, 0, sizeof(double) * 100); + + for (SNR = snr0; SNR <= snr1; SNR += snr_step) { varArray_t *table_rx=initVarArray(1000,sizeof(double)); int error_flag = 0; n_false_positive = 0; @@ -1627,12 +1614,12 @@ int main(int argc, char **argv) printf("*************\n"); printf("PUSCH test OK\n"); printf("*************\n"); + ret = 0; break; } snrStats[snrRun] = SNR; snrRun++; - n_errs = n_errors[0][snrRun]; } // SNR loop printf("\n"); @@ -1681,5 +1668,5 @@ int main(int argc, char **argv) if (scg_fd) fclose(scg_fd); - return (n_errs); + return ret; }