mirror of
https://gitlab.eurecom.fr/oai/openairinterface5g.git
synced 2026-07-13 12:40:28 +00:00
Compare commits
1 Commits
Multi_TDD_
...
IISc_pathl
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9179a7f045 |
@@ -46,6 +46,11 @@ extern void print_shorts(char *s,simde__m128i *x);
|
||||
static mapping channelmod_names[] = {
|
||||
CHANNELMOD_MAP_INIT
|
||||
};
|
||||
static mapping plmod_names[] = {
|
||||
PLMOD_MAP_INIT
|
||||
};
|
||||
|
||||
int plmodelid_fromstrtype(char *modeltype);
|
||||
static char *module_id_str[] = MODULEID_STR_INIT;
|
||||
static int channelmod_show_cmd(char *buff, int debug, telnet_printfunc_t prnt);
|
||||
static int channelmod_modify_cmd(char *buff, int debug, telnet_printfunc_t prnt);
|
||||
@@ -80,6 +85,182 @@ static channel_desc_t **defined_channels;
|
||||
static char *modellist_name;
|
||||
|
||||
|
||||
void fill_pathloss_desc(channel_desc_t *chan_desc,
|
||||
double h_bs,
|
||||
double h_ut,
|
||||
double H,
|
||||
double W,
|
||||
double d_2d,
|
||||
int flag ) {
|
||||
chan_desc->pathloss_model_var.h_bs = h_bs;
|
||||
chan_desc->pathloss_model_var.h_ut = h_ut;
|
||||
chan_desc->pathloss_model_var.H = H;
|
||||
chan_desc->pathloss_model_var.W = W;
|
||||
chan_desc->pathloss_model_var.d_2d = d_2d;
|
||||
chan_desc->PM_Flag = flag;
|
||||
LOG_I(OCM,"Getting Pathloss Model descriptors. h_bs %lf, h_ut %lf, H %lf, W %lf, d_2d %lf\n",h_bs,h_ut,H,W,d_2d);
|
||||
}
|
||||
|
||||
|
||||
void set_pathloss_default_values(channel_desc_t *chan_desc){
|
||||
|
||||
switch (chan_desc->pathloss_model)
|
||||
{
|
||||
double h_bs,h_ut,H,W,d_2d;
|
||||
int flag;
|
||||
case None:
|
||||
{h_bs = 0;
|
||||
h_ut = 0;
|
||||
H = 0;
|
||||
W = 0;
|
||||
d_2d = 0;
|
||||
flag = 0;
|
||||
fill_pathloss_desc(chan_desc,h_bs,h_ut,H,W,d_2d,flag);
|
||||
break;}
|
||||
|
||||
case RMa_LOS:
|
||||
{h_bs = 35;
|
||||
h_ut = 1.5;
|
||||
H = 5;
|
||||
W = 20;
|
||||
d_2d = 10;
|
||||
flag = 1;
|
||||
fill_pathloss_desc(chan_desc,h_bs,h_ut,H,W,d_2d,flag);
|
||||
break;}
|
||||
|
||||
case RMa_NLOS:
|
||||
{ h_bs = 35;
|
||||
h_ut = 1.5;
|
||||
H = 5;
|
||||
W = 20;
|
||||
d_2d = 10;
|
||||
flag = 1;
|
||||
fill_pathloss_desc(chan_desc,h_bs,h_ut,H,W,d_2d,flag);
|
||||
break;}
|
||||
|
||||
case UMa_LOS:
|
||||
{ h_bs = 25;
|
||||
h_ut = 1.5;
|
||||
H = 5;
|
||||
W = 20;
|
||||
d_2d = 10;
|
||||
flag = 1;
|
||||
fill_pathloss_desc(chan_desc,h_bs,h_ut,H,W,d_2d,flag);
|
||||
break;}
|
||||
|
||||
case UMa_NLOS:
|
||||
{ h_bs = 25;
|
||||
h_ut = 1.5;
|
||||
H = 5;
|
||||
W = 20;
|
||||
d_2d = 10;
|
||||
flag = 1;
|
||||
fill_pathloss_desc(chan_desc,h_bs,h_ut,H,W,d_2d,flag);
|
||||
break;}
|
||||
|
||||
case UMi_SC_LOS:
|
||||
{h_bs = 10;
|
||||
h_ut = 1.5;
|
||||
H = 5;
|
||||
W = 20;
|
||||
d_2d = 10;
|
||||
flag = 1;
|
||||
fill_pathloss_desc(chan_desc,h_bs,h_ut,H,W,d_2d,flag);
|
||||
break;}
|
||||
|
||||
case UMi_SC_NLOS:
|
||||
{h_bs = 10;
|
||||
h_ut = 1.5;
|
||||
H = 5;
|
||||
W = 20;
|
||||
d_2d = 10;
|
||||
flag = 1;
|
||||
fill_pathloss_desc(chan_desc,h_bs,h_ut,H,W,d_2d,flag);
|
||||
break;}
|
||||
|
||||
case InH_Office_LOS:
|
||||
{h_bs = 10;
|
||||
h_ut = 1.5;
|
||||
H = 5;
|
||||
W = 20;
|
||||
d_2d = 1;
|
||||
flag = 1;
|
||||
fill_pathloss_desc(chan_desc,h_bs,h_ut,H,W,d_2d,flag);
|
||||
break;}
|
||||
|
||||
case InH_Office_NLOS:
|
||||
{h_bs = 10;
|
||||
h_ut = 1.5;
|
||||
H = 5;
|
||||
W = 20;
|
||||
d_2d = 1;
|
||||
flag = 1;
|
||||
fill_pathloss_desc(chan_desc,h_bs,h_ut,H,W,d_2d,flag);
|
||||
break;}
|
||||
|
||||
case InF_LOS:
|
||||
{h_bs = 10;
|
||||
h_ut = 1.5;
|
||||
H = 5;
|
||||
W = 20;
|
||||
d_2d = 1;
|
||||
flag = 1;
|
||||
fill_pathloss_desc(chan_desc,h_bs,h_ut,H,W,d_2d,flag);
|
||||
break;}
|
||||
|
||||
case InF_NLOS_SL:
|
||||
{h_bs = 10;
|
||||
h_ut = 1.5;
|
||||
H = 5;
|
||||
W = 20;
|
||||
d_2d = 1;
|
||||
flag = 1;
|
||||
fill_pathloss_desc(chan_desc,h_bs,h_ut,H,W,d_2d,flag);
|
||||
break;}
|
||||
|
||||
case InF_NLOS_DL:
|
||||
{h_bs = 10;
|
||||
h_ut = 1.5;
|
||||
H = 5;
|
||||
W = 20;
|
||||
d_2d = 1;
|
||||
flag = 1;
|
||||
fill_pathloss_desc(chan_desc,h_bs,h_ut,H,W,d_2d,flag);
|
||||
break;}
|
||||
|
||||
case InF_NLOS_SH:
|
||||
{h_bs = 10;
|
||||
h_ut = 1.5;
|
||||
H = 5;
|
||||
W = 20;
|
||||
d_2d = 1;
|
||||
flag = 1;
|
||||
fill_pathloss_desc(chan_desc,h_bs,h_ut,H,W,d_2d,flag);
|
||||
break;}
|
||||
|
||||
case InF_NLOS_DH:
|
||||
{h_bs = 10;
|
||||
h_ut = 1.5;
|
||||
H = 5;
|
||||
W = 20;
|
||||
d_2d = 1;
|
||||
flag = 1;
|
||||
fill_pathloss_desc(chan_desc,h_bs,h_ut,H,W,d_2d,flag);
|
||||
break;}
|
||||
|
||||
default:
|
||||
{h_bs = 0;
|
||||
h_ut = 0;
|
||||
H = 0;
|
||||
W = 0;
|
||||
d_2d = 0;
|
||||
flag = 0;
|
||||
fill_pathloss_desc(chan_desc,h_bs,h_ut,H,W,d_2d,flag);
|
||||
break;}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void fill_channel_desc(channel_desc_t *chan_desc,
|
||||
uint8_t nb_tx,
|
||||
uint8_t nb_rx,
|
||||
@@ -566,6 +747,7 @@ double get_normalization_ch_factor(channel_desc_t *desc)
|
||||
channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
|
||||
uint8_t nb_rx,
|
||||
SCM_t channel_model,
|
||||
pathloss_model_t pathloss_model,
|
||||
double sampling_rate,
|
||||
uint64_t center_freq,
|
||||
double channel_bandwidth,
|
||||
@@ -620,6 +802,8 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
|
||||
double *tdl_amps_dB;
|
||||
double *tdl_delays;
|
||||
|
||||
set_pathloss_default_values(chan_desc);
|
||||
|
||||
/* Spatial Channel Models (SCM) channel model from TR 38.901 Section 7.7.2 */
|
||||
switch (channel_model) {
|
||||
case SCM_A:
|
||||
@@ -1230,7 +1414,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
|
||||
nb_taps = 1;
|
||||
Td = 0;
|
||||
channel_length = 1;
|
||||
ricean_factor = 0.0;
|
||||
ricean_factor = 1;
|
||||
aoa = .03;
|
||||
maxDoppler = 0;
|
||||
fill_channel_desc(chan_desc,nb_tx,
|
||||
@@ -1992,12 +2176,12 @@ static int channelmod_print_help(char *buff, int debug, telnet_printfunc_t prnt
|
||||
prnt("channelmod show current: display the currently used models in the running executable\n");
|
||||
prnt("channelmod modify <model index> <param name> <param value>: set the specified parameters in a current model to the given value\n");
|
||||
prnt(" <model index> specifies the model, the show current model command can be used to list the current models indexes\n");
|
||||
prnt(" <param name> can be one of \"riceanf\", \"aoa\", \"randaoa\", \"ploss\", \"noise_power_dB\", \"offset\", \"forgetf\"\n");
|
||||
prnt(" <param name> can be one of \"riceanf\", \"aoa\", \"randaoa\", \"ploss\", \"noise_power_dB\", \"offset\", \"forgetf\",\"pathloss_model\", \"hBS\", \"hUT\", \"H\", \"W\"\n");
|
||||
return CMDSTATUS_FOUND;
|
||||
}
|
||||
|
||||
static char *pnames[] = {"riceanf", "aoa", "randaoa", "ploss", "noise_power_dB", "offset", "forgetf", NULL};
|
||||
static char *pformat[] = {"%lf", "%lf", "%i", "%lf", "%lf", "%i", "%lf", NULL};
|
||||
static char *pnames[] = {"riceanf", "aoa", "randaoa", "ploss", "noise_power_dB", "offset", "forgetf","pathloss_model","hBS","hUT","H","W",NULL};
|
||||
static char *pformat[] = {"%lf", "%lf", "%i", "%lf", "%lf", "%i", "%lf","%s","%lf","%lf","%lf","%lf",NULL};
|
||||
int get_channel_params(char *buf, int debug, void *vdata, telnet_printfunc_t prnt)
|
||||
{
|
||||
if (buf == NULL) {
|
||||
@@ -2059,7 +2243,7 @@ int get_channel_params(char *buf, int debug, void *vdata, telnet_printfunc_t prn
|
||||
|
||||
} /* get_currentchannel_type */
|
||||
|
||||
static void display_channelmodel(channel_desc_t *cd,int debug, telnet_printfunc_t prnt) {
|
||||
void display_channelmodel(channel_desc_t *cd,int debug, telnet_printfunc_t prnt) {
|
||||
prnt("model owner: %s\n",(cd->module_id != 0)?module_id_str[cd->module_id]:"not set");
|
||||
prnt("nb_tx: %i nb_rx: %i taps: %i bandwidth: %lf sampling: %lf\n",cd->nb_tx, cd->nb_rx, cd->nb_taps, cd->channel_bandwidth, cd->sampling_rate);
|
||||
prnt("channel length: %i Max path delay: %lf ricean fact.: %lf angle of arrival: %lf (randomized:%s)\n",
|
||||
@@ -2068,7 +2252,8 @@ static void display_channelmodel(channel_desc_t *cd,int debug, telnet_printfunc_
|
||||
cd->max_Doppler, cd->path_loss_dB, cd->noise_power_dB, cd->channel_offset, cd->forgetting_factor);
|
||||
prnt("Initial phase: %lf nb_path: %i \n",
|
||||
cd->ip, cd->nb_paths);
|
||||
|
||||
char* pathlossmodel_names[] = {"None", "RMa_LOS", "RMa_NLOS", "UMa_LOS", "UMa_NLOS", "UMi_SC_LOS", "UMi_SC_NLOS", "InH_Office_LOS", "InH_Office_NLOS", "InF_LOS", "InF_NLOS_DL", "InF_NLOS_DH", "InF_NLOS_SL", "InF_NLOS_SH"};
|
||||
prnt("Pathloss Model: %s hBS: %lf hUT: %lf H:%lf W:%lf distance_2d: %lf PMFlag:%d\n",pathlossmodel_names[cd->pathloss_model],cd->pathloss_model_var.h_bs,cd->pathloss_model_var.h_ut,cd->pathloss_model_var.H,cd->pathloss_model_var.W,cd->pathloss_model_var.d_2d,cd->PM_Flag);
|
||||
for (int i=0; i<cd->nb_taps ; i++) {
|
||||
prnt("taps: %i lin. ampli. : %lf delay: %lf \n",i,cd->amps[i], cd->delays[i]);
|
||||
}
|
||||
@@ -2155,6 +2340,202 @@ static int channelmod_show_cmd(char *buff, int debug, telnet_printfunc_t prnt) {
|
||||
|
||||
|
||||
|
||||
double g(double d_2D){
|
||||
if(d_2D<=18)
|
||||
return 0;
|
||||
else
|
||||
return((5/4)*pow((d_2D/100),3)*exp(-d_2D/150));
|
||||
}
|
||||
|
||||
double c1(double d_2D,double h_UT){
|
||||
if(h_UT<13)
|
||||
return 0;
|
||||
else if(h_UT<=23 || h_UT>=13){
|
||||
double b= g(d_2D);
|
||||
return(pow(((h_UT-13)/10),1.5)*b);
|
||||
}else return 0.0;
|
||||
}
|
||||
|
||||
double generateRandomNumber(double min, double max){
|
||||
int numValues = (int)((max - min) / 0.5) + 1;
|
||||
int randomIndex = rand() % numValues;
|
||||
double randomNumber = min + randomIndex * 0.5;
|
||||
return randomNumber;
|
||||
}
|
||||
|
||||
int calculate_pathloss_cmd(channel_desc_t *chan_desc){
|
||||
|
||||
double d_2D = chan_desc->pathloss_model_var.d_2d; //2D Distance
|
||||
double h_BS = chan_desc->pathloss_model_var.h_bs; //Base Station Antenna Height
|
||||
double h_UT = chan_desc->pathloss_model_var.h_ut; //User Terminal Antenna Height
|
||||
double h = chan_desc->pathloss_model_var.H; //Average Height of Buildings
|
||||
double w = chan_desc->pathloss_model_var.W; //Average Width of the street
|
||||
double fc = (double)chan_desc->center_freq; //Center Frequency
|
||||
double fc_norm = fc/(pow(10,9)); //Normalized Center Frequency to 1Ghz
|
||||
const double c = 299792458; /* 3e8 */
|
||||
|
||||
|
||||
double d_3D = sqrt((d_2D*d_2D)+((h_BS-h_UT)*(h_BS-h_UT))); //3D Distance
|
||||
|
||||
if(chan_desc->pathloss_model == RMa_LOS || chan_desc->pathloss_model == RMa_NLOS){
|
||||
double d_BP = (2*M_PI*h_BS*h_UT*fc)/c; //Break Point Distance
|
||||
double d_3D_BP = sqrt((d_BP*d_BP)+((h_BS-h_UT)*(h_BS-h_UT)));
|
||||
double PL1 = 20*log10(40*M_PI*d_3D*fc_norm/3)+(min(pow(0.03*h,1.72),10))*log10(d_3D)-min(pow(0.044*h,1.72),14.77)+(0.002*log10(h)*d_3D)+gaussZiggurat(0.0,(4.0*4.0));
|
||||
double PL2 = (20*log10(40*M_PI*d_3D_BP*fc_norm/3)+(min(pow(0.03*h,1.72),10))*log10(d_3D_BP)-min(pow(0.044*h,1.72),14.77)+0.002*log10(h)*d_3D_BP)+40*log10(d_3D/d_BP)+gaussZiggurat(0.0,(6.0*6.0));
|
||||
double RMa_LOS_PL;
|
||||
if(d_2D<=d_BP || d_2D>=10){
|
||||
RMa_LOS_PL=PL1;
|
||||
}
|
||||
else{
|
||||
RMa_LOS_PL=PL2;
|
||||
}
|
||||
if(chan_desc->pathloss_model==RMa_LOS){
|
||||
chan_desc->path_loss_dB=-1*RMa_LOS_PL;
|
||||
printf("Pathloss is set to %lf db",RMa_LOS_PL);
|
||||
return 0;
|
||||
}
|
||||
else{
|
||||
double RMa_NLOS_PL;
|
||||
double PL3 = 161.04 -7.1*log10(w)+(7.5*log10(h))-((24.37-3.7*(h/h_BS)*(h/h_BS))*(log10(h_BS)))+((43.42-3.1*log10(h_BS))*(log10(d_3D)-3))+(20*log10(fc_norm))-(3.2*(log10(11.75*h_UT))*(log10(11.75*h_UT)) - 4.97)+gaussZiggurat(0.0,(8.0*8.0));
|
||||
RMa_NLOS_PL = max(RMa_LOS_PL,PL3);
|
||||
chan_desc->path_loss_dB=-1*RMa_NLOS_PL;
|
||||
printf("Pathloss is set to %lf db",RMa_NLOS_PL);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
else if(chan_desc->pathloss_model == UMa_LOS || chan_desc->pathloss_model == UMa_NLOS){
|
||||
double hE;
|
||||
double a = c1(d_2D,h_UT);
|
||||
double pr = 1/(1+a);
|
||||
if(pr>0.5)
|
||||
hE=1;
|
||||
else
|
||||
hE=generateRandomNumber(12,(h_UT - 1.5));
|
||||
//Effective antenna lengths
|
||||
double h1_BS=h_BS-hE;
|
||||
double h1_UT=h_UT-hE;
|
||||
double d1_BP=(4*h1_BS*h1_UT*fc/c);
|
||||
double PL1 = 28+(22*log10(d_3D))+(20*log10(fc_norm))+gaussZiggurat(0,(4*4));
|
||||
double PL2 = 28+(40*log10(d_3D))+(20*log10(fc_norm))-(9*log10((pow(d1_BP,2)+pow((h_BS-h_UT),2))))+gaussZiggurat(0,(4*4));
|
||||
double UMa_LOS_PL=0;
|
||||
if(d_2D<=d1_BP || d_2D>=10){
|
||||
UMa_LOS_PL=PL1;
|
||||
}
|
||||
else if (d_2D<=5000 || d_2D > d1_BP){
|
||||
UMa_LOS_PL=PL2;
|
||||
}
|
||||
if(chan_desc->pathloss_model==RMa_LOS){
|
||||
chan_desc->path_loss_dB=-1*UMa_LOS_PL;
|
||||
printf("Pathloss is set to %lf db",UMa_LOS_PL);
|
||||
return 0;
|
||||
}
|
||||
else{
|
||||
double UMa_NLOS_PL;
|
||||
double PL3 = 13.54+(39.08*log10(d_3D))+(20*log10(fc_norm))-(0.6*(h_UT-1.5))+gaussZiggurat(0,(6*6));
|
||||
UMa_NLOS_PL = max(UMa_LOS_PL,PL3);
|
||||
chan_desc->path_loss_dB=-1*UMa_NLOS_PL;
|
||||
printf("Pathloss is set to %lf db",UMa_NLOS_PL);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
else if(chan_desc->pathloss_model == UMi_SC_LOS || chan_desc->pathloss_model == UMi_SC_NLOS){
|
||||
//Effective Antenna Lengths
|
||||
double h1_BS=h_BS-1;
|
||||
double h1_UT=h_UT-1;
|
||||
double d1_BP=(4*h1_BS*h1_UT*fc/c); //Break Point Distance
|
||||
double PL1 = 32.4+(21*log10(d_3D))+(20*log10(fc_norm))+gaussZiggurat(0,(4*4));
|
||||
double PL2 = 32.4+(40*log10(d_3D))+(20*log10(fc_norm))-(9.5*log10((pow(d1_BP,2)+pow((h_BS-h_UT),2))))+gaussZiggurat(0,(4*4));
|
||||
double UMi_SC_LOS_PL=0;
|
||||
if(d_2D<=d1_BP || d_2D>=10){
|
||||
UMi_SC_LOS_PL=PL1;
|
||||
}
|
||||
else if (d_2D<=5000 || d_2D > d1_BP){
|
||||
UMi_SC_LOS_PL=PL2;
|
||||
}
|
||||
if(chan_desc->pathloss_model==RMa_LOS){
|
||||
chan_desc->path_loss_dB=-1*UMi_SC_LOS_PL;
|
||||
printf("Pathloss is set to %lf db",UMi_SC_LOS_PL);
|
||||
return 0;
|
||||
}
|
||||
else{
|
||||
double UMi_SC_NLOS_PL;
|
||||
double PL3 = (35.3*log10(d_3D))+22.4+(21.3*log10(fc_norm))-(0.3*(h_UT-1.5))+gaussZiggurat(0,(7.82*7.82));
|
||||
UMi_SC_NLOS_PL = max(UMi_SC_LOS_PL,PL3);
|
||||
chan_desc->path_loss_dB=-1*UMi_SC_NLOS_PL;
|
||||
printf("Pathloss is set to %lf db",UMi_SC_NLOS_PL);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
else if(chan_desc->pathloss_model == InH_Office_LOS || chan_desc->pathloss_model == InH_Office_NLOS){
|
||||
|
||||
if(d_3D>150 || d_3D <1){
|
||||
printf("InH_Office Model is valid only between 1<=d_3D<=150");
|
||||
return 0;
|
||||
}
|
||||
|
||||
double InH_LOS_PL = 32.4+(17.3*log10(d_3D))+(20*log10(fc_norm))+gaussZiggurat(0,(3*3));
|
||||
if(chan_desc->pathloss_model==InH_Office_LOS){
|
||||
chan_desc->path_loss_dB=-1*InH_LOS_PL;
|
||||
printf("Pathloss is set to %lf db",InH_LOS_PL);
|
||||
return 0;
|
||||
}
|
||||
else{
|
||||
double PL1 = (38.3*log10(d_3D))+17.3+(24.9*log10(fc_norm))+gaussZiggurat(0,(8.03*8.03));
|
||||
double InH_NLOS_PL = max(InH_LOS_PL,PL1);
|
||||
chan_desc->path_loss_dB=-1*InH_NLOS_PL;
|
||||
printf("Pathloss is set to %lf db",InH_NLOS_PL);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
else if(chan_desc->pathloss_model == InF_LOS || chan_desc->pathloss_model == InF_NLOS_DH || chan_desc->pathloss_model == InF_NLOS_SH || chan_desc->pathloss_model == InF_NLOS_DL || chan_desc->pathloss_model == InF_NLOS_SL){
|
||||
|
||||
if(d_3D>600 || d_3D <1){
|
||||
printf("InH_Office Model is valid only between 1<=d_3D<=600");
|
||||
return 0;
|
||||
}
|
||||
|
||||
double InF_LOS_PL = 31.84+(21.50*log10(d_3D))+(19*log10(fc_norm))+gaussZiggurat(0,(4*4));
|
||||
if(chan_desc->pathloss_model==InF_LOS){
|
||||
chan_desc->path_loss_dB=-1*InF_LOS_PL;
|
||||
printf("Pathloss is set to %lf db",InF_LOS_PL);
|
||||
return 0;
|
||||
}
|
||||
else if(chan_desc->pathloss_model==InF_NLOS_SL || chan_desc->pathloss_model==InF_NLOS_DL){
|
||||
double PL1 = 33+(25.5*log10(d_3D))+(20*log10(fc_norm))+gaussZiggurat(0,(5.7*5.7));
|
||||
double InF_NLOS_SL_PL = max(InF_LOS_PL,PL1);
|
||||
if(chan_desc->pathloss_model==InF_NLOS_SL){
|
||||
chan_desc->path_loss_dB=-1*InF_NLOS_SL_PL;
|
||||
printf("Pathloss is set to %lf db",InF_NLOS_SL_PL);
|
||||
return 0;
|
||||
}
|
||||
else{
|
||||
double PL2 = 18.6+(35.7*log10(d_3D))+(20*log10(fc_norm))+gaussZiggurat(0,(7.2*7.2));
|
||||
double InF_NLOS_DL_PL = max(max(InF_LOS_PL,InF_NLOS_SL_PL),PL2);
|
||||
chan_desc->path_loss_dB=-1*InF_NLOS_DL_PL;
|
||||
printf("Pathloss is set to %lf db",InF_NLOS_DL_PL);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
else if(chan_desc->pathloss_model==InF_NLOS_SH){
|
||||
double PL3=32.4+(23*log10(d_3D))+(20*log10(fc_norm))+gaussZiggurat(0,(5.9*5.9));
|
||||
double InF_NLOS_SH_PL=max(PL3,InF_LOS_PL);
|
||||
chan_desc->path_loss_dB=-1*InF_NLOS_SH_PL;
|
||||
printf("Pathloss is set to %lf db",InF_NLOS_SH_PL);
|
||||
return 0;
|
||||
}
|
||||
else{
|
||||
double PL4=33.63+(21.9*log10(d_3D))+(20*log10(fc_norm))+gaussZiggurat(0,(4*4));
|
||||
double InF_NLOS_DH_PL=max(PL4,InF_LOS_PL);
|
||||
chan_desc->path_loss_dB=-1*InF_NLOS_DH_PL;
|
||||
printf("Pathloss is set to %lf db",InF_NLOS_DH_PL);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static int channelmod_modify_cmd(char *buff, int debug, telnet_printfunc_t prnt) {
|
||||
char *param=NULL, *value=NULL;
|
||||
int cd_id= -1;
|
||||
@@ -2193,8 +2574,14 @@ static int channelmod_modify_cmd(char *buff, int debug, telnet_printfunc_t prnt)
|
||||
else
|
||||
defined_channels[cd_id]->random_aoa=i;
|
||||
} else if ( strcmp(param,"ploss") == 0) {
|
||||
double dbl = atof(value);
|
||||
defined_channels[cd_id]->path_loss_dB=dbl;
|
||||
if (defined_channels[cd_id]->PM_Flag==0){
|
||||
double dbl = atof(value);
|
||||
defined_channels[cd_id]->path_loss_dB=dbl;
|
||||
}
|
||||
else{
|
||||
prnt("ERROR: Pathloss cannot be varied as Pathloss Model is set\n");
|
||||
}
|
||||
|
||||
} else if ( strcmp(param,"noise_power_dB") == 0) {
|
||||
double dbl = atof(value);
|
||||
defined_channels[cd_id]->noise_power_dB=dbl;
|
||||
@@ -2208,10 +2595,60 @@ static int channelmod_modify_cmd(char *buff, int debug, telnet_printfunc_t prnt)
|
||||
prnt("ERROR: forgetting factor range: 0 to 1 (disable variation), %lf is outof range\n",dbl);
|
||||
else
|
||||
defined_channels[cd_id]->forgetting_factor=dbl;
|
||||
} else {
|
||||
}
|
||||
else if ( strcmp(param,"hUT") == 0) {
|
||||
double dbl = atof(value);
|
||||
if (defined_channels[cd_id]->pathloss_model== RMa_LOS || defined_channels[cd_id]->pathloss_model== RMa_NLOS)
|
||||
{
|
||||
if (dbl <1 || dbl > 10)
|
||||
prnt("Error: For Rma Model hUT can vary between 1<=hUT<=10; %lf is outof range\n",dbl);
|
||||
else
|
||||
defined_channels[cd_id]->pathloss_model_var.h_ut=dbl;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (dbl <1.5 || dbl > 22.5)
|
||||
prnt("Error: For the given Pathloss Model hUT can vary between 1.5<=hUT<=22.5; %lf is outof range\n",dbl);
|
||||
else
|
||||
defined_channels[cd_id]-> pathloss_model_var.h_ut=dbl;
|
||||
}
|
||||
}
|
||||
else if ( strcmp(param,"hBS") == 0) {
|
||||
double dbl = atof(value);
|
||||
if (dbl <10 || dbl > 150)
|
||||
prnt("Error: For the given Pathloss Model hBS can vary between 10<=hUT<=150; %lf is outof range\n",dbl);
|
||||
else
|
||||
defined_channels[cd_id]->pathloss_model_var.h_bs=dbl;
|
||||
}
|
||||
else if ( strcmp(param,"H") == 0) {
|
||||
double dbl = atof(value);
|
||||
if (dbl <5 || dbl > 50)
|
||||
prnt("Error: For the given Pathloss Model H can vary between 5<=hUT<=50; %lf is outof range\n",dbl);
|
||||
else
|
||||
defined_channels[cd_id]->pathloss_model_var.H=dbl;
|
||||
}
|
||||
else if ( strcmp(param,"W") == 0) {
|
||||
double dbl = atof(value);
|
||||
if (dbl <5 || dbl > 50)
|
||||
prnt("Error: For the given Pathloss Model W can vary between 5<=hUT<=50; %lf is outof range\n",dbl);
|
||||
else
|
||||
defined_channels[cd_id]->pathloss_model_var.W=dbl;
|
||||
}
|
||||
else if ( strcmp(param,"pathloss_model") == 0) {
|
||||
int dbl = plmodelid_fromstrtype(value);
|
||||
if (dbl <0)
|
||||
prnt("Error: The Given Pathloss Model is not valid\n",dbl);
|
||||
else{
|
||||
defined_channels[cd_id]->pathloss_model=dbl;
|
||||
set_pathloss_default_values(defined_channels[cd_id]);
|
||||
}
|
||||
}
|
||||
|
||||
else {
|
||||
prnt("ERROR: %s, unknown channel parameter\n",param);
|
||||
return CMDSTATUS_FOUND;
|
||||
}
|
||||
calculate_pathloss_cmd(defined_channels[cd_id]);
|
||||
display_channelmodel(defined_channels[cd_id],debug,prnt);
|
||||
free(param);
|
||||
free(value);
|
||||
@@ -2260,6 +2697,15 @@ int modelid_fromstrtype(char *modeltype) {
|
||||
return modelid;
|
||||
}
|
||||
|
||||
int plmodelid_fromstrtype(char *modeltype) {
|
||||
int modelid=map_str_to_int(plmod_names,modeltype);
|
||||
|
||||
if (modelid < 0)
|
||||
LOG_E(OCM,"random_channel.c: Error Pathloss model %s unknown\n",modeltype);
|
||||
|
||||
return modelid;
|
||||
}
|
||||
|
||||
double channelmod_get_snr_dB(void) {
|
||||
return snr_dB;
|
||||
}
|
||||
@@ -2284,7 +2730,7 @@ void init_channelmod(void) {
|
||||
} /* init_channelmod */
|
||||
|
||||
|
||||
int load_channellist(uint8_t nb_tx, uint8_t nb_rx, double sampling_rate, double channel_bandwidth) {
|
||||
int load_channellist(uint8_t nb_tx, uint8_t nb_rx, double sampling_rate, double channel_bandwidth, uint64_t fc) {
|
||||
paramdef_t achannel_params[] = CHANNELMOD_MODEL_PARAMS_DESC;
|
||||
paramlist_def_t channel_list;
|
||||
memset(&channel_list,0,sizeof(paramlist_def_t));
|
||||
@@ -2299,9 +2745,11 @@ int load_channellist(uint8_t nb_tx, uint8_t nb_rx, double sampling_rate, double
|
||||
int pindex_PL = config_paramidx_fromname(achannel_params,numparams, CHANNELMOD_MODEL_PL_PNAME );
|
||||
int pindex_NP = config_paramidx_fromname(achannel_params,numparams, CHANNELMOD_MODEL_NP_PNAME );
|
||||
int pindex_TYPE = config_paramidx_fromname(achannel_params,numparams, CHANNELMOD_MODEL_TYPE_PNAME);
|
||||
int pindex_PLM = config_paramidx_fromname(achannel_params,numparams, CHANNELMOD_MODEL_PLM_PNAME);
|
||||
|
||||
for (int i=0; i<channel_list.numelt; i++) {
|
||||
int modid = modelid_fromstrtype( *(channel_list.paramarray[i][pindex_TYPE].strptr) );
|
||||
int plmid = plmodelid_fromstrtype( *(channel_list.paramarray[i][pindex_PLM].strptr) );
|
||||
|
||||
if (modid <0) {
|
||||
LOG_E(OCM,"Valid channel model types:\n");
|
||||
@@ -2313,11 +2761,22 @@ int load_channellist(uint8_t nb_tx, uint8_t nb_rx, double sampling_rate, double
|
||||
AssertFatal(0, "\n Choose a valid model type\n");
|
||||
}
|
||||
|
||||
if (plmid <0) {
|
||||
LOG_E(OCM,"Valid Pathloss model types:\n");
|
||||
|
||||
for (int m=0; plmod_names[i].name != NULL ; m++) {
|
||||
printf(" %s ", map_int_to_str(plmod_names,m ));
|
||||
}
|
||||
|
||||
AssertFatal(0, "\n Choose a valid model type\n");
|
||||
}
|
||||
|
||||
channel_desc_t *channeldesc_p = new_channel_desc_scm(nb_tx,
|
||||
nb_rx,
|
||||
modid,
|
||||
plmid,
|
||||
sampling_rate,
|
||||
0,
|
||||
fc,
|
||||
channel_bandwidth,
|
||||
*(channel_list.paramarray[i][pindex_DT].dblptr),
|
||||
0.0,
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
#ifndef __SIMULATION_TOOLS_DEFS_H__
|
||||
#define __SIMULATION_TOOLS_DEFS_H__
|
||||
#include "PHY/defs_common.h"
|
||||
#include "common/utils/telnetsrv/telnetsrv.h"
|
||||
#include <pthread.h>
|
||||
/** @defgroup _numerical_ Useful Numerical Functions
|
||||
*@{
|
||||
@@ -57,6 +58,51 @@ typedef enum {
|
||||
CORR_LEVEL_HIGH
|
||||
} corr_level_t;
|
||||
|
||||
typedef struct pathloss_model_variable_t_s{
|
||||
//antenna height for BS in meters
|
||||
double h_bs;
|
||||
//antenna height for UT (User Terminal) in meters
|
||||
double h_ut;
|
||||
//H = avg. building height in meters
|
||||
double H ;
|
||||
//W = avg. street width in meters
|
||||
double W ;
|
||||
//2D distance between Tx and Rx in meters
|
||||
double d_2d;
|
||||
}pathloss_model_variable_t;
|
||||
|
||||
|
||||
typedef enum {
|
||||
//No Pathloss model selected user can set Pathloss.
|
||||
None,
|
||||
//Rural Macro Line of Sight
|
||||
RMa_LOS,
|
||||
//Rural Macro Non-Line of Sight
|
||||
RMa_NLOS,
|
||||
//Urban Macro Line of Sight
|
||||
UMa_LOS,
|
||||
//Urban Macro Non-Line of Sight
|
||||
UMa_NLOS,
|
||||
//Urabn Micro Street Canyon Line of Sight
|
||||
UMi_SC_LOS,
|
||||
//Urabn Micro Street Canyon Non-Line of Sight
|
||||
UMi_SC_NLOS,
|
||||
//Indoor Hotspot Office Line of Sight
|
||||
InH_Office_LOS,
|
||||
//Indoor Hotspot Office Non-Line of Sight
|
||||
InH_Office_NLOS,
|
||||
//Indoor Factory Line of Sight
|
||||
InF_LOS,
|
||||
//Indoor Factory with Dense clutter and Low base station height (both Tx and Rx are below the average height of the clutter)
|
||||
InF_NLOS_DL,
|
||||
//Indoor Factory with Dense clutter and High base station height (Tx or Rx elevated above the clutter)
|
||||
InF_NLOS_DH,
|
||||
//Indoor Factory with Sparse clutter and Low base station height (both Tx and Rx are below the average height of the clutter)
|
||||
InF_NLOS_SL,
|
||||
//Indoor Factory with Sparse clutter and High base station height (Tx or Rx elevated above the clutter)
|
||||
InF_NLOS_SH
|
||||
} pathloss_model_t;
|
||||
|
||||
typedef struct {
|
||||
///Number of tx antennas
|
||||
uint8_t nb_tx;
|
||||
@@ -123,9 +169,15 @@ typedef struct {
|
||||
/// identifies channel descriptor owner (the module which created this descriptor
|
||||
channelmod_moduleid_t module_id;
|
||||
/// name of this descriptor,used for model created from config file at init time
|
||||
char *model_name;
|
||||
char *model_name;
|
||||
/// flags to properly trigger memory free
|
||||
unsigned int free_flags;
|
||||
/// Pathloss Models as defined by TR 38.901 version 16.1.0 Release 16
|
||||
pathloss_model_t pathloss_model;
|
||||
/// Variables required for pathloss models
|
||||
pathloss_model_variable_t pathloss_model_var;
|
||||
///Pathloss Model Flag doesn't let the user change the pathloss directly when Pathloss Model is set
|
||||
int PM_Flag;
|
||||
} channel_desc_t;
|
||||
|
||||
typedef struct {
|
||||
@@ -258,6 +310,23 @@ typedef enum {
|
||||
#define CONFIG_HLP_SNR "Set average SNR in dB (for --siml1 option)\n"
|
||||
#define CHANNELMOD_SECTION "channelmod"
|
||||
|
||||
#define PLMOD_MAP_INIT \
|
||||
{"None",None},\
|
||||
{"RMa_LOS",RMa_LOS},\
|
||||
{"RMa_NLOS",RMa_NLOS},\
|
||||
{"UMa_LOS",UMa_LOS},\
|
||||
{"UMa_NLOS",UMa_NLOS},\
|
||||
{"UMi_SC_LOS",UMi_SC_LOS},\
|
||||
{"UMi_SC_NLOS",UMi_SC_NLOS},\
|
||||
{"InH_Office_LOS",InH_Office_LOS},\
|
||||
{"InH_Office_NLOS",InH_Office_NLOS},\
|
||||
{"InF_LOS",InF_LOS},\
|
||||
{"InF_NLOS_DL",InF_NLOS_DL},\
|
||||
{"InF_NLOS_DH",InF_NLOS_DH},\
|
||||
{"InF_NLOS_SL",InF_NLOS_SL},\
|
||||
{"InF_NLOS_SH",InF_NLOS_SH},\
|
||||
{NULL, -1}
|
||||
|
||||
/* global channel modelization parameters */
|
||||
#define CHANNELMOD_MODELLIST_PARANAME "modellist"
|
||||
|
||||
@@ -271,9 +340,10 @@ typedef enum {
|
||||
}
|
||||
// clang-format on
|
||||
|
||||
/* parameters for one model */
|
||||
/* parameters for one model */
|
||||
#define CHANNELMOD_MODEL_NAME_PNAME "model_name"
|
||||
#define CHANNELMOD_MODEL_TYPE_PNAME "type"
|
||||
#define CHANNELMOD_MODEL_PLM_PNAME "pathloss_model"
|
||||
#define CHANNELMOD_MODEL_PL_PNAME "ploss_dB"
|
||||
#define CHANNELMOD_MODEL_NP_PNAME "noise_power_dB"
|
||||
#define CHANNELMOD_MODEL_FF_PNAME "forgetfact"
|
||||
@@ -284,6 +354,7 @@ typedef enum {
|
||||
#define CHANNELMOD_MODEL_PARAMS_DESC { \
|
||||
{CHANNELMOD_MODEL_NAME_PNAME, "name of the model\n", 0, .strptr=NULL , .defstrval="", TYPE_STRING, 0 }, \
|
||||
{CHANNELMOD_MODEL_TYPE_PNAME, "name of the model type\n", 0, .strptr=NULL , .defstrval="AWGN", TYPE_STRING, 0 }, \
|
||||
{CHANNELMOD_MODEL_PLM_PNAME, "name of the pathloss Model\n", 0, .strptr=NULL , .defstrval="None", TYPE_STRING, 0 }, \
|
||||
{CHANNELMOD_MODEL_PL_PNAME, "channel path loss in dB\n", 0, .dblptr=NULL, .defdblval=0, TYPE_DOUBLE, 0 }, \
|
||||
{CHANNELMOD_MODEL_NP_PNAME, "channel noise in dB\n", 0, .dblptr=NULL, .defdblval=-50, TYPE_DOUBLE, 0 }, \
|
||||
{CHANNELMOD_MODEL_FF_PNAME, "channel forget factor ((0 to 1)\n", 0, .dblptr=NULL, .defdblval=0, TYPE_DOUBLE, 0 }, \
|
||||
@@ -320,6 +391,7 @@ typedef struct {
|
||||
channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
|
||||
uint8_t nb_rx,
|
||||
SCM_t channel_model,
|
||||
pathloss_model_t pathloss_model,
|
||||
double sampling_rate,
|
||||
uint64_t center_freq,
|
||||
double channel_bandwidth,
|
||||
@@ -333,6 +405,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
|
||||
|
||||
channel_desc_t *find_channel_desc_fromname( char *modelname );
|
||||
|
||||
int calculate_pathloss_cmd(channel_desc_t *chan_desc);
|
||||
|
||||
/**
|
||||
\brief free memory allocated for a model descriptor
|
||||
@@ -553,14 +626,14 @@ int modelid_fromstrtype(char *modeltype);
|
||||
double channelmod_get_snr_dB(void);
|
||||
double channelmod_get_sinr_dB(void);
|
||||
void init_channelmod(void) ;
|
||||
int load_channellist(uint8_t nb_tx, uint8_t nb_rx, double sampling_rate, double channel_bandwidth) ;
|
||||
int load_channellist(uint8_t nb_tx, uint8_t nb_rx, double sampling_rate, double channel_bandwidth, uint64_t fc) ;
|
||||
double N_RB2sampling_rate(uint16_t N_RB);
|
||||
double N_RB2channel_bandwidth(uint16_t N_RB);
|
||||
|
||||
/* Linear phase noise model */
|
||||
/*!
|
||||
\brief This function produce phase noise and add to input signal
|
||||
\param ts Sampling time
|
||||
\param ts Sampling time
|
||||
\param *Re *Im Real and Imag part of the signal
|
||||
*/
|
||||
//look-up table for the sine (cosine) function
|
||||
|
||||
@@ -120,6 +120,7 @@ typedef enum { SIMU_ROLE_SERVER = 1, SIMU_ROLE_CLIENT } simuRole;
|
||||
|
||||
static void getset_currentchannels_type(char *buf, int debug, webdatadef_t *tdata, telnet_printfunc_t prnt);
|
||||
extern int get_currentchannels_type(char *buf, int debug, webdatadef_t *tdata, telnet_printfunc_t prnt); // in random_channel.c
|
||||
extern void display_channelmodel(channel_desc_t *cd,int debug, telnet_printfunc_t prnt); // in randon_channel.c
|
||||
static int rfsimu_setchanmod_cmd(char *buff, int debug, telnet_printfunc_t prnt, void *arg);
|
||||
static int rfsimu_setdistance_cmd(char *buff, int debug, telnet_printfunc_t prnt, void *arg);
|
||||
static int rfsimu_getdistance_cmd(char *buff, int debug, telnet_printfunc_t prnt, void *arg);
|
||||
@@ -160,6 +161,7 @@ typedef struct {
|
||||
simuRole role;
|
||||
char *ip;
|
||||
uint16_t port;
|
||||
uint64_t fc; //center frequency
|
||||
int saveIQfile;
|
||||
buffer_t buf[MAX_FD_RFSIMU];
|
||||
int rx_num_channels;
|
||||
@@ -167,6 +169,7 @@ typedef struct {
|
||||
double sample_rate;
|
||||
double tx_bw;
|
||||
int channelmod;
|
||||
int pathlossmod;
|
||||
double chan_pathloss;
|
||||
double chan_forgetfact;
|
||||
int chan_offset;
|
||||
@@ -354,7 +357,7 @@ static void rfsimulator_readconfig(rfsimulator_state_t *rfsimulator) {
|
||||
break;
|
||||
} else if (strcmp(rfsimu_params[p].strlistptr[i],"chanmod") == 0) {
|
||||
init_channelmod();
|
||||
load_channellist(rfsimulator->tx_num_channels, rfsimulator->rx_num_channels, rfsimulator->sample_rate, rfsimulator->tx_bw);
|
||||
load_channellist(rfsimulator->tx_num_channels, rfsimulator->rx_num_channels, rfsimulator->sample_rate, rfsimulator->tx_bw, rfsimulator->fc);
|
||||
rfsimulator->channelmod=true;
|
||||
} else {
|
||||
fprintf(stderr, "unknown rfsimulator option: %s\n", rfsimu_params[p].strlistptr[i]);
|
||||
@@ -411,6 +414,7 @@ static int rfsimu_setchanmod_cmd(char *buff, int debug, telnet_printfunc_t prnt,
|
||||
channel_desc_t *newmodel = new_channel_desc_scm(t->tx_num_channels,
|
||||
t->rx_num_channels,
|
||||
channelmod,
|
||||
t->pathlossmod,
|
||||
t->sample_rate,
|
||||
0,
|
||||
t->tx_bw,
|
||||
@@ -567,6 +571,9 @@ static int rfsimu_setdistance_cmd(char *buff, int debug, telnet_printfunc_t prnt
|
||||
const int nbTx = cd->nb_tx;
|
||||
prnt(" %s: Modifying model %s...\n", __func__, modelname);
|
||||
rfsimu_offset_change_cirBuf(b->circularBuf, t->nextRxTstamp, CirSize, old_offset, new_offset, nbTx);
|
||||
cd->pathloss_model_var.d_2d = new_distance;
|
||||
calculate_pathloss_cmd(cd);
|
||||
display_channelmodel(cd,debug,prnt);
|
||||
}
|
||||
|
||||
free(modelname);
|
||||
@@ -1077,7 +1084,8 @@ int device_init(openair0_device *device, openair0_config_t *openair0_cfg) {
|
||||
rfsimulator->tx_num_channels=openair0_cfg->tx_num_channels;
|
||||
rfsimulator->rx_num_channels=openair0_cfg->rx_num_channels;
|
||||
rfsimulator->sample_rate=openair0_cfg->sample_rate;
|
||||
rfsimulator->tx_bw=openair0_cfg->tx_bw;
|
||||
rfsimulator->fc=openair0_cfg->tx_freq[0];
|
||||
rfsimulator->tx_bw=openair0_cfg->tx_bw;
|
||||
rfsimulator_readconfig(rfsimulator);
|
||||
LOG_W(HW, "sample_rate %f\n", rfsimulator->sample_rate);
|
||||
pthread_mutex_init(&Sockmutex, NULL);
|
||||
|
||||
@@ -0,0 +1,334 @@
|
||||
Active_gNBs = ( "gNB-OAI");
|
||||
# Asn1_verbosity, choice in: none, info, annoying
|
||||
Asn1_verbosity = "none";
|
||||
|
||||
gNBs =
|
||||
(
|
||||
{
|
||||
////////// Identification parameters:
|
||||
gNB_ID = 0xe00;
|
||||
gNB_name = "gNB-OAI";
|
||||
|
||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||
tracking_area_code = 1;
|
||||
plmn_list = ({ mcc = 001; mnc = 01; mnc_length = 2; snssaiList = ({ sst = 1; }) });
|
||||
|
||||
nr_cellid = 12345678L;
|
||||
|
||||
////////// Physical parameters:
|
||||
|
||||
do_CSIRS = 1;
|
||||
do_SRS = 1;
|
||||
|
||||
pdcch_ConfigSIB1 = (
|
||||
{
|
||||
controlResourceSetZero = 12;
|
||||
searchSpaceZero = 0;
|
||||
});
|
||||
|
||||
servingCellConfigCommon = (
|
||||
{
|
||||
#spCellConfigCommon
|
||||
|
||||
physCellId = 0;
|
||||
|
||||
# downlinkConfigCommon
|
||||
#frequencyInfoDL
|
||||
# this is 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP)
|
||||
absoluteFrequencySSB = 641280;
|
||||
dl_frequencyBand = 78;
|
||||
# this is 3600 MHz
|
||||
dl_absoluteFrequencyPointA = 640008;
|
||||
#scs-SpecificCarrierList
|
||||
dl_offstToCarrier = 0;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
dl_subcarrierSpacing = 1;
|
||||
dl_carrierBandwidth = 106;
|
||||
#initialDownlinkBWP
|
||||
#genericParameters
|
||||
# this is RBstart=27,L=48 (275*(L-1))+RBstart
|
||||
initialDLBWPlocationAndBandwidth = 28875; # 6366 12925 12956 28875 12952
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
initialDLBWPsubcarrierSpacing = 1;
|
||||
#pdcch-ConfigCommon
|
||||
initialDLBWPcontrolResourceSetZero = 12;
|
||||
initialDLBWPsearchSpaceZero = 0;
|
||||
|
||||
#uplinkConfigCommon
|
||||
#frequencyInfoUL
|
||||
ul_frequencyBand = 78;
|
||||
#scs-SpecificCarrierList
|
||||
ul_offstToCarrier = 0;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
ul_subcarrierSpacing = 1;
|
||||
ul_carrierBandwidth = 106;
|
||||
pMax = 20;
|
||||
#initialUplinkBWP
|
||||
#genericParameters
|
||||
initialULBWPlocationAndBandwidth = 28875;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
initialULBWPsubcarrierSpacing = 1;
|
||||
#rach-ConfigCommon
|
||||
#rach-ConfigGeneric
|
||||
prach_ConfigurationIndex = 98;
|
||||
#prach_msg1_FDM
|
||||
#0 = one, 1=two, 2=four, 3=eight
|
||||
prach_msg1_FDM = 0;
|
||||
prach_msg1_FrequencyStart = 0;
|
||||
zeroCorrelationZoneConfig = 13;
|
||||
preambleReceivedTargetPower = -96;
|
||||
#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
|
||||
preambleTransMax = 6;
|
||||
#powerRampingStep
|
||||
# 0=dB0,1=dB2,2=dB4,3=dB6
|
||||
powerRampingStep = 1;
|
||||
#ra_ReponseWindow
|
||||
#1,2,4,8,10,20,40,80
|
||||
ra_ResponseWindow = 4;
|
||||
#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
|
||||
#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
|
||||
ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 4;
|
||||
#oneHalf (0..15) 4,8,12,16,...60,64
|
||||
ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 14;
|
||||
#ra_ContentionResolutionTimer
|
||||
#(0..7) 8,16,24,32,40,48,56,64
|
||||
ra_ContentionResolutionTimer = 7;
|
||||
rsrp_ThresholdSSB = 19;
|
||||
#prach-RootSequenceIndex_PR
|
||||
#1 = 839, 2 = 139
|
||||
prach_RootSequenceIndex_PR = 2;
|
||||
prach_RootSequenceIndex = 1;
|
||||
# SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
|
||||
#
|
||||
msg1_SubcarrierSpacing = 1,
|
||||
# restrictedSetConfig
|
||||
# 0=unrestricted, 1=restricted type A, 2=restricted type B
|
||||
restrictedSetConfig = 0,
|
||||
|
||||
msg3_DeltaPreamble = 1;
|
||||
p0_NominalWithGrant =-90;
|
||||
|
||||
# pucch-ConfigCommon setup :
|
||||
# pucchGroupHopping
|
||||
# 0 = neither, 1= group hopping, 2=sequence hopping
|
||||
pucchGroupHopping = 0;
|
||||
hoppingId = 40;
|
||||
p0_nominal = -90;
|
||||
# ssb_PositionsInBurs_BitmapPR
|
||||
# 1=short, 2=medium, 3=long
|
||||
ssb_PositionsInBurst_PR = 2;
|
||||
ssb_PositionsInBurst_Bitmap = 1;
|
||||
|
||||
# ssb_periodicityServingCell
|
||||
# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
|
||||
ssb_periodicityServingCell = 2;
|
||||
|
||||
# dmrs_TypeA_position
|
||||
# 0 = pos2, 1 = pos3
|
||||
dmrs_TypeA_Position = 0;
|
||||
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
subcarrierSpacing = 1;
|
||||
|
||||
|
||||
#tdd-UL-DL-ConfigurationCommon
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
referenceSubcarrierSpacing = 1;
|
||||
# pattern1
|
||||
# dl_UL_TransmissionPeriodicity
|
||||
# 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
|
||||
dl_UL_TransmissionPeriodicity = 6;
|
||||
nrofDownlinkSlots = 7;
|
||||
nrofDownlinkSymbols = 6;
|
||||
nrofUplinkSlots = 2;
|
||||
nrofUplinkSymbols = 4;
|
||||
|
||||
ssPBCH_BlockPower = -25;
|
||||
}
|
||||
|
||||
);
|
||||
|
||||
|
||||
# ------- SCTP definitions
|
||||
SCTP :
|
||||
{
|
||||
# Number of streams to use in input/output
|
||||
SCTP_INSTREAMS = 2;
|
||||
SCTP_OUTSTREAMS = 2;
|
||||
};
|
||||
|
||||
|
||||
////////// AMF parameters:
|
||||
amf_ip_address = ( { ipv4 = "192.168.70.132";
|
||||
ipv6 = "192:168:30::17";
|
||||
active = "yes";
|
||||
preference = "ipv4";
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
NETWORK_INTERFACES :
|
||||
{
|
||||
GNB_INTERFACE_NAME_FOR_NG_AMF = "demo-oai";
|
||||
GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.70.129/24";
|
||||
GNB_INTERFACE_NAME_FOR_NGU = "demo-oai";
|
||||
GNB_IPV4_ADDRESS_FOR_NGU = "192.168.70.129/24";
|
||||
GNB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||
};
|
||||
|
||||
}
|
||||
);
|
||||
|
||||
MACRLCs = (
|
||||
{
|
||||
num_cc = 1;
|
||||
tr_s_preference = "local_L1";
|
||||
tr_n_preference = "local_RRC";
|
||||
pusch_TargetSNRx10 = 150;
|
||||
pucch_TargetSNRx10 = 200;
|
||||
ulsch_max_frame_inactivity = 0;
|
||||
ul_max_mcs = 28;
|
||||
}
|
||||
);
|
||||
|
||||
L1s = (
|
||||
{
|
||||
num_cc = 1;
|
||||
tr_n_preference = "local_mac";
|
||||
prach_dtx_threshold = 120;
|
||||
pucch0_dtx_threshold = 100;
|
||||
ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
|
||||
}
|
||||
);
|
||||
|
||||
RUs = (
|
||||
{
|
||||
local_rf = "yes"
|
||||
nb_tx = 1
|
||||
nb_rx = 1
|
||||
att_tx = 12;
|
||||
att_rx = 12;
|
||||
bands = [78];
|
||||
max_pdschReferenceSignalPower = -27;
|
||||
max_rxgain = 114;
|
||||
eNB_instances = [0];
|
||||
#beamforming 1x4 matrix:
|
||||
bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000];
|
||||
clock_src = "internal";
|
||||
}
|
||||
);
|
||||
|
||||
THREAD_STRUCT = (
|
||||
{
|
||||
#three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
|
||||
parallel_config = "PARALLEL_SINGLE_THREAD";
|
||||
#two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
|
||||
worker_config = "WORKER_ENABLE";
|
||||
}
|
||||
);
|
||||
|
||||
rfsimulator :
|
||||
{
|
||||
serveraddr = "server";
|
||||
serverport = "4043";
|
||||
options = "chanmod"; #("saviq"); or/and "chanmod"
|
||||
modelname = "AWGN";
|
||||
IQfile = "/tmp/rfsimulator.iqs";
|
||||
};
|
||||
|
||||
security = {
|
||||
# preferred ciphering algorithms
|
||||
# the first one of the list that an UE supports in chosen
|
||||
# valid values: nea0, nea1, nea2, nea3
|
||||
ciphering_algorithms = ( "nea0" );
|
||||
|
||||
# preferred integrity algorithms
|
||||
# the first one of the list that an UE supports in chosen
|
||||
# valid values: nia0, nia1, nia2, nia3
|
||||
integrity_algorithms = ( "nia2", "nia0" );
|
||||
|
||||
# setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter
|
||||
# what 'ciphering_algorithms' configures; same thing for 'drb_integrity'
|
||||
drb_ciphering = "yes";
|
||||
drb_integrity = "no";
|
||||
};
|
||||
|
||||
channelmod = {
|
||||
max_chan=10;
|
||||
modellist="modellist_rfsimu_1";
|
||||
modellist_rfsimu_1 = (
|
||||
{
|
||||
model_name = "rfsimu_channel_enB0"
|
||||
type = "AWGN";
|
||||
ploss_dB = 0;
|
||||
noise_power_dB = -10;
|
||||
forgetfact = 0;
|
||||
offset = 0;
|
||||
ds_tdl = 0;
|
||||
},
|
||||
{
|
||||
model_name = "rfsimu_channel_ue0"
|
||||
type = "AWGN";
|
||||
ploss_dB = 0;
|
||||
noise_power_dB = -10;
|
||||
forgetfact = 0;
|
||||
offset = 0;
|
||||
ds_tdl = 0;
|
||||
}
|
||||
);
|
||||
modellist_rfsimu_2 = (
|
||||
{
|
||||
model_name = "rfsimu_channel_ue0"
|
||||
type = "AWGN";
|
||||
ploss_dB = 0;
|
||||
noise_power_dB = 0;
|
||||
forgetfact = 0;
|
||||
offset = 0;
|
||||
ds_tdl = 0;
|
||||
},
|
||||
{
|
||||
model_name = "rfsimu_channel_ue1"
|
||||
type = "AWGN";
|
||||
ploss_dB = 0;
|
||||
noise_power_dB = 0;
|
||||
forgetfact = 0;
|
||||
offset = 0;
|
||||
ds_tdl = 0;
|
||||
},
|
||||
{
|
||||
model_name = "rfsimu_channel_ue2"
|
||||
type = "AWGN";
|
||||
ploss_dB = 0;
|
||||
noise_power_dB = 0;
|
||||
forgetfact = 0;
|
||||
offset = 0;
|
||||
ds_tdl = 0;
|
||||
}
|
||||
);
|
||||
};
|
||||
|
||||
|
||||
log_config :
|
||||
{
|
||||
global_log_level ="info";
|
||||
hw_log_level ="info";
|
||||
phy_log_level ="info";
|
||||
mac_log_level ="info";
|
||||
rlc_log_level ="info";
|
||||
pdcp_log_level ="info";
|
||||
rrc_log_level ="info";
|
||||
ngap_log_level ="debug";
|
||||
f1ap_log_level ="debug";
|
||||
};
|
||||
|
||||
e2_agent = {
|
||||
near_ric_ip_addr = "127.0.0.1";
|
||||
#sm_dir = "/path/where/the/SMs/are/located/"
|
||||
sm_dir = "/usr/local/lib/flexric/"
|
||||
};
|
||||
76
targets/PROJECTS/GENERIC-NR-5GC/CONF/ue_AWGN.conf
Normal file
76
targets/PROJECTS/GENERIC-NR-5GC/CONF/ue_AWGN.conf
Normal file
@@ -0,0 +1,76 @@
|
||||
uicc0 = {
|
||||
imsi = "001010000000001";
|
||||
key = "fec86ba6eb707ed08905757b1bb44b8f";
|
||||
opc= "C42449363BBAD02B66D16BC975D77CC1";
|
||||
dnn= "oai";
|
||||
nssai_sst=1;
|
||||
nssai_sd=0xffffff;
|
||||
}
|
||||
|
||||
channelmod = {
|
||||
max_chan=10;
|
||||
modellist="modellist_rfsimu_1";
|
||||
modellist_rfsimu_1 = (
|
||||
{
|
||||
model_name = "rfsimu_channel_enB0"
|
||||
type = "AWGN";
|
||||
ploss_dB = 0;
|
||||
noise_power_dB = -10;
|
||||
forgetfact = 0;
|
||||
offset = 0;
|
||||
ds_tdl = 0;
|
||||
},
|
||||
{
|
||||
model_name = "rfsimu_channel_ue0"
|
||||
type = "AWGN";
|
||||
ploss_dB = 0;
|
||||
noise_power_dB = -10;
|
||||
forgetfact = 0;
|
||||
offset = 0;
|
||||
ds_tdl = 0;
|
||||
}
|
||||
);
|
||||
modellist_rfsimu_2 = (
|
||||
{
|
||||
model_name = "rfsimu_channel_ue0"
|
||||
type = "AWGN";
|
||||
ploss_dB = 0;
|
||||
noise_power_dB = 0;
|
||||
forgetfact = 0;
|
||||
offset = 0;
|
||||
ds_tdl = 0;
|
||||
},
|
||||
{
|
||||
model_name = "rfsimu_channel_ue1"
|
||||
type = "AWGN";
|
||||
ploss_dB = 0;
|
||||
noise_power_dB = 0;
|
||||
forgetfact = 0;
|
||||
offset = 0;
|
||||
ds_tdl = 0;
|
||||
},
|
||||
{
|
||||
model_name = "rfsimu_channel_ue2"
|
||||
type = "AWGN";
|
||||
ploss_dB = 0;
|
||||
noise_power_dB = 0;
|
||||
forgetfact = 0;
|
||||
offset = 0;
|
||||
ds_tdl = 0;
|
||||
}
|
||||
);
|
||||
};
|
||||
|
||||
log_config :
|
||||
{
|
||||
global_log_level ="info";
|
||||
hw_log_level ="info";
|
||||
phy_log_level ="critical";
|
||||
mac_log_level ="critical";
|
||||
rlc_log_level ="critical";
|
||||
pdcp_log_level ="critical";
|
||||
rrc_log_level ="critical";
|
||||
ngap_log_level ="critical";
|
||||
f1ap_log_level ="critical";
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user