最近接触了一个软件无线电的项目,在新的硬件平台上调试openbts,就是那个开源的GSM基站。
openbts的架构很清晰,transceiver层负责提供radio部分的接口,实现数据的实时收发,然后通过socket与高层协议栈通信,所以我的大部分工作都是在transceiver层完成的。
openbts一直都是以USRP/USRP2作为底层硬件单元,这次我要用opra的板子做底层单元,原想只要继承radiodevice这个类写一个opradevice的class,把设置频率、增益和读写函数改成opra的指令就ok了,谁知道还是碰到了好多困难,第一次尝试,付出的汗水还是值得的。
熟悉设备,编写底层的device各个函数接口代码只用了几天,结果一跑出来,手机连网络都找不到,更别说接入了,郁闷ing
第一阶段 目标:BCCH广播信息调试,让手机搜索到网络
问题一 链路增益与定时校准
基站在发送小区广播信息和频率校准信息时,天线接收到的数据中每隔一定时间会有0作为填充保护,大概156或者157个sample,利用一块板子发一块板子收,验证发送信号的时域特征符合标准,定时是准确的,但是无意中发现波形出现“封顶”现象,原来是发送和接收增益设的太大(衰减器衰减倍数不够),导致链路信号饱和,部分信息丢失。。。
问题二 信号带宽与插值滤波
openbts作为一个完整的协议栈+底层驱动,整体调试非常困难。因为手机接入的第一步是搜索网络,这个阶段不需要手机反馈信息,即全靠基站发送下行数据,手机接收完成。因此可以关闭基站接收功能,skipRx=1,仅仅测试发送广播信息这一模块。为了验证上层协议栈的一致性,首先用USRP测试,手机可以搜索到网络,将USRP从启动到手机搜索到网络这段时间的发送数据写入文件,作为一个标准的“广播信息数据”,即测试输入。为USRP和opra分别编写两个纯发送数据的小程序。
1、USRPTXDATA程序从文件循环读入数据,发送,手机可以检测到网络;opra读入数据,发送,手机无法检测到网络。
怀疑是opra输出信号有问题,因为opra的模拟滤波器带宽是20M,采样率270.833kHz,输出时仅仅做了复制采样点数据的插值(即把1个采样点复制N次),故输出信号没有经过滤波,带外谐波很大,是不是这些没抑制掉的带外谐波造成手机接收机的干扰,解调错误?
2、将测试标准输入中的数据插值并重新写入到文件2中,opra从文件2中读数据,发送,手机依旧无法检测。
这期间遇到两个问题,首先opra在DA时做了64倍的采样点重复(如上文),那么我将这个插值提前到输入数据中,并用三次插值做滤波,抑制谐波,但是64倍。。。。忘记了这么大的采