应用笔记 智能设计程序、分布式射频传感器 Ettus Research 简介Ettus Research™USRP™ 是一种灵活的低成本软件定义无线电,用于创建多个有能力的独特射频系统,包括智能传感器。由于使用无线通讯持续快速增长,有限的射频频谱变得更加拥挤。这就让射频传感器的需求增加,为了测试无线交通状况,检测非法干扰,或者开展其他信号情报任务,例如,空白无线电的进化取决于监视功能以减少竞争设备之间的同频干扰 。地方组织、部队及国土安全部门全都需要依赖射频传感器进行大量数据的识别、描述和定位不同的目标。USRP N210 and USRP E110是免费设置的设备,可以实现智能射频传感器的快速发展。USRP N210 用作基于主机的软件无线电平台。千兆以太网端口提供一个数字化基带端口用于接收和传输环节。软件定义无线电连同其他软件架构如(GRC),可以加速定制无线电的开发。 USRP E110 是嵌入式平台。相对外部主机特定的DSP 操作的卸载程序,USRP E110 ARM处理器在内部进行操作。此处理器使用自定义构建Angstrom Linux发行版。SD 卡上出现的出厂图中也包含软件定义无线电和GRC。 这样开发者就可以在易于使用各种算法的实验室中用USRP N210 运行智能射频传感器。确认之后,然后就可以在USRP E110.上使用这些算法。这一程序也可以和传输相关文档一样简单,并且通过USRP E110提供的互联网端口执行应用程序。 本应用程序假定您对USRP 产品、软件定义无线电和GRC有一定的了解。如果事实并非如此,您可以参考文档末尾处的推荐阅读,那里可以解释很多问题。本应用笔记也适用于USRP N200和USRP E100。 分布式智能射频传感器的更多讨论。 随着分布式射频传感器需求的增加,也出现了很多问题。有的情况下,射频传感器可以将原始数据转播到中央处理位置。这也有很多优势,依赖于原始射频样本传输的系统也需要大量的回程线路设施来支持大的带宽。此数据可能会被传至某一中央处理位置,需要大型、复杂昂贵的处理平台。在很多情况下,收集到的信号被记录下来用于后置处理,这样就需要大量的储备功能。智能射频传感器应用不同的 技术来减少数据 ,而不是忽略检测环境提供数据。反过来,这也降低了对回程线路设施、数据存储和集中处理的要求。配备智能射频传感器需要对重要的信号有一定的了解。如果分布式传感器不够灵活并且在新环境中容易改变,就可以阻止某些不利因素。 一些可用的工具如USRP产品系列和软件定义无线电为开发轻便敏捷的智能射频传感器提供了途径。软件定义无线电如USRP和灵活开发工具是配置智能分布式射频传感器策略的主要部分。 图1——分布式、智能射频传感器网络 USRP 硬件驱动器(UHD)Ettus Research 提供的UHD让用户在GNU 无线电、实验室环境、矩阵实验室、仿真或者定制的SDR 框架下开发软件定义无线电。在Windows, Linux, 或者MacOS, UHD 上进行操作为软件无线电和USRP设备之间提供了一个抽象层 。这就使得UHD 开发的应用程序可以和所有的l USRP模型保持兼容。 UHD 用跨USRP 平台移动SDR设备提供了一种简单的方法。在这个例子中,通过USRP N10开发主机PC上的应用程序,然后准确无误的移到USRP E110.上。这样就实现了改变射频环境并且进行信号收集任务的灵活性 。 USRP E110 和USRPN210USRP N210 是网络系列产品的一员。它通常会通过千兆以太网端口连接到主机电脑,该端口可以提供高达25 MS/s /16-bit样本和50 MS/s 每8-bit样本。它包括一个Spartan 3A-DSP3400 FPGA, a 100 MS/s, 14-bit ADC, a 400 MS/s, 16-bit DAC和其他组件来支持操作。USRP N210 也提供了不同的机制对多个单元进行同步从而进行相位一致性操作。也可以通过Ettus Research MIMO 电缆或者外部分布的10 MHz 和1个PPS 信号。USRP N210 还包含一个可选GPSDO以便在宽领域进行同步。 USRP E110 是一个独特的设备合并了一个基于ARM的COM。这种嵌入式电脑可以通过软件定义无线电和已安装的其他有用的软件,全功能的Linux分发运输。这样,作为智能分发式射频传感器进行独立操作,USRP E110 是一个理想的选择。USRP E110 提供了几个端口来完成应用程序的要求:HDMI 输出、音频输入/出、总线、10/100 以太网端口以及一个基于USB 的除障端口。多个USRP E110s 设备可以通过外部10 MHz输出 和1 PPS输入实现时间同步。可选GPSDO模块可用于宽区域内的多个USRP E110s 实现时间同步。USRP E110使用相同的FPGA 作为USRP N210,12-bit, 64MS/sADC,和14-bit 128 MS/s DAC。UHD支持两个模型。 图1——USRP E100 UHD和USRP 设备的独特发展程序UHD 的便携性使得用户可以利用广泛的开发工具。这些包括图形化开发环境,基于文本的编程语言(如c++或Python,和在某些情况下,第三方产品和应用程序——特定的功能。在这个例子中,GNU广播和Python用于生成智能射频检测算法。用射频信号生成器在实验室环境中验证这种算法。最后,此应用程序分配到远程USRP E110上进行操作。开发理念见图1. 在实验室中用W/图形工具开发应用程序(USRP N210) 图2——应用程序开发流程 最后,这种方法结合了两个方面的最佳实践——基于主机平台的可访问性和便捷性。在基于主机的PC上进行开发时,其他几个工具可 任意使用,复杂开发环境如LabVIEW 或者MATLAB可用作各种前后处理功能从而验证这些算法。在有的情况下,您也可以对FPGA 设计进行修改,支持算法并且使用其他软件组件将这些设计转移到USRP E110上。 简单应用实例——射频功率检测任务为了解释这种功率的开发理念,Ettus Research进行了一个简单的展示。这个例子旨在在USRP E110上推行直接功率检测算法。目标是同时监听连续5个 25 kHz频道,并在开始传输时或每个频道开始减弱时,发送报告至回程线路网络上。为清晰起见,渠道安排检测算法如图3所示。每个通道独立进行功率检测和阈值操作。阈运算的输出将用于生成信号传送器报告,在特定通道开启或者停止操作。这些转换将通过一个特定的IP地址和端口号码报告给回程线路网的另一个实体。 像这种的简单测试,经常用于检测共享频谱之内的干扰。更多复杂的算法可能对于特定频道射频通讯的密度计算可能是有帮助的。例如那些用于空白通信的地方。 图3 ——渠道化方案(不按比例) 为了满足这个例子中的检测要求,您有几个工具可以处理。图形工具如GRC,对DSP的开发有用,但也可能用基于文本的编程方法。图4显示的是用于运行此示例的几个组件。USRP 设备是对射频频谱采样要求的硬件。UHD 为所有的USRP 设备提供了一个通用的API,GNU 无线电提供了一个基于流的DSP 性能。 测试脚本为开发者推行报告逻辑提供了一种简单的方式。最后,检测报告通过套接字接口从测试脚本重新发送到网络。 图4—— 功率检测器——硬件和软件组件 执行步骤1——主机平台的快速发展用于满足这些目标的手段很直接。GNU 软件无线电用于执行基于流的处理任务,例如渠道化、电力检测和阈值。GRC用于对这些功能进行代码合成。DSP的通用架构链如图5所示,GRC绘制的流程图截屏如图6和图7所示。此流程图输出字节流到文档中。五个字节的最低有效位(LSBs)展示了每个通道的功率检测。Unix管道(FIFO) 用作另一应用程序的内置应用端口,执行额外的处理。 软件无线电流程图图5 GNU 无线电流图结构 一套复杂的乘法和正弦信号源设置为频道频率偏移。每个通道用18 kHz.的带宽被低通滤波器过滤。其它组件如频率转换FIR过滤器可以用来将所有的功能结合到一个块中。GNU电台还提供了一种多相信道器块。为了解释,选择了更分散的执行方式。RMS函数与参数化的时间常数用来对每个通道的功率进行估计。用户定义的阈值从结果中减去,二进制切片机用于提供射频功率的二进制表示。每个通道的单位是通过乘法和加法在一个字节内,每个通道有效地转移到相应的通道上。输出到一个外部文件槽中,在这种情况下,设置到一个名为“detect_fifo.”的管道中。 流程图包括几个参数,例如检测阈、信道中心频率、通过命令行接口。这就让你可以在不改变硬编码值的情况下,适应变化中的任务和环境。 TODO:图形将被更新W/ 最新的版本 图6 GNU 无线电流程图——渠道化w/复数乘法和复杂的滤波器 图7——GRC 流程图——功率检测和字节包装 软件定义无线电对于基于流的DSP 操作是理想的选择,有时候,其他工具例如基于文本的编程语言更适用于同步或逻辑编程。Python 脚本用于运行一个简单的状态机将报告发送至“开始传输”(“Tx On”)和结束传输(“Tx Off”)事件。从管道中接收字节,GNU软件无线电流程图,由GNU无线电流程图产生,Python应用解释了比特转移,并且形成了文本报告。这些文本报告输出到UDP套接字上。UDP套接字和其他回程线路网上的设备共享信息。这个示例代码可以在附录中找到。 嵌入在基于主机的USRP 设备中,如USRP N210,可以执行这个程序并且在远程配置之前通过真正的射频信号可以验证算法。 实施第二步——实验室验证算法开发过程中或者之后,用相关信号验证应用程序的性能很关键。这个实例简单的特性允许使用一般的射频信号生成器对算法进行测试。用于验证的设备框图如图8所示。 图8——实验室环境中测试传感器应用 当应用程序在运行的时候,使用信号生成器生成不同的振幅和频率的射频信号。将射频打开,将最低通道下面的频率扫到最高通道上面的值产生一个报告,示例如图10所示。如果您参考谱图3的插图,这就有了直观的意义。应用程序中的默认阈值和增益值对应了SBX 子板上一个-100 dBm的信号功率。当每个通道上出现边界过渡时,应用程序生成一个报告。由于扫过了频率,在当前通道中低于阈值之前相邻频道之间的功率可能超过阈值。这是由于课程的频率步骤在通道过滤器带通上有适度的重叠。 图9——主机执行流程图(900 MHz, 阈值-70 dBfs, 250 kS/s) 图10——主机执行的智能射频传感器——_demo.py-射频席卷信道器集中在900 MHz 实施步骤3——算法步骤开发完并对新的射频检测算法测试过后,这种算法可以布置在USRP E110 平台上。在很多情况下,这个和传输文件到he USRP E110 SD卡上一样简单,并且执行应用程序。USRP E110 可以通过一个SSH 连接接入,并且在10/100 以太网端口上可用。你可以通过使用gvfs-mount计算USRP 文档系统进行传输。关于此算法的更多说明请参见 USRP E100/110 FAQ: http://code.ettus.com/redmine/ettus/projects/usrpe1xx/wiki/ 传输完此文档之后,您可以执行此应用。如果将所有的程序复制到USRP E11的主文件夹的根帐户上。运行此程序的指令将符合图11和图12所示的内容。错误!参考资源未找到。图13显示的是远程机器上监听适当的UDP套接字的应用程序的输出。在这种情况下,USRP E110 锁定到附近的并且连接到一个外部安装的天线允许观察现实世界的信号。USRP E110 从办公室电脑上进行远程访问,流程图被调谐到家庭广播服务(FRS)带上,报告显示的是无线电通信。这些报道都可以用一个基于频谱分析器的USRP N210连接相邻天线得以证实。 图11——SSH功率执行——事件——前端demo.py (464.4 MHz,阈值-70 dBFS, 125 kS/s) 图12——SSH 智能执行_rf_传感器——demo.py (从名为先进先出(fifo)检测的管道中,输出报告为192.168.1.159:8002,详细不启用) 图13——分布式传感器输出——由远程主机8002端口接收 软件无线电流程图和测试脚本都通过命令行参数运行,这样您就可以适应不同的参数。例如,噪声地板和SBX的总增益随着频率不同而不同。log-threshold参数用于容纳这些变化。这些参数的完整列表可以在含有“帮助”的命令行列表中提供。此应用的成功部署可能需要对log-threshold 参数进行调整。不同的采样率也必须细化因为USRP N210 输出频率不能像USRP E110 一样减少到125 kS/s。 DSP 设计中考虑——USRP E110 vs. USRP N210为USRP 设备设计便携应用程序时,很重要的一点是要注意USRP N210 样本参考时钟固定在100 MHz。USRP E100/E110 提供了一种灵活频率时钟方案,最大默认频率为64 MHz。在这两种情况下,便携式应用程序的采样率必须设置为这些频率的因素之一。将一个基于USRP N210系统的代码移植到USRP E110上时,您必须考虑这些差异。这可以通过选择样本100 MHz和64MHz的常见因素样本率来完成。还可以使用有理重新取样器来处理不同的数据采样。如您有任何疑问,请参考智库中的其他资源以便更好地理解USRP 时钟系统。 您也应该考虑ADC和DAC分辨率的不同。USRP E110 ADC 和DAC 分别提供12和 14 bits的分辨率。USRP N210 ADC 和DAC 分别提供14 和16 bits的分辨率。这将影响 无杂散动态范围,并且在较小程度上影响噪音指数。推进对USRP E110处理能力的理解很重要。设备中用到的omap处理器是一个低功率、小型因子计算机,在基于主机的系统相同速率下,不提供复杂算法要求的处理性能。这一事例运行速率约为125 kS/s。当GNU 无线电用于USRP E110上时,通常可以实现的最大速率为1 MS/s。然而,这一数字高度依赖流程图的复杂性。优化程序可以提高这一数字。这些可以通过自定义框架实施或者用VOLK,GNU 无线电里的一个组件,促进高效布局和矢量化数学例程。 可能性本应用笔记中的功率检测例子,其目的是相当简单和容易理解的。对用户来说,此应用程序可能对于想要评估特定频带速度的应用程序有用。然而,更有趣的是你可以部署比这更复杂的算法简单的功率检测器。例如,不同标准的数字解码器可以集成到应用程序中用于识别和标记射频任务。另外,有的USRP 用户已经制定外部规定来测方向。在本文中,使用USRP E110 配置智能分布式传感器以及本文中讨论的原则。USRP E110 也可以传输信号为各种事件提供刺激。 对FPGA开发有经验的熟练用户可以利用Xilinx Spartan-3A DSP 3400 FPGA未利用的资源。他可以大大提高系统的处理性能,并减少数据量,且必须由更慢的OMAP 处理器进行处理。USRP E110 和USRP N210 的DSP链接在速率转换模块的主机端上时相同的。(抽取滤波器 -插值器) 随着基于处理器装置的出现,可以使用USRP N210在实验室中验证FPGA修改版本,并且移植到USRP E110上。这就要求对每个模型进行编译和时间验证。相对于GNU 无线电运行的例子,这样布局更为精简。 结语本文陈述了一种配置和重新装置智能分布式射频传感器系统的灵活方法。陈述中的应用显示了在实验室中开发和测试不同的DSP 算法的清晰路径,以及如何轻松的将他们布置到远程传感器上。他适合各种应用程序需要灵活使用分布式射频系统。关于这个文档或USRP设备,如果您有任何疑问,请参考ttus Research网站 上的智库或者邮件联系我们support@ettus.com。如果您想询盘,请在网站上联系我们的销售人员sales@ettus.com。您可以访问GRC 文件和此示例的密码: http://files.ettus.com/app_notes/distributed_rf_sensors/smart_rf_sensor_demo.zip 推荐阅读 http://gnuradio.org/redmine/projects/gnuradio/wiki import time import socket import thread import string import struct from optparse im port OptionParser CHANNEL_COUNT = 5 state_array = [0,0,0,0,0] #channel power state array def report_event(channel_num, event_string, network_socket, options): #assemble report string and output to udp socket report_string = time.asctime( time.gmtime(time.time())) + ',' + event_string + ',' + 'Chan. ' + str(channel_num) network_socket.sendto(report_string + " \ n \ r",(options.ip, options.port) ) if(options.verbose): print report_string def apply_detection_logic( file_object,network_socket,options): #get byte from fifo byte = int(struct.unpack('B', file_object.read(1))[0]) #look at CHANNEL_COUNT LSBs to determine if power is detected for j in range(0,CHANNEL_COUNT): result = ( byte >> j ) & 1 #apply si mple logic to determine TX on/off transission if state_array[j] == 0: if result == 1: report_event(j,"Tx On",network_socket,options) if state_array[j] == 1: if result == 0: report_event(j,"Tx Off",network_socket,options) state_array[ j] = result def main(): #command parser parser = OptionParser() parser.add_option(" - p", " -- port", dest="port",action="store",type="int", help="Port for outging UDP Socket.", metavar="PORT") parser.add_option(" - a", " -- address", dest="ip ",action="store",type="string", help="IP Address for outgoing UDP Socket.", metavar="ADDR") parser.add_option(" - f", " -- file", dest="filename",action="store",type="string", help="File w/ incoming bytes", metavar="FILE") parser.add_option(" - v", action= "store_true", dest="verbose",help="Print reports to stdout.", default=False) (options, args) = parser.parse_args() print "The program is starting" #open file pipe for itnerface to flow graph print "Opening Pipe to GNU Radio Flow Graph" file = ope n(options.filename,"rb") #bind UDP socket print "Opening Outgoing UDP Socket" sock_network = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #process output from gnuradio flowgraph while(1): apply_detection_logic(file,sock_network,options) if __name__ == "__main__": main() . |