OpenAirInterface OAI 入门教程 1
最近有不少同学发邮件问我关于OAI的问题,为了方便大家交流,我建立了一个OAI的学生讨论QQ群,群号 512786903。有兴趣的同学欢迎加入交流。
同时,我和同学建立了一个问题交流论坛,http://www.opencenter.cn,欢迎同学们在论坛上面交流问题。
OpenAirInterface(OAI),又称OpenAirInterface5g,是欧洲EURECOM组织发起并维护的一个开源SDR LTE项目。
OAI根据3GPP的标准,完全实现了LTE协议的核心网(EPC),基站(eNB)和用户(UE)三部分,目前已经支持Release 10的功能,并且在持续更新。最近,OAI组织又准备基于OAI平台搭建一套开源的SDR NB-IoT平台,非常有吸引力。
OAI的Gitlab网站在https://gitlab.eurecom.fr/oai/openairinterface5g,代码以及相应的教程都可以在这个网站上看到。但是,目前OAI还没有供用户讨论问题的论坛,只有一个邮件列表,大家可以多多在邮件列表里面提问、讨论,OAI每天都会有人回复邮件。
最近有很多同学问我OAI到底该怎么入门,这是一个涉及到LTE,Linux系统,C语言编程等多方面知识的系统。首先,Linux系统的基本知识得掌握,然后可以对着代码理解LTE协议上的内容,这可能会是一个比较好的学习方式。另外,学习OAI平台涉及到很多LTE相关的知识,看协议不是学习LTE最好的方式,推荐大家一个非常适合用来学习LTE的网站:www.sharetechnote.com.
目前开源SDR LTE平台有OAI,OpenLTE和srsLTE等,其中OAI是使用人数最多的一个。下面就给大家介绍下OAI平台一些入门相关的知识。
OAI按照3GPP协议完全实现了LTE的EPC,eNB和UE,它的整体架构基本与LTE的协议栈。
下图是OAI官方的一张结构图。可以看到左边是UE的结构图,包含PHY,MAC,RLC,PDCP,RRC和NAS等功能。但是这里强调下,由于OAI组织把开发的重点放在EPC和eNB上,UE的代码是未经调试的,所以实际使用起来非常不稳定。但是经过我们的测试,OAI UE的物理层下行还是计较稳定的。
中间是eNB的架构图,右侧是EPC。由于我主要接触的是OAI eNB和OAI UE,对EPC接触也不多,所以我主要介绍OAI的eNB和UE,即RAN部分。按照这个分类方法,OAI也把项目分成了两部分,即RAN部分和EPC部分。
下面我们看看OAI RAN部分的目录结构。其中cmake_targets是编译相关的文件夹,OAI采用CMAKE工具来生成makefile,进而编译系统,因为OAI文件较多,CMAKE是一个编译大型系统的非常高效的工具。common里面存的一些基本的工具性函数,比如数学工具,数据结构工具等。openair1里面存储的是OAI PHY主要的函数。openair2里面存储的是L2的函数,即包含MAC,RLC和PDCP等。openair3主要存储的是L3相关的函数,即跟控制平面,核心网相关的内容比较多。targets文件夹是存储一些main函数文件,配置文件,硬件驱动等的文件夹。svn2git是把SVN管理转成Git管理的文件夹,因为之前OAI一直是使用SVN进行版本管理的,去年才改成Git,平时我们基本不用关心这个文件夹。oaienv是运行OAI所需要做的一些Linux环境设置,maketags是生成ctags文件的脚本。README.txt是简单的说明。COPYING是版权相关的信息,OAI遵循GNU GPLv3版本的开源协议,就算是开源软件,大家使用的时候也得遵循相应的协议。
OAI主要有两个功能,其中一个用来仿真,一个是用来SDR实现通信系统。今天我们先介绍OAI仿真。
仿真主要是物理层各个信道的仿真以及系统级仿真。物理信道的仿真在目录openairinterface5g/openair1/SIMULATION/LTE_PHY下,包含PDSCH,PDCCH,PBCH,PRACH,PUSCH,PUCCH等信道的仿真。而系统级别的仿真在openairinterface5g/targets/SIMU/USER目录下的oaisim,oaisim包含了LTE整个协议栈的仿真,即除了物理层是假的,其它协议栈都是按照标准做的。
oaisim平台太大了,不好介绍,我以dlsim平台来给大家介绍OAI平台,就当是抛砖引玉。
DLSIM是OAI的一个物理下行链路仿真平台。DLSIM仿真平台支持FDD和TDD两种模式,支持1.25M,5M,10M和20M四种带宽,最多支持2天线。本论文所做工作都基于DLSIM仿真平台的FDD SISO模式。
DLSIM仿真平台包含了PDSCH,PCFICH,PDCCH等信道仿真,PCFICH用来指示PDCCH所占用的OFDM符号数,PDCCH用来传输DCI信息,PDSCH用来传输业务数据,RS用于信道估计。DLSIM还在时频资源上为PBCH,PSS,SSS,RS分配了时频资源,但未产生相应的数据。DLSIM平台详细的架构图如图2-1所示,图中括号中的内容是实现相应功能的函数名称。
DLSIM仿真平台主要包含两部分,第一是PDCCH部分,第二是PDSCH部分。程序首先初始化配置LTE参数,生成业务数据。接着处理DCI信息,先为PCFICH,PDCCH信道分配时频资源,再处理PDSCH信息,加入导频后送入OFDM调制器。在接收端,首先进行FFT和信道估计,信道均衡后再解调解码PDCCH信息,根据解出来的PDCCH信息再去解调解码PDSCH信息。下面我们将分别介绍DLSIM中的PDCCH信道和PDSCH信道仿真。
PDCCH承载的下行控制信息即DCI,DCI用来携带上行或者下行资源调度的相关信息,不同的DCI格式可以用来承载不同的信息。LTE(R8)里面DCI信息一共有format0,format1,format1A,format1B,format1C,format1D,format2,format2A,format3,format3A等10种,其中format1,format1A,format1B,format1C,format1D,format2,format2A可用于PDSCH资源调度。DLSIM仿真平台支持format1,format1A,format2,format2A四种DCI格式。format1,format1A,format2,format2A四种格式的DCI各自的功能和比特数如表2-1所示:
表2-1 DLSIM平台支持的DCI格式
DCI格式 |
功能 |
比特数(20M带宽) |
1 |
单码字的PDSCH分配 |
42 |
1A |
压缩格式的PDSCH分配 |
31 |
2 |
闭环MIMO操作的PDSCH分配 |
50 |
2A |
开环MIMO操作的PDSCH分配 |
46 |
以format1为例子,format1 DCI共包含42比特数据,每个比特表征的信息域表2-2所示:
表2-2 format1 DCI信息域
信息域 |
比特 |
资源分配类型 |
1 |
资源块分配 |
跟带宽有关 |
调制编码方案 |
5 |
HARQ进程号 |
4(TDD),3(FDD) |
NDI |
1 |
RV |
2 |
PUCCH的TPC命令 |
2 |
下行分配索引 |
2(TDD only) |
主函数先选择相应的DCI格式,初始化DCI信息。DCI信息确定后,DCI相应的比特信息也就确定了。然后通过generate_eNB_dlsch_params_from_dci函数把DCI信息传递给eNB,eNB根据DCI比特信息来分配PDSCH的资源,并将DCI比特信息编码调制后发送给UE。
PDCCH信道单天线下发送流程如下所示,结合DLSIM总体架构图(图2-1)可以知道每个模块对应的函数。DCI先经过CRC校验,信道编码,速率匹配变成编码比特,然后将一个子帧中所有的PDCCH信道将复用为1个数据比特流,加扰,调制,最后进行资源单元的映射。
程序先通过函数get_num_pdcch_symbols获得PDCCH所占的OFDM符号,然后再通过generate_pcfich产生PCFICH信息,经过加扰、QPSK调制后映射到发送端时频资源上。
函数crc16完成DCI信息的CRC校验。将调度和控制信息映射到DCI相应的字段后,添加16位CRC校验比特,并用相应的RNTI对校验比特进行加扰。在UE侧通过CRC校验来验证收到的PDCCH是否是自己需要的,以及接收到的PDCCH是否正确接收。
添加CRC后的信息比特会被传递给信道编码模块,在函数ccodelte_encode中对其进行咬尾卷积编码。接着在函数lte_rate_matching_cc中进行速率匹配,对编码后的比特进行选择或裁剪。之后再用小区专用扰码对速率匹配后的比特进行加扰,减少与相邻小区PDCCH混淆的可能性。QPSK调制后数据映射到发送的时频资源上。其中PDCCH被映射在每个子帧的前1-3个OFDM符号。
接收端把接收到的时域信息经过FFT之后首先会通过pdcch_extract_rbs_single函数提取PDCCH相关的符号,然后再通过pdcch_channel_compensation均衡,接着计算llr信息,解映射,解扰,解码。UE将用相应的RNTI去解扰CRC,然后进行CRC校验,如果校验成功,那么UE就知道这个信息是自己需要的。也可以进一步知道相应的DCI格式和内容。解码出DCI信息后,UE再根据DCI信息指示进一步接收业务数据。
由于PDCCH很多处理的过程跟PDSCH非常接近,所以我们对PDCCH只做简单的介绍,重点介绍PDSCH。
DLSIM中支持SCM_C信道,SCM_D信道,步行测试环境(EPA)信道,车辆测试环境(EVA)信道,典型市区(ETU)信道,多播/组播单频网络(MBSFN)信道,瑞利(Rayleigh)信道,莱斯(Rice)信道,和AWGN等信道,其中LTE协议中规定了EPA,EVA和ETU等的衰落模型。实际仿真中,我们主要用瑞利信道、莱斯信道和AWGN信道。
在DLSIM中数据过信道分为两步,首先数据与信道冲激响应做卷积,接着再加上复高斯白噪声。函数new_channel_desc_scm初始化用户选择的信道信息,函数random_channel生成信道,接着在函数multipath_channel中完成循环卷积操作。卷积之后,数据的实部和虚部分别添加一个高斯白噪声,函数gaussdouble负责产生高斯白噪声。
信道编码函数dlsch_encoding包含CRC,分段,turbo编码和速率匹配四个步骤。
crc24a函数实现的是DLSCH CRC功能,crc24a在信息比特后面添加了24bit的校验信息,接收端通过校验比特能判定接收到的信息是否有误,如果有误,可以请求重传。
lte_segmengtation实现的是DLSCH的分段功能。小于6144比特的数据不需要分段,大于6144比特的数据则需要分段,并在每段后面再添加24比特的CRC校验码。
threegpplte_turbo_encoder实现的是DLSCH turbo编码的功能。Turbo编码器由带反馈的系统卷积码以及经过交织器带反馈的系统卷积码并行级联而成。Turbo 码巧妙地将两个简单分量码通过伪随机交织器并行级联来构造具有伪随机特性的长码。
lte_rate_matching_turbo实现的是速率匹配功能。lte中turbo编码或卷积码的码率都是1/3,而实际上物理信道的码率可能不是1/3,这个时候就需要rate matching操作。速率匹配由交织器、比特合并和选择传输三部分组成,通过复杂的算法确定传输的比特数和传输的开始位置来传输数据。
dlsch_decoding完成PDSCH解码的功能。解码器的工作就是将该码字的潜在可能性尽可能大的还原出来,体现出来。当使用不同的解码算法时,得到的性能也不尽相同。笼统的说,解码算法越简单,其对应的性能就越差。DLSIM中采用的是软解调,软解调后输出的软信息送入dlsch_decoding中进行迭代译码。Turbo译码有四种常用算法:MAP,SOVA,Log-MAP,Max-log-MAP算法。DLSIM采用的是Max-log-MAP算法。
加扰函数dlsch_scrambling由扰码生成和加扰两部分组成。加扰是一种使干扰信号随机化的一种编码方式,用小区专属信息生成扰码,并与信息比特异或来实现加扰。
dlsch_unscrambling完成PDSCH解扰的功能。在发送端采用小区专用扰码序列进行加扰,接收端再解扰,只有本小区内的UE才能根据本小区的ID产生的小区专用扰码序列对接收到得本小区内的信息进行解扰,这样可以在一定程度上减小临小区间的干扰。
调制是为了提高信息传输速率而采用的一种编码方式。基带处理中,根据需要把几个比特映射成复数符号的形式。PDSCH有三种调制方式:QPSK,16QAM和64QAM,当调制阶数提高时,误码率就会增加,所以高阶调制一般应用在信道条件比较好的情况。LTE采用了自适应调制编码技术,基站根据用户瞬时信道质量状况和目前资源选择最合适的下行链路调制和编码方式,使用户达到高的数据吞吐率。
dlsch_modulation实现数据调制的功能,同时将调制后的数据映射到对应的时频资源上。映射时要避开PBCH,PSS,SSS,RS等数据已经占用的时频资源。DLSIM目前没有实现自适应调制编码,还只能根据用户的初始化配置来设置mcs。设置完成后,本次仿真过程中mcs就将保持不变。
为了提高LTE系统的译码性能,通常在LTE接收端译码前对数据解映射时采用软判决方法。软判决译码需要解调器输出表示比特取值概率的软信息,对于高阶调制信号的解调软信息,一般采用基于最大后验概率准则的对数似然比(LLR)算法计算得到。由于算法涉及复杂的指数与对数运算,不利于实现,因此DLSIM平台里面采用了一种简化的算法来计算LLR信息。在LTE(release 8)下行链路中,提供了3种不用类型的参考信号:
l UE专用的参考信号, 内嵌在数据中,针对专门UE,也可以用于支持动态波束赋形;
l MBSFN参考信号,是指小区在下行MBSFN子帧中全频带广播发送的参考信号,可以用作对广播/多播业务情况下的下行测量、同步以及数据解调的参考信号;
l 小区专用参考信号,指的是在小区所有的下行普通子帧中广播发送的参考信号,该信号以小区为单位,可以作为小区内用户进行下行测量、同步以及数据解调的参考符号。
generate_pilots实现的是插入参考信号的功能。在接收端函数lte_dl_cell_spec_rx将发送的参考信号取共轭,这样便于便做信道估计,详细内容会在信道估计信道均衡的算法解析里介绍。
在LTE系统里面,不同系统带宽下对应不同的FFT点数,具体对应关系表2-3所示:
表2-3 LTE FFT点数对应表
系统带宽 |
1.4MHz |
3MHz |
5MHz |
10MHz |
15MHz |
20MHz |
RB数目 |
6 |
15 |
25 |
50 |
75 |
100 |
子载波数 |
72 |
180 |
300 |
600 |
900 |
1200 |
FFT点数 |
128 |
256 |
512 |
1024 |
1536 |
2048 |
例如在5M带宽下对应512点FFT,所以在OFDM模块,需要对传进来的符号做512点的IFFT。同样地,在接收端要对接收到的数据做512点的FFT。do_OFDM_mod_l实现的是DLSIM OFDM调制的功能,它有两个功能,一是IFFT,二是添加循环CP。
在接收端,把接收到的数据移除CP后做FFT完成OFDM的解调。dft函数指针指向完成FFT功能的函数,实现FFT功能的函数是用SSE指令集编写的。
无线通信系统的性能很大程度上受到无线信道的影响,如阴影衰落和频率选择性衰落等等,使得发射机和接收机之间的传播路径非常复杂。在OFDM系统的相干检测中需要对信道进行估计,信道估计的精度将直接影响整个系统的性能。基于参考信号的估计算法按一定估计准则确定待估参数,其特点是需要借助参考信号。
DLSIM采用的是基于参考信号的估计算法。基于导频符号的信道估计适用于连续传输的系统。通过在发送的有用数据中插入已知的导频符号,可以得到导频位置的信道估计结果;接着利用导频位置的信道估计结果,通过内插得到有用数据位置的信道估计结果,完成信道估计。
常用的信道估计算法有LS算法,奇异值分解(SVD)算法,基于DCT变换算法,MMSE算法等。DLSIM中函数lte_dl_channel_estimation采用最简单的LS算法估计参考信号经历的信道,再利用线性滤波插值法估计整个OFDM符号所经历的信道。函数dlsch_channel_compensation采用频域迫零均衡算法对接收到的数据进行均衡。
下行时频资源上有PDSCH,PDCCH,PCFICH,PHARQ,PBCH,PSS,SSS,RS等数据,而PDSCH信道只需要处理业务数据,所以函数dlsch_extract_rbs_single的功能就是剔除虚子载波,只提取出PDSCH信道传输的数据。
OAI的内容太多,入门不易,今天就先分享这些,以后SDR实现部分内容再慢慢分享。
还没入门的同学也不要放弃。