ADI_Amy

【快速通往量产的四个步骤】第二步——如何利用MATLAB和Simulink进行S模式检测和解码

ADI_Amy 員工 在 2016-2-25 建立的討論區
最後回覆由mu-zi於2016-2-29提供

自动相关监视广播波形
能被检测和解码的无线信号无处不在。利用当今的软件定义无线电 (SDR) 硬件,像ADI公司的集成RF捷变收发器AD9361/AD9364 等,很容易接入这些信号™1,2。商业航空器的自动相关监视广播 (ADS-B) 传输提供了一个现成的无线信号,利用它可演示基于AD9361和Xilinx® Zynq®-7000 All Programmable SoC的快速原型开发流程。商业航空器利用ADS-B发射机向空中交通管制员报告其位置、速度、高度和航空器ID3。国际民用航空组织 (ICAO) S模式超长电文规范定义了飞行数据格式4。ADS-B正在向全世界推广,以便构建现代化空中交通管制和避碰系统。它已被欧洲采用,美国正在逐渐引入。


S模式超长电文标准详细规定了RF传输格式和编码数据字段。应答器传输具有如下特性:

  • 发射频率:1090 MHz
  • 调制:脉冲位置调制 (PPM)
  • 数据速率:1 Mbps
  • 消息长度:56 μs或112 μs
  • 24位CRC校验和


调谐频率和带宽完全在AD9361 RF收发器的能力范围之内,收到的I/Q样本可利用多种软件或嵌入式平台选项进行检测和解码。本文将讨论如何利用一个基于AD9361的接收机平台来捕捉这些S模式信号,然后利用MATLAB和Simulink开发一个能够解码消息的算法。该算法的最终目标是将该解决方案部署到Zynq SoC平台上,例如Avnet PicoZed™ SDR系统化模块 (SOM) 。


接收机设计挑战
S模式消息有短 (56 μs) 和长 (112 μs) 两种。短消息包含消息类型、航空器识别号和循环冗余校验 (CRC) 和。长消息则还包含高度、位置、速度和飞行状态信息。无论何种情况,S模式传输均从一个8 μs前同步码开始。接收机通过此前同步码确定一条有效消息正在传输,此前同步码还能帮助接收机确定消息位从何时开始。详情参见图15。5

图1. S模式消息结构


S模式波形相当简单,但要成功接收并解码消息,仍有若干挑战需要解决。

  1. 接收环境通常是长时间空闲中穿插着非常短的消息;如果发射信号的航空器距离接收机很远,收到的信号可能非常弱。传统波形也会以1090 MHz的频率发射。接收机需要利用前同步码在拥堵的频段中识别高和低两个幅度的S模式传输。
  2. 在1 μs位间隔内,各位的可能模式有两种。前½ μs为ON且后½ μs为OFF,表示逻辑1。前½ μs为OFF且后½ μs为ON,表示逻辑0。位判定的依据是基于时间的模式,因此,接收机需要利用前同步码准确找出消息位开始的I/Q样本。
  3. S模式消息由88个信息位和24个校验和位组成。接收机需要能够在正确的时间清除寄存器、作出位判定、计算校验和并读取校验和寄存器。为使接收机正确工作,必须对时序进行控制。
  4. 对于嵌入式设计,解码过程必须逐个样本进行。存储大量数据再进行批处理的接收机设计,对嵌入式系统来说是不现实的。


AD9361等强大的RF前端与MATLAB®之类的科技计算语言相结合,可大大简化与此类传输的检测和解码相关的问题。MATLAB和信号处理工具箱中的函数可用来识别同步模式,计算噪底,作出位判定,以及计算校验和。MATLAB中的条件和执行控制函数可简化控制逻辑。利用AD9361 SDR平台很容易访问测试数据,无论是从二进制或文本文件读取,还是以流形式直接输入MATLAB。最后,MATLAB是解释性语言,因而很容易与数据进行交互,尝试不同的方法,以交互方式开发解决方案。


在MATLAB中建模并验证S模式接收机算法
对下述内容和MATLAB源代码感兴趣的读者,可在Analog Devices GitHub库中找到相关文件。入门级函数为ad9361_ModeS.m,同时提供了此函数调用的 文件.设计接收机算法的第一步是访问一些源数据。许多航空器现在都配备了S模式应答器,因而只需将接收机调谐到1090 MHz的广播频率便可捕获本地传输。在我们的例子中,可以使用Zynq SDR快速原型开发平台。ADI公司提供了一个MATLAB系统对象™,它能通过以太网从FMCOMMS平台接收数据6。该系统对象允许用户选择调谐频率和采样速率,利用无线电硬件收集接收样本,以及将接收样本作为MATLAB变量直接送入MATLAB工作空间。所需代码非常少,几行代码便可设置MATLAB系统对象,再用几行代码设置FMCOMMS3,还有几行代码用来捕获I/Q样本并将其写入一个MATLAB变量。代码示例如图2、图3和图4所示。

