(好吧,我承认又标题党了。咦?为什么要说“又”。其实不是完爆,应该是商用WiFi芯片不稀罕做,不赚钱)
终于,可以从我们的开源WiFi芯片openwifi上获取实时IQ采样了。
不知道openwifi是啥?一句话:openwifi是一个开源的WiFi芯片,目前还没流片,跑在FPGA平台上。长文介绍:
https://zhuanlan.zhihu.com/p/100616192
玩软件无线电的小伙伴肯定对于IQ采样不陌生,大部分软件无线电射频前端,从USRP,到BladeRF,limeRF,主要功能的就是实时的在电脑和射频前端之间传输IQ采样。也有一些商用芯片,本来是设计的专用用途,结果被破解之后也能提供实时的IQ采样,这其中最著名的就是rtl-sdr电视棒 (说起这个,我是不是国内最早按照老外的办法用电视棒收飞机的?2012年11月,那已经是9年前:https://m.newsmth.net/article/Radio/44131?p=1)
关于IQ采样(以及许多其他功能),我们已经开辟了专门的应用笔记目录(Application notes)来介绍:https://github.com/open-sdr/openwifi/blob/master/doc/app_notes/README.md
首先介绍单天线IQ采样:https://github.com/open-sdr/openwifi/blob/master/doc/app_notes/iq.md
当它运行起来的时候你可以从电脑上实时看到类似下图:
左窗口是实时IQ(红蓝分别为I、Q,来自当前选择的工作天线),从图中看到大约有三个WiFi包(两头的两包信号强,中间的弱)。右上是实时的射频前端AGC和锁定-非锁定状态指示,右下是RSSI(未校准过的)。计算RSSI不但要用到IQ的幅度(左窗口),也需要用到射频前端的实时增益(右上窗口)。这些信息都来自芯片/FPGA。
这些信息并不是一股脑的全部实时传输,而是每次FPGA捕获到了触发条件时才会传输,数据显示的同时也会存储到电脑文件,供离线分析。传输走的当然也是之前CSI功能架构中的side ch(边信道),所以采集IQ时,CSI功能就没有了。但你已经有了IQ采样,导入Matlab,分析啥都可以(当然也包括CSI)。
IQ采样捕获的触发条件非常丰富,可以实时配置。
- 0 receiver gives FCS checksum result. no matter pass/fail
- 1 receiver gives FCS checksum result. pass
- 2 receiver gives FCS checksum result. fail
- 3 receiver gives SIGNAL field checksum result. no matter pass/fail
- 4 receiver gives SIGNAL field checksum result. pass
- 5 receiver gives SIGNAL field checksum result. fail
- 6 receiver gives SIGNAL field checksum result. no matter pass/fail. HT packet
- 7 receiver gives SIGNAL field checksum result. no matter pass/fail. non-HT packet
- 8 receiver gives long preamble detected
- 9 receiver gives short preamble detected
- 10 RSSI (half dB uncalibrated) goes above the threshold
- 11 RSSI (half dB uncalibrated) goes below the threshold
- 12 AD9361 AGC from lock to unlock
- 13 AD9361 AGC from unlock to lock
- 14 AD9361 AGC gain goes above the threshold
- 15 AD9361 AGC gain goes below the threshold
- 16 phy_tx_started signal from openofdm tx core
- 17 phy_tx_done signal from openofdm tx core
- 18 positive edge of tx_bb_is_ongoing from xpu core
- 19 negative edge of tx_bb_is_ongoing from xpu core
- 20 positive edge of tx_rf_is_ongoing from xpu core
- 21 negative edge of tx_rf_is_ongoing from xpu core
- 22 phy_tx_started and this tx packet needs ACK
- 23 phy_tx_done and this tx packet needs ACK
- 24 positive edge of tx_bb_is_ongoing and this tx packet needs ACK
- 25 negative edge of tx_bb_is_ongoing and this tx packet needs ACK
- 26 positive edge of tx_rf_is_ongoing and this tx packet needs ACK
- 27 negative edge of tx_rf_is_ongoing and this tx packet needs ACK
- 28 tx_bb_is_ongoing and I/Q amplitude from the other antenna is above rssi_or_iq_th
- 29 tx_rf_is_ongoing and I/Q amplitude from the other antenna is above rssi_or_iq_th
- 30 start tx, meanwhile I/Q amplitude from the other antenna is above rssi_or_iq_th
- 31 start tx and need for ACK, meanwhile I/Q amplitude from the other antenna is above rssi_or_iq_th
至于用途,你可以发挥想象,毕竟IQ采样只是表示了天线上的原始信号。开发这样的功能也是为了方便我们调试,因为FPGA里插探针调试是十分痛苦的(知道的都懂)。比如我们可以把那些FPGA解码错误的包的IQ捕获进电脑进行Matlab分析,进而改进FPGA算法。比如可以把一些关键的时序事件(例如SIFS之后ACK)作为触发条件,在电脑上根据IQ来分析我们的包间隔是否正确。验证RSSI计算是否正确(目前RSSI计算的确有些小问题)。
如果上面的32种触发条件都无法满足你的需求,那么去FPGA 增改新的触发条件即可。
双天线IQ采样:https://github.com/open-sdr/openwifi/blob/master/doc/app_notes/iq_2ant.md
我们也可以同时同步捕获两根天线上的IQ(主天线 + 次天线,主天线即基带选择连接的工作天线),这样IQ采样用途会更进一步扩展。比如测试双天线MIMO和分集算法。比如研究WiFi包的碰撞问题 -- 这也是我们开发双天线IQ采样的初衷。我们依靠碰撞捕获功能,来验证我们对于low MAC的改进是否可以有效的减少碰撞(根据WiFi的CSMA/CA协议,完全避免碰撞是不可能的)。
下图为双天线IQ捕获的截屏。
上图上半部分是主天线上的IQ,下半部分是次天线上的IQ(次天线端口没天线,所以衰减很大)。从左到右,主天线收到一包,次天线同时也会接收到(幅度很低,因为衰减大),然后主天线开始发射(可能是解调正确然后发射ACK),但为了防止基带自己收到自己的包,会主动mute(静音)主天线回来的IQ,因此上半图会看到一段全零,但这个信号还是会被次天线(下半图)捕捉到,即下半图中的第二包。可见次天线的角色是监听天线,它不但会收到别人发来的信号,也会收到自己发出去的信号。
因此我们可以用双天线IQ来捕获碰撞。具体方法是,把次天线拉远到另外一个正openwifi通信的WiFi终端那里,触发条件是openwifi基带正处于发射,同时次天线捕获到的IQ却高于某个门限值(即另外一个跟openwifi通信的WiFi终端也在发射),这就意味着出现了碰撞。具体设置如下:
如果能够成功捕获到碰撞,那么一来我们可以进一步在FPGA内部插探针,看看为何碰撞,二来我们可以统计一段时间内的碰撞次数,和商用WiFi的碰撞次数统计做对比,来评估我们的low MAC性能如何。
以上就是单天线和双天线IQ捕获的基本介绍。这些功能在商用WiFi芯片上目前还没有(标题中所谓完爆)。这也算是体现了开源WiFi芯片的优势,可以提供商用WiFi芯片不会提供的功能,开放商用WiFi芯片不会开放的接口。