Compare commits

..

2 Commits

Author SHA1 Message Date
mir
aca2d708ac Avoid -Werror 2023-10-30 13:02:51 +01:00
mir
951eaba61a Generate better assembler as the previous version's code generation was considerably suboptimal 2023-10-30 13:02:51 +01:00
8 changed files with 99 additions and 987 deletions

View File

@@ -23,6 +23,10 @@
#include "PHY/NR_REFSIG/nr_mod_table.h"
#include "executables/softmodem-common.h"
#if defined(__SSE2__)
#include <immintrin.h>
#endif
//Table 6.3.1.5-1 Precoding Matrix W 1 layer 2 antenna ports 'n' = -1 and 'o' = -j
const char nr_W_1l_2p[6][2][1] = {
{{'1'}, {'0'}}, // pmi 0
@@ -110,6 +114,52 @@ const char nr_W_4l_4p[5][4][4] = {
{{'1', '1', '1', '1'}, {'1', 'n', '1', 'n'}, {'j', 'j', 'o', 'o'}, {'j', 'o', 'o', 'j'}} // pmi 4
};
#if defined(__SSE2__)
static
__m256i unpack12to16(const uint8_t *addr)
{
// It start loading from addr-4. It consumes 24 bytes starting from addr
// Don't use this for the first vector of a page-aligned array, or the last
__m256i v = _mm256_loadu_si256( (const __m256i*)(addr-4) );
// v = [ x H G F E | D C B A x ] where each letter is a 3-byte pair of two 12-bytes fields, and x is 4 bytes of garbage we load but ignore
// From 3 bytes, expand to 4 bytes i.e., 4,5,6 -> 4,5,5,6
const __m256i bytegrouping =
_mm256_setr_epi8(4,5, 5,6, 7,8, 8,9, 10,11, 11,12, 13,14, 14,15, // low half uses last 12B
0,1, 1,2, 3,4, 4,5, 6,7, 7,8, 9,10, 10,11); // high half uses first 12B
//
v = _mm256_shuffle_epi8(v, bytegrouping);
// each 16-bit chunk has the bits it needs, but not in the right position
// in each chunk of 8 nibbles (4 bytes): e.g., 4,5,5,6 -> [ f e d c | d c b a ]
__m256i hi = _mm256_srli_epi16(v, 4); // [ 0 f e d | xxxx ]
__m256i lo = _mm256_and_si256(v, _mm256_set1_epi32(0x00000FFF)); // [ 0000 | 0 c b a ]
return _mm256_blend_epi16(lo, hi, 0b10101010);
// nibbles in each pair of epi16: [ 0 f e d | 0 c b a ]
}
/*
// consumes 24 bytes starting at addr.
static
__m256i unpack6to8(const uint8_t *addr)
{
__m256i const v = unpack12to16(addr); // [ 0000 cccc | ccaa aaaa] in every epi16 bits positions
__m256i const m0 = _mm256_set1_epi16(0b00000000000111111);
__m256i const lo = v & m0; // [ 0000 0000 | 00aa aaaa ]
__m256i const hi = _mm256_slli_epi16(v, 2); // [ 00cc cccc | aaaa aa00 ]
__m256i const m1 = _mm256_set1_epi16(0xFF00);
return _mm256_blendv_epi8(lo, hi, m1); // [00cc cccc | 00aa aaaa]
}
*/
#endif
void nr_modulation(uint32_t *in,
uint32_t length,
uint16_t mod_order,
@@ -119,7 +169,9 @@ void nr_modulation(uint32_t *in,
int32_t* nr_mod_table32;
int32_t* out32 = (int32_t*) out;
uint8_t* in_bytes = (uint8_t*) in;
#ifndef __SSE2__
uint64_t* in64 = (uint64_t*) in;
#endif
int64_t* out64 = (int64_t*) out;
uint32_t i;
@@ -171,6 +223,15 @@ void nr_modulation(uint32_t *in,
return;
case 6:
#if defined(__SSE2__)
for(i =0 ; i < length - 3 * 64; i += 3 * 64 ){
// Consume 24 bytes and unpack them in 32 bytes.
__m256i const v = unpack12to16((uint8_t*)&in[i/8]);
for(int j = 0; j < 16; ++j){
*out64++ = nr_64qam_mod_table[((int16_t*)&v)[j]];
}
}
#else
for (i = 0; i < length - 3 * 64; i += 3 * 64) {
uint64_t x = *in64++;
uint64_t x1 = x & 0xfff;
@@ -212,6 +273,7 @@ void nr_modulation(uint32_t *in,
x2 = ((x>>52)&0xff0) | (x2>>60);
*out64++ = nr_64qam_mod_table[x2];
}
#endif
while (i + 24 <= length) {
uint32_t xx = 0;
memcpy(&xx, in_bytes + i / 8, 3);

View File

@@ -21,7 +21,7 @@
#include "nr_refsig.h"
#include "nr_mod_table.h"
short nr_qpsk_mod_table[8];
int16_t nr_qpsk_mod_table[8];
int32_t nr_16qam_mod_table[16];
simde__m128i nr_qpsk_byte_mod_table[2048];
@@ -39,57 +39,57 @@ void nr_generate_modulation_table() {
float sqrt170 = 0.076696;
float val = 32768.0;
uint32_t i,j;
short* table;
int16_t* table;
// QPSK
for (i=0; i<4; i++) {
nr_qpsk_mod_table[i*2] = (short)(1-2*(i&1))*val*sqrt2*sqrt2;
nr_qpsk_mod_table[i*2+1] = (short)(1-2*((i>>1)&1))*val*sqrt2*sqrt2;
nr_qpsk_mod_table[i*2] = (int16_t)(1-2*(i&1))*val*sqrt2*sqrt2;
nr_qpsk_mod_table[i*2+1] = (int16_t)(1-2*((i>>1)&1))*val*sqrt2*sqrt2;
//printf("%d j%d\n",nr_qpsk_mod_table[i*2],nr_qpsk_mod_table[i*2+1]);
}
//QPSK m128
table = (short*) nr_qpsk_byte_mod_table;
table = (int16_t*) nr_qpsk_byte_mod_table;
for (i=0; i<256; i++) {
for (j=0; j<4; j++) {
table[i*8+(j*2)] = (short)(1-2*((i>>(j*2))&1))*val*sqrt2*sqrt2;
table[i*8+(j*2)+1] = (short)(1-2*((i>>(j*2+1))&1))*val*sqrt2*sqrt2;
table[i*8+(j*2)] = (int16_t)(1-2*((i>>(j*2))&1))*val*sqrt2*sqrt2;
table[i*8+(j*2)+1] = (int16_t)(1-2*((i>>(j*2+1))&1))*val*sqrt2*sqrt2;
//printf("%d j%d\n",nr_qpsk_byte_mod_table[i*8+(j*2)],nr_qpsk_byte_mod_table[i*8+(j*2)+1]);
}
}
//16QAM
table = (short*) nr_16qam_byte_mod_table;
table = (int16_t*) nr_16qam_byte_mod_table;
for (i=0; i<256; i++) {
for (j=0; j<2; j++) {
table[i*4+(j*2)] = (short)((1-2*((i>>(j*4))&1))*(2-(1-2*((i>>(j*4+2))&1))))*val*sqrt10*sqrt2;
table[i*4+(j*2)+1] = (short)((1-2*((i>>(j*4+1))&1))*(2-(1-2*((i>>(j*4+3))&1))))*val*sqrt10*sqrt2;
table[i*4+(j*2)] = (int16_t)((1-2*((i>>(j*4))&1))*(2-(1-2*((i>>(j*4+2))&1))))*val*sqrt10*sqrt2;
table[i*4+(j*2)+1] = (int16_t)((1-2*((i>>(j*4+1))&1))*(2-(1-2*((i>>(j*4+3))&1))))*val*sqrt10*sqrt2;
//printf("%d j%d\n",nr_16qam_byte_mod_table[i*4+(j*2)],nr_16qam_byte_mod_table[i*4+(j*2)+1]);
}
}
table = (short*) nr_16qam_mod_table;
table = (int16_t*) nr_16qam_mod_table;
for (i=0; i<16; i++) {
table[i*2] = (short)((1-2*(i&1))*(2-(1-2*((i>>2)&1))))*val*sqrt10*sqrt2;
table[i*2+1] = (short)((1-2*((i>>1)&1))*(2-(1-2*((i>>3)&1))))*val*sqrt10*sqrt2;
table[i*2] = (int16_t)((1-2*(i&1))*(2-(1-2*((i>>2)&1))))*val*sqrt10*sqrt2;
table[i*2+1] = (int16_t)((1-2*((i>>1)&1))*(2-(1-2*((i>>3)&1))))*val*sqrt10*sqrt2;
//printf("%d j%d\n",table[i*2],table[i*2+1]);
}
//64QAM
table = (short*) nr_64qam_mod_table;
table = (int16_t*) nr_64qam_mod_table;
for (i=0; i<4096; i++) {
for (j=0; j<2; j++) {
table[i*4+(j*2)] = (short)((1-2*((i>>(j*6))&1))*(4-(1-2*((i>>(j*6+2))&1))*(2-(1-2*((i>>(j*6+4))&1)))))*val*sqrt42*sqrt2;
table[i*4+(j*2)+1] = (short)((1-2*((i>>(j*6+1))&1))*(4-(1-2*((i>>(j*6+3))&1))*(2-(1-2*((i>>(j*6+5))&1)))))*val*sqrt42*sqrt2;
table[i*4+(j*2)] = (int16_t)((1-2*((i>>(j*6))&1))*(4-(1-2*((i>>(j*6+2))&1))*(2-(1-2*((i>>(j*6+4))&1)))))*val*sqrt42*sqrt2;
table[i*4+(j*2)+1] = (int16_t)((1-2*((i>>(j*6+1))&1))*(4-(1-2*((i>>(j*6+3))&1))*(2-(1-2*((i>>(j*6+5))&1)))))*val*sqrt42*sqrt2;
//printf("%d j%d\n",table[i*4+(j*2)],table[i*4+(j*2)+1]);
}
}
//256QAM
table = (short*) nr_256qam_mod_table;
table = (int16_t*) nr_256qam_mod_table;
for (i=0; i<256; i++) {
table[i*2] = (short)((1-2*(i&1))*(8-(1-2*((i>>2)&1))*(4-(1-2*((i>>4)&1))*(2-(1-2*((i>>6)&1))))))*val*sqrt170*sqrt2;
table[i*2+1] = (short)((1-2*((i>>1)&1))*(8-(1-2*((i>>3)&1))*(4-(1-2*((i>>5)&1))*(2-(1-2*((i>>7)&1))))))*val*sqrt170*sqrt2;
table[i*2] = (int16_t)((1-2*(i&1))*(8-(1-2*((i>>2)&1))*(4-(1-2*((i>>4)&1))*(2-(1-2*((i>>6)&1))))))*val*sqrt170*sqrt2;
table[i*2+1] = (int16_t)((1-2*((i>>1)&1))*(8-(1-2*((i>>3)&1))*(4-(1-2*((i>>5)&1))*(2-(1-2*((i>>7)&1))))))*val*sqrt170*sqrt2;
}
}

View File

@@ -46,11 +46,6 @@ 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);
@@ -85,182 +80,6 @@ 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,
@@ -747,7 +566,6 @@ 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,
@@ -802,8 +620,6 @@ 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:
@@ -1414,7 +1230,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
nb_taps = 1;
Td = 0;
channel_length = 1;
ricean_factor = 1;
ricean_factor = 0.0;
aoa = .03;
maxDoppler = 0;
fill_channel_desc(chan_desc,nb_tx,
@@ -2176,12 +1992,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\",\"pathloss_model\", \"hBS\", \"hUT\", \"H\", \"W\"\n");
prnt(" <param name> can be one of \"riceanf\", \"aoa\", \"randaoa\", \"ploss\", \"noise_power_dB\", \"offset\", \"forgetf\"\n");
return CMDSTATUS_FOUND;
}
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};
static char *pnames[] = {"riceanf", "aoa", "randaoa", "ploss", "noise_power_dB", "offset", "forgetf", NULL};
static char *pformat[] = {"%lf", "%lf", "%i", "%lf", "%lf", "%i", "%lf", NULL};
int get_channel_params(char *buf, int debug, void *vdata, telnet_printfunc_t prnt)
{
if (buf == NULL) {
@@ -2243,7 +2059,7 @@ int get_channel_params(char *buf, int debug, void *vdata, telnet_printfunc_t prn
} /* get_currentchannel_type */
void display_channelmodel(channel_desc_t *cd,int debug, telnet_printfunc_t prnt) {
static 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",
@@ -2252,8 +2068,7 @@ void display_channelmodel(channel_desc_t *cd,int debug, telnet_printfunc_t prnt)
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]);
}
@@ -2340,202 +2155,6 @@ 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;
@@ -2574,14 +2193,8 @@ 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) {
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");
}
double dbl = atof(value);
defined_channels[cd_id]->path_loss_dB=dbl;
} else if ( strcmp(param,"noise_power_dB") == 0) {
double dbl = atof(value);
defined_channels[cd_id]->noise_power_dB=dbl;
@@ -2595,60 +2208,10 @@ 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 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 {
} 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);
@@ -2697,15 +2260,6 @@ 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;
}
@@ -2730,7 +2284,7 @@ void init_channelmod(void) {
} /* init_channelmod */
int load_channellist(uint8_t nb_tx, uint8_t nb_rx, double sampling_rate, double channel_bandwidth, uint64_t fc) {
int load_channellist(uint8_t nb_tx, uint8_t nb_rx, double sampling_rate, double channel_bandwidth) {
paramdef_t achannel_params[] = CHANNELMOD_MODEL_PARAMS_DESC;
paramlist_def_t channel_list;
memset(&channel_list,0,sizeof(paramlist_def_t));
@@ -2745,11 +2299,9 @@ 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");
@@ -2761,22 +2313,11 @@ 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,
fc,
0,
channel_bandwidth,
*(channel_list.paramarray[i][pindex_DT].dblptr),
0.0,

View File

@@ -22,7 +22,6 @@
#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
*@{
@@ -58,51 +57,6 @@ 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;
@@ -169,15 +123,9 @@ 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 {
@@ -310,23 +258,6 @@ 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"
@@ -340,10 +271,9 @@ 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"
@@ -354,7 +284,6 @@ 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 }, \
@@ -391,7 +320,6 @@ 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,
@@ -405,7 +333,6 @@ 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
@@ -626,14 +553,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, uint64_t fc) ;
int load_channellist(uint8_t nb_tx, uint8_t nb_rx, double sampling_rate, double channel_bandwidth) ;
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

View File

@@ -120,7 +120,6 @@ 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);
@@ -161,7 +160,6 @@ 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;
@@ -169,7 +167,6 @@ typedef struct {
double sample_rate;
double tx_bw;
int channelmod;
int pathlossmod;
double chan_pathloss;
double chan_forgetfact;
int chan_offset;
@@ -357,7 +354,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, rfsimulator->fc);
load_channellist(rfsimulator->tx_num_channels, rfsimulator->rx_num_channels, rfsimulator->sample_rate, rfsimulator->tx_bw);
rfsimulator->channelmod=true;
} else {
fprintf(stderr, "unknown rfsimulator option: %s\n", rfsimu_params[p].strlistptr[i]);
@@ -414,7 +411,6 @@ 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,
@@ -571,9 +567,6 @@ 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);
@@ -1084,8 +1077,7 @@ 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->fc=openair0_cfg->tx_freq[0];
rfsimulator->tx_bw=openair0_cfg->tx_bw;
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);

View File

@@ -1,334 +0,0 @@
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/"
};

View File

@@ -1,76 +0,0 @@
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";
};