usrpL0变采样滤波器的性能优化

    项目是一个从物理层到协议层到应用层的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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值