add telnet commands to show and modify channel simulation parameters
This commit is contained in:
@@ -2473,8 +2473,8 @@ add_library(uescope MODULE ${XFORMS_SOURCE} ${XFORMS_SOURCE_SOFTMODEM} ${XFORMS_
|
|||||||
target_link_libraries(enbscope ${XFORMS_LIBRARIES})
|
target_link_libraries(enbscope ${XFORMS_LIBRARIES})
|
||||||
target_link_libraries(uescope ${XFORMS_LIBRARIES})
|
target_link_libraries(uescope ${XFORMS_LIBRARIES})
|
||||||
|
|
||||||
add_library(gnbscope MODULE ${XFORMS_SOURCE_NR})
|
add_library(nrscope MODULE ${XFORMS_SOURCE_NR})
|
||||||
target_link_libraries(gnbscope ${XFORMS_LIBRARIES})
|
target_link_libraries(nrscope ${XFORMS_LIBRARIES})
|
||||||
|
|
||||||
|
|
||||||
add_library(rfsimulator MODULE
|
add_library(rfsimulator MODULE
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ UE_TIMING_TRACE="False"
|
|||||||
USRP_REC_PLAY="False"
|
USRP_REC_PLAY="False"
|
||||||
BUILD_ECLIPSE=0
|
BUILD_ECLIPSE=0
|
||||||
NR="False"
|
NR="False"
|
||||||
OPTIONAL_LIBRARIES="telnetsrv enbscope uescope msc"
|
OPTIONAL_LIBRARIES="telnetsrv enbscope uescope nrscope msc"
|
||||||
trap handle_ctrl_c INT
|
trap handle_ctrl_c INT
|
||||||
|
|
||||||
function print_help() {
|
function print_help() {
|
||||||
|
|||||||
@@ -968,7 +968,7 @@ if(!IS_SOFTMODEM_NOS1)
|
|||||||
p.argv=argv;
|
p.argv=argv;
|
||||||
p.gNB=RC.gNB[0];
|
p.gNB=RC.gNB[0];
|
||||||
p.ru=RC.ru[0];
|
p.ru=RC.ru[0];
|
||||||
load_softscope("gnb",&p);
|
load_softscope("nr",&p);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nfapi_mode != 1 && nfapi_mode != 2) {
|
if (nfapi_mode != 1 && nfapi_mode != 2) {
|
||||||
|
|||||||
@@ -152,9 +152,6 @@ char ref[128] = "internal";
|
|||||||
char channels[128] = "0";
|
char channels[128] = "0";
|
||||||
|
|
||||||
|
|
||||||
static char *parallel_config = NULL;
|
|
||||||
static char *worker_config = NULL;
|
|
||||||
|
|
||||||
int rx_input_level_dBm;
|
int rx_input_level_dBm;
|
||||||
|
|
||||||
//static int online_log_messages=0;
|
//static int online_log_messages=0;
|
||||||
@@ -764,7 +761,7 @@ int main( int argc, char **argv ) {
|
|||||||
mlockall(MCL_CURRENT | MCL_FUTURE);
|
mlockall(MCL_CURRENT | MCL_FUTURE);
|
||||||
|
|
||||||
if(IS_SOFTMODEM_DOFORMS) {
|
if(IS_SOFTMODEM_DOFORMS) {
|
||||||
load_softscope("gnb",PHY_vars_UE_g[0][0]);
|
load_softscope("nr",PHY_vars_UE_g[0][0]);
|
||||||
}
|
}
|
||||||
number_of_cards = 1;
|
number_of_cards = 1;
|
||||||
|
|
||||||
|
|||||||
@@ -26,6 +26,7 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include "nr_phy_scope.h"
|
#include "nr_phy_scope.h"
|
||||||
#include "executables/nr-softmodem-common.h"
|
#include "executables/nr-softmodem-common.h"
|
||||||
|
#include "executables/softmodem-common.h"
|
||||||
#include <forms.h>
|
#include <forms.h>
|
||||||
|
|
||||||
#define TPUT_WINDOW_LENGTH 100
|
#define TPUT_WINDOW_LENGTH 100
|
||||||
@@ -416,7 +417,7 @@ static void *scope_thread_gNB(void *arg) {
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void gnbscope_autoinit(scopeParms_t *p) {
|
void gNBinitScope(scopeParms_t *p) {
|
||||||
static scopeParms_t parms;
|
static scopeParms_t parms;
|
||||||
memcpy(&parms,p,sizeof(parms));
|
memcpy(&parms,p,sizeof(parms));
|
||||||
pthread_t forms_thread;
|
pthread_t forms_thread;
|
||||||
@@ -763,11 +764,20 @@ static void *nrUEscopeThread(void *arg) {
|
|||||||
pthread_exit((void *)arg);
|
pthread_exit((void *)arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
void nruescope_autoinit(PHY_VARS_NR_UE *ue) {
|
void nrUEinitScope(PHY_VARS_NR_UE *ue) {
|
||||||
pthread_t forms_thread;
|
pthread_t forms_thread;
|
||||||
threadCreate(&forms_thread, nrUEscopeThread, ue, "scope", -1, OAI_PRIORITY_RT_LOW);
|
threadCreate(&forms_thread, nrUEscopeThread, ue, "scope", -1, OAI_PRIORITY_RT_LOW);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void nrscope_autoinit(void *dataptr) {
|
||||||
|
AssertFatal( (IS_SOFTMODEM_GNB_BIT||IS_SOFTMODEM_5GUE_BIT),"Scope cannot find NRUE or GNB context");
|
||||||
|
|
||||||
|
if (IS_SOFTMODEM_GNB_BIT)
|
||||||
|
gNBinitScope(dataptr);
|
||||||
|
else
|
||||||
|
nrUEinitScope(dataptr);
|
||||||
|
}
|
||||||
// Kept to put back the functionality soon
|
// Kept to put back the functionality soon
|
||||||
#if 0
|
#if 0
|
||||||
//FD_stats_form *form_stats=NULL,*form_stats_l2=NULL;
|
//FD_stats_form *form_stats=NULL,*form_stats_l2=NULL;
|
||||||
@@ -795,6 +805,8 @@ static void reset_stats_gNB(FL_OBJECT *button,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static FD_stats_form *create_form_stats_form(int ID) {
|
static FD_stats_form *create_form_stats_form(int ID) {
|
||||||
FL_OBJECT *obj;
|
FL_OBJECT *obj;
|
||||||
FD_stats_form *fdui = calloc(( sizeof *fdui ),1);
|
FD_stats_form *fdui = calloc(( sizeof *fdui ),1);
|
||||||
|
|||||||
@@ -45,8 +45,10 @@ static mapping channelmod_names[] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static int channelmod_show_cmd(char *buff, int debug, telnet_printfunc_t prnt);
|
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);
|
||||||
static telnetshell_cmddef_t channelmod_cmdarray[] = {
|
static telnetshell_cmddef_t channelmod_cmdarray[] = {
|
||||||
{"show","",channelmod_show_cmd},
|
{"show","<predef,current>",channelmod_show_cmd},
|
||||||
|
{"modify","<channelid> <param> <value>",channelmod_modify_cmd},
|
||||||
{"","",NULL},
|
{"","",NULL},
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -56,7 +58,8 @@ static telnetshell_vardef_t channelmod_vardef[] = {
|
|||||||
|
|
||||||
static double snr_dB=25;
|
static double snr_dB=25;
|
||||||
static double sinr_dB=0;
|
static double sinr_dB=0;
|
||||||
|
static unsigned int max_chan;
|
||||||
|
static channel_desc_t** defined_channels;
|
||||||
void fill_channel_desc(channel_desc_t *chan_desc,
|
void fill_channel_desc(channel_desc_t *chan_desc,
|
||||||
uint8_t nb_tx,
|
uint8_t nb_tx,
|
||||||
uint8_t nb_rx,
|
uint8_t nb_rx,
|
||||||
@@ -281,10 +284,22 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
|
|||||||
int32_t channel_offset,
|
int32_t channel_offset,
|
||||||
double path_loss_dB) {
|
double path_loss_dB) {
|
||||||
channel_desc_t *chan_desc = (channel_desc_t *)malloc(sizeof(channel_desc_t));
|
channel_desc_t *chan_desc = (channel_desc_t *)malloc(sizeof(channel_desc_t));
|
||||||
|
for(int i=0; i<max_chan;i++) {
|
||||||
|
if (defined_channels[i] == NULL) {
|
||||||
|
defined_channels[i]=chan_desc;
|
||||||
|
chan_desc->chan_idx=i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
AssertFatal(i<(max_chan-1),
|
||||||
|
"No more channel descriptors available, increase channelmod.max_chan parameter above %u\n",max_chan);
|
||||||
|
}
|
||||||
|
}
|
||||||
uint16_t i,j;
|
uint16_t i,j;
|
||||||
double sum_amps;
|
double sum_amps;
|
||||||
double aoa,ricean_factor,Td,maxDoppler;
|
double aoa,ricean_factor,Td,maxDoppler;
|
||||||
int channel_length,nb_taps;
|
int channel_length,nb_taps;
|
||||||
|
chan_desc->modelid = channel_model;
|
||||||
chan_desc->nb_tx = nb_tx;
|
chan_desc->nb_tx = nb_tx;
|
||||||
chan_desc->nb_rx = nb_rx;
|
chan_desc->nb_rx = nb_rx;
|
||||||
chan_desc->sampling_rate = sampling_rate;
|
chan_desc->sampling_rate = sampling_rate;
|
||||||
@@ -1295,6 +1310,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
|
|||||||
|
|
||||||
void free_channel_desc_scm(channel_desc_t *ch) {
|
void free_channel_desc_scm(channel_desc_t *ch) {
|
||||||
// Must be made cleanly, a lot of leaks...
|
// Must be made cleanly, a lot of leaks...
|
||||||
|
defined_channels[ch->chan_idx]=NULL;
|
||||||
free(ch);
|
free(ch);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1408,11 +1424,11 @@ int random_channel(channel_desc_t *desc, uint8_t abstraction_flag) {
|
|||||||
desc->ch[aarx+(aatx*desc->nb_rx)][k].y = 0.0;
|
desc->ch[aarx+(aatx*desc->nb_rx)][k].y = 0.0;
|
||||||
|
|
||||||
for (l=0; l<desc->nb_taps; l++) {
|
for (l=0; l<desc->nb_taps; l++) {
|
||||||
if ((k - (desc->delays[l]*desc->sampling_rate) - NB_SAMPLES_CHANNEL_OFFSET) == 0)
|
if ((k - (desc->delays[l]*desc->sampling_rate) - desc->channel_offset) == 0)
|
||||||
s = 1.0;
|
s = 1.0;
|
||||||
else
|
else
|
||||||
s = sin(M_PI*(k - (desc->delays[l]*desc->sampling_rate) - NB_SAMPLES_CHANNEL_OFFSET))/
|
s = sin(M_PI*(k - (desc->delays[l]*desc->sampling_rate) - desc->channel_offset))/
|
||||||
(M_PI*(k - (desc->delays[l]*desc->sampling_rate) - NB_SAMPLES_CHANNEL_OFFSET));
|
(M_PI*(k - (desc->delays[l]*desc->sampling_rate) - desc->channel_offset));
|
||||||
|
|
||||||
desc->ch[aarx+(aatx*desc->nb_rx)][k].x += s*desc->a[l][aarx+(aatx*desc->nb_rx)].x;
|
desc->ch[aarx+(aatx*desc->nb_rx)][k].x += s*desc->a[l][aarx+(aatx*desc->nb_rx)].x;
|
||||||
desc->ch[aarx+(aatx*desc->nb_rx)][k].y += s*desc->a[l][aarx+(aatx*desc->nb_rx)].y;
|
desc->ch[aarx+(aatx*desc->nb_rx)][k].y += s*desc->a[l][aarx+(aatx*desc->nb_rx)].y;
|
||||||
@@ -1491,13 +1507,99 @@ double N_RB2channel_bandwidth(uint16_t N_RB) {
|
|||||||
|
|
||||||
return(channel_bandwidth);
|
return(channel_bandwidth);
|
||||||
}
|
}
|
||||||
|
static void display_channelmodel_help( telnet_printfunc_t prnt) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void display_channelmodel(channel_desc_t *cd,int debug, telnet_printfunc_t prnt) {
|
||||||
|
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",
|
||||||
|
cd->channel_length, cd->Td, cd->ricean_factor, cd->aoa, (cd->random_aoa?"Yes":"No"));
|
||||||
|
prnt("max Doppler: %lf path loss: %lf rchannel offset: %i forget factor; %lf\n",
|
||||||
|
cd->max_Doppler, cd->path_loss_dB, cd->channel_offset, cd->forgetting_factor);
|
||||||
|
prnt("Initial phase: %lf nb_path: %i \n",
|
||||||
|
cd->ip, cd->nb_paths);
|
||||||
|
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]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int channelmod_show_cmd(char *buff, int debug, telnet_printfunc_t prnt) {
|
static int channelmod_show_cmd(char *buff, int debug, telnet_printfunc_t prnt) {
|
||||||
for(int i=0; channelmod_names[i].name != NULL ; i++) {
|
char *subcmd=NULL;
|
||||||
prnt(" %i %s\n", i, map_int_to_str(channelmod_names,i ));
|
int s = sscanf(buff,"%ms\n",&subcmd);
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
if (s>0) {
|
||||||
|
if ( strcmp(subcmd,"predef") == 0) {
|
||||||
|
for (int i=0; channelmod_names[i].name != NULL ; i++) {
|
||||||
|
prnt(" %i %s\n", i, map_int_to_str(channelmod_names,i ));
|
||||||
|
}
|
||||||
|
} else if ( strcmp(subcmd,"current") == 0) {
|
||||||
|
for (int i=0; i < max_chan ; i++) {
|
||||||
|
if (defined_channels[i] != NULL) {
|
||||||
|
prnt("model %i %s: \n----------------\n", i, map_int_to_str(channelmod_names,defined_channels[i]->modelid));
|
||||||
|
display_channelmodel(defined_channels[i],debug,prnt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
display_channelmodel_help(prnt);
|
||||||
|
}
|
||||||
|
free(subcmd);
|
||||||
|
}
|
||||||
|
return CMDSTATUS_FOUND;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static int channelmod_modify_cmd(char *buff, int debug, telnet_printfunc_t prnt) {
|
||||||
|
char *param=NULL, *value=NULL;
|
||||||
|
int cd_id= -1;
|
||||||
|
int s = sscanf(buff,"%i %ms %ms \n",&cd_id,¶m, &value);
|
||||||
|
if (cd_id<0 || cd_id >= max_chan) {
|
||||||
|
prnt("ERROR, %i: Channel model id outof range (0-%i)\n",cd_id,max_chan-1);
|
||||||
|
return CMDSTATUS_FOUND;
|
||||||
|
}
|
||||||
|
if (defined_channels[cd_id]==NULL) {
|
||||||
|
prnt("ERROR, %i: Channel model has not been set\n",cd_id);
|
||||||
|
return CMDSTATUS_FOUND;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (s==3) {
|
||||||
|
if ( strcmp(param,"riceanf") == 0) {
|
||||||
|
double dbl = atof(value);
|
||||||
|
if (dbl <0 || dbl > 1)
|
||||||
|
prnt("ricean factor range: 0 to 1, %lf is outof range\n",dbl);
|
||||||
|
else
|
||||||
|
defined_channels[cd_id]->ricean_factor=dbl;
|
||||||
|
} else if ( strcmp(param,"aoa") == 0) {
|
||||||
|
double dbl = atof(value);
|
||||||
|
if (dbl <0 || dbl >6.28)
|
||||||
|
prnt("angle of arrival range: 0 to 2*Pi, %lf is outof range\n",dbl);
|
||||||
|
else
|
||||||
|
defined_channels[cd_id]->aoa=dbl;
|
||||||
|
} else if ( strcmp(param,"ploss") == 0) {
|
||||||
|
double dbl = atof(value);
|
||||||
|
defined_channels[cd_id]->path_loss_dB=dbl;
|
||||||
|
} else if ( strcmp(param,"offset") == 0) {
|
||||||
|
int i = atoi(value);
|
||||||
|
defined_channels[cd_id]->channel_offset=i;
|
||||||
|
} else if ( strcmp(param,"forgetf") == 0) {
|
||||||
|
double dbl = atof(value);
|
||||||
|
if (dbl <0 || dbl > 1)
|
||||||
|
prnt("forgetting factor range: 0 to 1 (disable variation), %lf is outof range\n",dbl);
|
||||||
|
else
|
||||||
|
defined_channels[cd_id]->forgetting_factor=dbl;
|
||||||
|
} else {
|
||||||
|
|
||||||
|
}
|
||||||
|
display_channelmodel(defined_channels[cd_id],debug,prnt);
|
||||||
|
free(param);
|
||||||
|
free(value);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return CMDSTATUS_FOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
int modelid_fromname(char *modelname) {
|
int modelid_fromname(char *modelname) {
|
||||||
@@ -1519,6 +1621,9 @@ void init_channelmod(void) {
|
|||||||
paramdef_t channelmod_params[] = CHANNELMOD_PARAMS_DESC;
|
paramdef_t channelmod_params[] = CHANNELMOD_PARAMS_DESC;
|
||||||
int ret = config_get( channelmod_params,sizeof(channelmod_params)/sizeof(paramdef_t),CHANNELMOD_SECTION);
|
int ret = config_get( channelmod_params,sizeof(channelmod_params)/sizeof(paramdef_t),CHANNELMOD_SECTION);
|
||||||
AssertFatal(ret >= 0, "configuration couldn't be performed");
|
AssertFatal(ret >= 0, "configuration couldn't be performed");
|
||||||
|
defined_channels=calloc(max_chan,sizeof( channel_desc_t*));
|
||||||
|
AssertFatal(defined_channels!=NULL, "couldn't allocate %u channel descriptors\n",max_chan);
|
||||||
|
|
||||||
/* look for telnet server, if it is loaded, add the channel modeling commands to it */
|
/* look for telnet server, if it is loaded, add the channel modeling commands to it */
|
||||||
add_telnetcmd_func_t addcmd = (add_telnetcmd_func_t)get_shlibmodule_fptr("telnetsrv", TELNET_ADDCMD_FNAME);
|
add_telnetcmd_func_t addcmd = (add_telnetcmd_func_t)get_shlibmodule_fptr("telnetsrv", TELNET_ADDCMD_FNAME);
|
||||||
|
|
||||||
|
|||||||
@@ -92,6 +92,10 @@ typedef struct {
|
|||||||
time_stats_t interp_time;
|
time_stats_t interp_time;
|
||||||
time_stats_t interp_freq;
|
time_stats_t interp_freq;
|
||||||
time_stats_t convolution;
|
time_stats_t convolution;
|
||||||
|
/// index in the channel descriptors array
|
||||||
|
unsigned int chan_idx;
|
||||||
|
/// id of the channel modeling algorithm
|
||||||
|
int modelid;
|
||||||
} channel_desc_t;
|
} channel_desc_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@@ -214,8 +218,9 @@ typedef enum {
|
|||||||
#define CONFIG_HLP_SNR "Set average SNR in dB (for --siml1 option)\n"
|
#define CONFIG_HLP_SNR "Set average SNR in dB (for --siml1 option)\n"
|
||||||
#define CHANNELMOD_SECTION "channelmod"
|
#define CHANNELMOD_SECTION "channelmod"
|
||||||
#define CHANNELMOD_PARAMS_DESC { \
|
#define CHANNELMOD_PARAMS_DESC { \
|
||||||
{"s" , CONFIG_HLP_SNR, PARAMFLAG_CMDLINE_NOPREFIXENABLED, dblptr:&snr_dB , defdblval:25, TYPE_DOUBLE, 0},\
|
{"s" , CONFIG_HLP_SNR, PARAMFLAG_CMDLINE_NOPREFIXENABLED, dblptr:&snr_dB, defdblval:25, TYPE_DOUBLE, 0},\
|
||||||
{"sinr_dB", NULL , 0 , dblptr:&sinr_dB, defdblval:0 , TYPE_DOUBLE, 0},\
|
{"sinr_dB", NULL, 0 , dblptr:&sinr_dB, defdblval:0 , TYPE_DOUBLE, 0},\
|
||||||
|
{"max_chan, CONFIG_HLP_MAX_CHAN", 0, uptr:&max_chan, defintval:10, TYPE_UINT, 0},\
|
||||||
}
|
}
|
||||||
|
|
||||||
#include "platform_constants.h"
|
#include "platform_constants.h"
|
||||||
|
|||||||
@@ -78,9 +78,11 @@ extern RAN_CONTEXT_t RC;
|
|||||||
#define RFSIMULATOR_PARAMS_DESC {\
|
#define RFSIMULATOR_PARAMS_DESC {\
|
||||||
{"serveraddr", "<ip address to connect to>\n", 0, strptr:&(rfsimulator->ip), defstrval:"127.0.0.1", TYPE_STRING, 0 },\
|
{"serveraddr", "<ip address to connect to>\n", 0, strptr:&(rfsimulator->ip), defstrval:"127.0.0.1", TYPE_STRING, 0 },\
|
||||||
{"serverport", "<port to connect to>\n", 0, u16ptr:&(rfsimulator->port), defuintval:PORT, TYPE_UINT16, 0 },\
|
{"serverport", "<port to connect to>\n", 0, u16ptr:&(rfsimulator->port), defuintval:PORT, TYPE_UINT16, 0 },\
|
||||||
{RFSIMU_OPTIONS_PARAMNAME, RFSIM_CONFIG_HELP_OPTIONS, 0, strlistptr:NULL, defstrlistval:NULL, TYPE_STRINGLIST,0},\
|
{RFSIMU_OPTIONS_PARAMNAME, RFSIM_CONFIG_HELP_OPTIONS, 0, strlistptr:NULL, defstrlistval:NULL, TYPE_STRINGLIST,0 },\
|
||||||
{"IQfile", "<file path to use when saving IQs>\n", 0, strptr:&(saveF), defstrval:"/tmp/rfsimulator.iqs",TYPE_STRING, 0 },\
|
{"IQfile", "<file path to use when saving IQs>\n", 0, strptr:&(saveF), defstrval:"/tmp/rfsimulator.iqs",TYPE_STRING, 0 },\
|
||||||
{"modelname", "<channel model name>\n", 0, strptr:&(modelname), defstrval:"AWGN", TYPE_STRING, 0 }\
|
{"modelname", "<channel model name>\n", 0, strptr:&(modelname), defstrval:"AWGN", TYPE_STRING, 0 },\
|
||||||
|
{"ploss", "<channel path loss in dB>\n", 0, dblptr:&(rfsimulator->chan_pathloss), defdblval:0, TYPE_DOUBLE, 0 },\
|
||||||
|
{"forgetfact", "<channel forget factor ((0 to 1)>\n", 0, dblptr:&(rfsimulator->chan_forgetfact), defdblval:0, TYPE_DOUBLE, 0 }\
|
||||||
};
|
};
|
||||||
|
|
||||||
pthread_mutex_t Sockmutex;
|
pthread_mutex_t Sockmutex;
|
||||||
@@ -114,6 +116,8 @@ typedef struct {
|
|||||||
double sample_rate;
|
double sample_rate;
|
||||||
double tx_bw;
|
double tx_bw;
|
||||||
int channelmod;
|
int channelmod;
|
||||||
|
double chan_pathloss;
|
||||||
|
double chan_forgetfact;
|
||||||
} rfsimulator_state_t;
|
} rfsimulator_state_t;
|
||||||
|
|
||||||
|
|
||||||
@@ -161,9 +165,9 @@ void allocCirBuf(rfsimulator_state_t *bridge, int sock) {
|
|||||||
bridge->channelmod,
|
bridge->channelmod,
|
||||||
bridge->sample_rate,
|
bridge->sample_rate,
|
||||||
bridge->tx_bw,
|
bridge->tx_bw,
|
||||||
0.0, // forgetting_factor
|
bridge->chan_forgetfact, // forgetting_factor
|
||||||
0, // maybe used for TA
|
0, // maybe used for TA
|
||||||
0); // path_loss in dB
|
bridge->chan_pathloss); // path_loss in dB
|
||||||
random_channel(ptr->channel_model,false);
|
random_channel(ptr->channel_model,false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user