项目是一个从物理层到协议层到应用层的LTE系统,射频端在使用ettus公司的USRP软件无线电平台,嗯,这些就不要说太多了,说这篇文章中的重点。
FPGA端最高只支持25M的采样速率,而LTE的基带需要的是30.72M的样本速率,所以在L0到PHY之间必须有一个变采样的操作。老师思忖再三,决定还是把这个工作放到L0的PC上处理,而不是在FPGA上就变采样,貌似是在FPGA上做会对FPGA的代码改动比较大。放到L0的PC程序上处理当然没有问题,不过速度就成了必须要解决的问题。
做过变采样的同学都知道,变采样必须要有一个滤波操作,何况我们这样一个插值抽取倍数都还不算小的系统,运算量是很大的。师兄之前写了一个版本,用10000阶的滤波器进行变采样滤波,1ms的数据平均执行时间在2000多us,明显不够用。后来他使用查表、减少除法运算等等方法,把这个时间压缩到了800us,再加上我用SSE指令集再做一下并行,这个时间就压缩到220us左右了,足够满足1ms的实时操作需求。
这个版本我们就用了很久,但是后来,由于系统的需求,整个系统的延时要变的更小,而之前的一些设计就给整个系统带来了太大的延时。这个延时出现在哪儿,我们一次又一次的定位:
1、同步与数据的排队(定位了延时的产生原因,找到了解决延时的办法)
1.1 问题描述
在帧号机制完成之前,由于usrpL0和物理层的程序是两个进程,因此我们无法在两个进程中定位同一子帧。帧号机制设计好之后,我们测量并计算了一子帧数据从usrpL0接收到它,到物理层接收到它所消耗的时间,大概在2500us左右。而这一过程合理的延时最多不应该超过1200us。(其中包含数据本身的时常1000us)
1.2 问题分析
usrpL0最开始设计的时候,组帧的功能是在usrpL0实现的。后来我们发现,同步的结果(时偏)是由物理层给出的,而将同步结果传递给usrpL0进程,不仅是一种异步的处理,而且还会额外消耗系统资源,于是就把组帧功能放在了物理层。而usrpL0的机制没有改变,依然会等待一个子帧的数据量,再向上提交。
数据好像排了两次队,那么其中就有一次是多余的。usrpL0提供的一子帧长的数据是非同步的,物理层为了获取一个同步的子帧,必须要等待usrpL0向上提交包含该子帧的一整个长度为30720的数据包。如图1所示,时间轴上方是USRP提交的数据,下方左边两个箭头之间表示的是一个同步后的子帧。但是,为了获得这个子帧,物理层必须要等到USRP提交的第二个包上交,也就是下方最右边箭头指示的时间才能收到。那么下方的右边两个箭头之间的时间就是第二次排队多余的耗时。
图 1 第二次排队详解
至此,问题已经基本分析清楚了,2500us的耗时如图2所示。usrpL0等待一子帧数据之后才进行滤波,这里耗时有1ms;滤波因为是密集运算,本身受系统负载的影响,最差耗时有0.4ms;物理层的第二次排队,如上面分析的,最差情况会耗时近1ms;再加上进程间通信和其他开销0.2ms,那么总的耗时就有近2600ms了。
图2 问题分析
1.3初步方案
问题分析出来以后,大的方向就很明确了,就是减少一次排队。既然组帧功能放在了物理层,那usrpL0层的排队就可以去掉。由于usrpL0使用的U