最近有朋友问我OAI的rfsimulator怎么用,我就简单举个例子分享一下:包括如何使用rfsimulator、如何新建一个自己定义的信道。
- OAI 的rfsimulator顾名思义是用来替代真实的射频的,即当你没有USRP的时候可以在本地跑一个基站和UE来进行仿真。
用rfsimulator能做的事情:
- 使用noS1模式,仅使用接入网进行仿真,通过gNB/eNB 和 UE的“oaitun” IP隧道,进行实时通信。也可以用写好的IQ数据文件来测试收发特定的数据,详见第二节。
- 使用phy-test模式,在gNB/eNB和UE之间产生随机流量。
- 自行定义空口信道参数,包括各种衰落、时延扩展、噪声等,详见第三节。
网络拓扑:
[OAI核心网] --网线-- [OAI gNB/eNB ---- 127.0.0.1::4043 ---- OAI UE]
或部署在不同机器上:
[OAI gNB/eNB] 10.0.1.1–网线-- [OAI UE] 10.0.1.2
1、build OAI rfsimulator
和一般的接入网build步骤类似,开始build前的步骤可以参考03 - OAI接入网&OAIUE搭建过程 - 研0
区别在这一步:
./build_oai -I --eNB -x --install-system-files -w SIMU
即-w USRP 换成 -w SIMU 即可。(更多编译选项可-h查看)
哦还有–eNB可以按需换成–gNB --ue --nrue等
2、运行rfsimulator
rfsimulator会在127.0.0.1的4043端口开启一个tcp server给gNB/eNB用,UE回去连接这个端口。可以在\targets\ARCH\rfsimulator\simulator.c 中可以修改这个默认端口:
#define PORT 4043 //default TCP port for this simulator
rfsimulator也使用接入网的配置文件(毕竟就是模拟RF的),配置文件中有一个叫“rfsimulator”的specific section是给仿真器的。
运行命令基本和运行带RF时候的一样,就是需要添加额外选项。不熟悉一般带RF时候运行命令的可以参考03 - OAI接入网&OAIUE搭建过程 - 研0
2.1 基站部分:
跟运行带RF的时候只有命令行中要加上--rfsim选项的区别,所以需要一个有效的配置文件。配置文件中和rfsimulator相关的参数:
①serveraddr:UE要连接的或者基站要用作server的IP地址
②serverport:端口
③option:用逗号分隔的运行时的选项,目前支持两个:chanmod 启用特定信道模型,saviq 启用将传输的I/Q采样写入文件。默认情况下都不启用。
④modelname:信道模型,在chanmod选项启用的时候,要指明使用的信道模型的名字,默认是AWGN信道。定义/修改信道模性详见第三节。
⑤IQfile:启用saviq选项时,用来指定存储iq的文件的路径。不指定则默认是/tmp/rfsimulator.iqs
下面举两个例子,
- 如果使用5G gNB:
sudo RFSIMULATOR=server ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf --parallel-config PARALLEL_SINGLE_THREAD --rfsim --phy-test
命令行中gnb.band78.tm1.106PRB.usrpn300.conf即配置文件,--phy-test即启用产生上下行随机流量。如果要启用noS1模式的话,需要再添加--noS1和--nokrnmod 1选项:
sudo RFSIMULATOR=server ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf --parallel-config PARALLEL_SINGLE_THREAD --rfsim --phy-test --noS1 --nokrnmod 1
- 如果使用4G eNB:
sudo RFSIMULATOR=enb ./lte-softmodem -O <config file> --rfsim
2.2 UE部分:
- 如果使用5G UE:
sudo RFSIMULATOR=<TARGET_GNB_INTERFACE_ADDRESS> ./nr-uesoftmodem --rfsim --phy-test --rrc_config_path ../../../ci-scripts/rrc-files
其中,如果gNB和UE运行在一个机器上,<TARGET_GNB_INTERFACE_ADDRESS> 就是127.0.0.1,如果不在一个机器上,那就该配置为gNB所在的IP地址。如果运行在一个机器上gNB会给UE必要的RRC配置,--rrc_config_path ../../../ci-scripts/rrc-files是可以省略的。此外,运行在一台机器上的话务必确保机器性能OK。
- 如果使用4G UE:
添加一个RFSIMULATOR= <IP address>,其他跟运行4G UE一样。
sudo RFSIMULATOR=192.168.2.200 ./lte-uesoftmodem -C 2680000000 -r 50 --ue-rxgain 120 --ue-txgain 0 --ue-max-power 0 --ue-scan-carrier --nokrnmod 1
注1:如果遇到“RA not active”的问题,要记得生成有效的SIM卡:
$OPENAIR_DIR/targets/bin/conf2uedata -c $OPENAIR_DIR/openair3/NAS/TOOLS/ue_eurecom_test_sfr.conf -o
注2:使用rfsimulator的时候UE也可以用-d选项正常启动软件示波器,论文出图必备
注3:只有在不同机器上运行gNB/eNB和UE的时候才能使用iperf灌包。一些测试命令的例子:
#from gNB mchine:
ping -I oaitun_enb1 10.0.1.2
#from nrUE mchine:
ping -I oaitun_ue1 10.0.1.1
#Server nrUE machine:
iperf -s -i 1 -u -B 10.0.1.2
#Client gNB machine:
iperf -c 10.0.1.2 -u -b 0.1M --bind 10.0.1.1
#Server gNB machine:
iperf -s -i 1 -u -B 10.0.1.1
#Client nrUE machine:
iperf -c 10.0.1.1 -u -b 0.1M --bind 10.0.1.2
3、使用rfsimulator
3.1 Replay
启用saviq选项的时候rfsimulator会存储收发到的I/Q文件,想要replay的话,需要额外编译make replay_node
然后就可以使用replay_node这个程序来作为数据源向基站或者UE发送。(我还没用过
3.2 信道仿真
到这里,才是涉及到你自己的仿真需要定义的地方。
更新:博客是两年前的了,内容依然可用,但现在(22年)新的代码中在配置文件中添加了channelmod这一个section(见/ci-scripts/conf_files/channelmod_rfsimu.conf),方便一次运行多个信道模型,在运行时候还可以通过命令随时更改,见4.0节。
首先,rfsimulator的信道模型定义在\openair1\SIMULATION\TOOLS\sim.h 的SCM_t中,是一个enum类型。
typedef enum {
custom=0,
SCM_A, //SCM:Spatial Channel Model,3GPP的空间信道模性,A和B模型rfsimulator都没有定义(毕竟没啥用…)
//……
AWGN,
Rayleigh1_orthogonal,
//……
//已经包含了AWGN,瑞利信道,莱斯信道等等
//我们可以定义一个新的,也可以直接修改已经存在的,这里以新建一个高轨卫星HoSC信道为例
myHoSC,
} SCM_t;
要添加一个新的信道模性的话,需要先在SCM_t中添加上,比如上面我新建了一个叫HoSC的信道。紧接着,在下面映射表里也加上
#define CHANNELMOD_MAP_INIT \
{
"custom",custom},\
//……
//加上我们定义的新的信道模性
{
"myHoSC", myHoSC}
{
NULL, -1}
然后,目前rfsimulator支持的参数全部定义在sim.h的channel_desc_t结构体中(desc是description的缩写),以下参数需要根据 你的模型 自己确定数值:
typedef struct {
///tx天线数 number of tx antennas
uint8_t nb_tx;
///rx天线数
uint8_t nb_rx;
///抽头数,通道模型的特征在于抽头数量、相对于第一次抽头的时间延迟、相对于最强抽头的平均功率和每个抽头的多普勒。在rfsimulator里可以理解为信道模型的多径数。
uint8_t nb_taps;
///抽头的线性幅度,抽头系数,数组。(用来表示每个多径的幅度系数)
double *amps;
///每个抽头的(相对)延迟,数组,以微秒为单位,数

本文详细介绍了如何使用OAI的rfsimulator进行无线通信仿真,包括搭建环境、运行基站和UE、自定义信道模型及参数设置,适合进行5G和4G网络研究。
最低0.47元/天 解锁文章
2040