图2. 设置MATLAB系统对象的MATLAB代码示例


图3. 配置FMCOMMS3板的MATLAB代码示例


图4. 捕获I/Q样本并将其写入Rx变量的MATLAB代码示例



我们使用了一些基于这些命令的代码,以12.5 MHz的采样速率捕获数个数据集。选择12.5 MHz速率是为了提供足够的样本来使前同步码与第一个消息位精密对齐,并通过求均值方法消除用来作出位判定的样本中的噪声。捕捉一百万样本的结果如图5所示。

图5. 1090 MHz数据捕捉示例


在这个较短的数据集中,有14个信号从噪底中凸显出来。在这14个信号中,有两个是S模式消息。其余是传统或杂散信号,应予以抛弃。放大样本号604000附近的区域,可看到其中一个有效消息(图6)。

图6. 单个S模式消息


在此图中,可以清楚看到前同步码,PPM调制引起的位跃迁也很明显。即使面对如此清晰的信号,通过目视检查解码各位也需要很好的视力和极大的耐心。显然,需要一个自动化程序来解码这些消息。MATLAB非常适合于开发这种程序。用于接收和解码S模式消息的MATLAB代码可概述如下:

  1. 利用filter () 函数计算一个短时间窗口上的噪底和前同步码相关性。我们的解决方案使用75个样本,相当于6 μs。
  2. 当前同步码相关性比噪底大一个相当大的倍数时,启动寻找第一消息位样本的逻辑。
    • 此阈值可主观选择。它应足够小,以便检测弱信号,但又应足够大,以防出现大量误报。我们选择比噪底高10倍的值,这是一个能够捕捉大多数可解码消息的合理阈值。
    • 前同步码模式产生数个峰值。最佳匹配是第一个6 μs,因此存储第一峰值,开始寻找第一消息位,并检查接下来的3 μs是否有一个更大的峰值。若有,则存储新峰值,重新开始寻找第一消息位。
    • 找到最大峰值时,于2 μs后开始解码消息位。
    • 图7显示了噪底(绿色)以及将理想前同步码与输入数据相关的结果。噪底上有多个峰值,但有意义的峰值是幅度最大的峰值。第一消息位样本出现在该峰值后2 μs处。

图7. 噪底和前同步码相关性的计算



  1. 对于每一位,将前½ μs和后½ μs的样本幅度分别求和。哪一个和较大决定该位是逻辑1还是逻辑0。
  2. 一边作出位判定,一边计算校验和。当第一位到达时,需要某种控制逻辑来复位CRC寄存器,计算88位的校验和,然后在最后的24位期间清空CRC寄存器。若接收位匹配校验和,则ADS-B消息有效。
  3. 根据S模式标准解析消息位(参见图8)。

图8. 解码后的S模式消息


上图来自MATLAB命令窗口,显示了从一百万样本数据集中成功解码的两条消息。图中给出了构成88位消息和24位校验和的十六进制字符,解码过程的结果显示了航空器ID、消息类型以及航空器速度、高度和位置。MATLAB提供了功能强大的数学和信号处理语言,使我们能够相对轻松地解决此类问题。用于处理数据样本并最终解码消息的MATLAB代码很短,只有200行。


此外,MATLAB是解释性语言,因而很容易以交互方式尝试不同的设计思想,快速确定可行的解决方案。我们对不同数据集测试了多种时序机制、阈值和噪声水平,最终获得一个满意的程序。该MATLAB代码已针对本地空域飞行的航空器发出的信号进行了测试,解码的消息也对照airframes.orgflightaware.com. 等信息源进行了检查。硬件和代码表现得非常好,我们已经能够解码距离50英里的飞机发出的信号。



实施路径
对下述内容和Simulink模型感兴趣的读者,可在Analog Devices GitHub库中找到相关文件:https://github.com/analogdevicesinc/MathWorks_tools/tree/master/hil_models/ADSB_Simulink
MATLAB是一个出色的环境,可让用户在PC上测试设计思想并运行算法,但如果最终目标是产生要用在嵌入式平台(例如Zynq SoC)上的软件或HDL,那么Simulink是一个不错的解决方案。


Simulink非常适合针对可编程器件的硬件细化建模工作。一个很好的工作流程是先用MATLAB开发并验证算法,然后将设计转换成Simulink,沿着开发路径向前推进,直至获得最终硬件实现方案。幸运的是,该算法的MATLAB代码是逐个样本地处理数据,因此可以相当轻松地转换为Simulink。与200行MATLAB代码相比,Simulink模型很容易显示和描述(参见图9)。

图9. S模式检测和解码算法的Simulink模型


在图9中,可以看到解码的第一步是计算噪底和前同步码相关性。这些计算使用数字滤波器模块。时序控制模块利用Stateflow®实现,后者是一个状态机工具,用于为解码算法的其它部分产生时序、复位和控制信号。对于想要将控制逻辑与数据流分开的模型,Stateflow非常有用。一旦激活时序和触发信号,名为BitProcess的模块便会接受I/Q输入样本并计算数据位,然后CRC_Check模块计算校验和。消息解析仍然发生在由该Simulink模型驱动的MATLAB脚本中。


深入观察该模型,可以看到令Simulink适合嵌入式开发的几个特性,尤其是针对Zynq SoC将设计划分为多个功能,以及产生HDL代码和C代码。

  1. Simulink具有出色的定点支持能力,用户可以构建并测试设计的位真 (bit-true) 版本。各个模块允许用户设置模型中数学运算的字长和小数长度。用于计算前同步码相关性的数字滤波器模块就是一个很好的例子(图10)。用户可以设置计算的舍入模式和溢出行为(对于HDL中的数学运算,Floor和Wrap是最简单的选择)。此外,用户可以为产品和滤波器的累加器操作指定不同的字长和小数精度(图11)。用户可以使用映射到接收机ADC的字长选择,并且利用硬件乘法器,例如Zynq SoC的DSP48分片内部的18位× 25位乘法器。

图10. 用于前同步码相关性的Simulink数字滤波器模块,12位数据类型


图11. 定点数据类型设置



  1. 嵌入式设计常常具有多种工作模式和条件执行算法。Stateflow特别善于管理这些控制信号。Stateflow以可视化方式呈现S模式消息检测和解码所需的控制逻辑。在下面的图12中,可以看到逻辑中的如下状态:
    • SyncSearch:寻找捕获样本中的前同步码
    • WaitForT0:寻找第一个消息位的开始
    • BitProcess:启用位处理
    • EmptyReg:清空校验和寄存器并将这些位与位处理输出进行比较


当检测和解码算法在不同状态间流转时,Stateflow模块产生相关信号以启用位处理,复位位判定计数器和校验和寄存器,以及在S模式消息结束时读出校验和位。

图12. 解码S模式消息的Stateflow流程图


  1. Simulink模块库中既有高度概括的模块,也有非常精细的模块,工程师可以根据需要选择使用。数字滤波器、FFT和数控振荡器等是高级模块,利用这些模块很容易构建信号处理设计。如果需要更精确地控制设计,例如针对速度或面积进行优化,工程师可以使用单位延迟、逻辑运算符(如XOR)和开关等低级模块。该模块中的24位校验和便是利用这些低级模块构建的反馈移位寄存器(图13)。

图13. 用于S模式校验和计算的反馈移位寄存器


该Simulink模型是用于检测和解码S模式消息的MATLAB算法的硬件化版本。Simulink是一个很有用的工具,填补了MATLAB中编写的行为算法与嵌入式硬件的实现代码之间的空白。您可以将针对硬件的细化工作引入Simulink模型,运行模型,验证您所做的变更没有破坏解码算法。



结论
Zynq SDR快速原型开发平台和MathWorks软件的结合,为通信工程师提供了一种全新且灵活的方式来将无线接收机设计理念快速变成原型。AD9361/AD9364捷变宽带RF收发器的高度可编程能力和性能,加上硬件与MATLAB环境之间的简单连接,让大量不同且有趣的无线信号可以为工程师所用。使用MATLAB的工程师可以快速尝试各种设计思想并确定有前途的解决方案。如果设计的最终目标是嵌入式处理器,工程师可以通过Simulink工具利用硬件相关主意优化设计,最终获得用于对处理编程的代码。这种工作流程可降低无线接收机设计对工程师技能的要求,缩短从概念到工作原型的开发周期。

結果