王属灵,宋 磊,张一嘉,徐 璐
(1.浙江理工大学信息科学与工程学院, 浙江 杭州 310018;2.陆军工程大学指挥控制学院,江苏 南京 210007)
传统通信信号的分析,需要联合借助频谱仪和示波器等诸多仪器,这些分析仪器虽然分析可靠、灵敏度高,但是缺点也很明显:价格高昂,操作复杂,设备庞大不具备便携性[1],而且分析信号的过程需要较长的时间。对于一些经常需要做信号分析的场合而言,时间成本也非常重要,操作仪器进行信号分析就会费时费力。因此,对信号进行全方位分析费时费力,市面上也很难见到一款多功能的信号分析解决方案。
研究者对通信信号分析软件及其相关的显控软件已开展了一些研究,西安电子科技大学范斐基于MFC 设计出一款时域、频域测量一体的雷达信号分析软件,并能够对雷达信号进行基本分析和测量[2]。江苏自动化研究所的徐凤萍利用Qt 软件框架,设计开发了一套基于龙芯3A+中标麒麟的显控软件架构,用于实现信息快速收发及其界面绘图显示[3]。以上研究均为在线分析软件,需要实时获取数据,不能对事先预存好的数据文件进行分析,容易产生信号丢失等情况,且仅能做简单的分析和测量[4]。因此,设计一款集离线分析+精确测量+全面分析等功能于一体的解决方案十分必要。
Qt 作为一款跨平台C++图形用户界面应用程序开发框架,具有使用广泛、兼容性强、组件容易拓展等诸多优势[5]。本文的通信信号分析软件便是基于Qt平台进行搭建,实现了从数据层的信号分析到图形界面的所有流程开发,整合了基本的信号分析功能,方便信号分析人员操作使用。
本文设计的通信信号离线分析软件融合信号处理技术[6],采用MDI 多文档框架,能够对数字及模拟信号进行时频图分析、信号参数测量[7]和常规信号解调。该软件基于Qt 平台搭建,将所有功能进行模块化设计,最后插入到MDI 多文档界面进行显示,每个模块内部分为线程池数据处理和GUI 界面2 部分,保证数据在高效处理的前提下界面也能实时刷新,不卡顿。同时对每个模块设置模块代号以及数据路由机制完成不同模块之间的数据交互,界面操作包括基本功能和弹出菜单,基本菜单会在界面上部和右侧进行显示,弹出菜单在每个不同模块会有不同的功能。本文所设计的软件能够在多平台上使用,无需修改代码便可生成所需平台可执行程序。软件内部逻辑清晰明了,简化了分析过程,所有操作均能通过上下文弹出菜单来完成,具有分析效果佳、兼容性强、便携性高等众多优势。
Qt 的MDI 模式为开发人员提供了能同时操作多个子窗口的编程接口,每个子窗口相当于一个线程,在属于自己的空间中处理独立特定的事务,同时也能进行快捷传值交互[8]。本软件以MDI 框架为主模块,通过多个模块搭配联合实现。对每个模块设置模块代号,利用信号槽机制将所有模块与主模块进行关联,最后通过主模块完成各模块之间数据路由。从底层到最上层的主要模块有:离线数据模块、数据路由模块、GUI 模块(全景模块,信号识别模块、信号解调模块),整体架构如图1 所示。
软件主要功能分为5 部分:MDI 主框架,最底层的离线数据处理模块以及最顶层的信号时频图分析、信号参数测量及常规信号解调。
1) MDI 主框架作为整个界面最重要的模块之一,主要负责控制软件流程、更改识别、解调等参数,同时负责数据路由,管理所有模块间交互数据的分包。
2) 离线数据模块主要是获取本地已存储好的数据文件进行分析,数据文件在存储时需要按照指定格式进行。可获取文件类型包括:.dat、.bin、.wav、.IQ、.AD、.STD、.DIF 等,界面可在读取文件的同时选择数据参数(数据类型,信道类型、采样频率等)。
3) 时频图分析主要分为2 部分:信号频谱图和瀑布图分析。频谱图以x轴为频率,y轴为幅度,通过快速傅里叶变换(FFT)再计算功率谱密度后能够完整且清晰地展示信号的频域特征,同时频谱图通过自定义控件,能够进行图像框选放大、滚轮任意放缩、信号框选识别及解调等功能;瀑布图以x轴作为频率,y轴作为时间,通过不同的颜色展示对应的幅度,由上到下进行移动,且横轴频率坐标与频谱图完全对应。频谱图配合瀑布图能够以最直观的方式展现信号频域特征的二维、三维图。
4) 信号参数测量主要分为2 部分:信号参数结果表用来展示当前从全景框选的信号识别结果参数,结果参数列表可以通过点击进行信号解调并记录参数至信号解调参数区,信号置信度直方图负责统计当前识别信号类型出现的频率(百分比),供用户查看方便以做出下一步分析操作。
5) 常规信号解调展示的是信号的基带波形图、星座图和码流图,信号解调流程可以通过全景框选信号+自定解调参数实现,也可从识别结果参数对识别到的信号进行直接解调。
通过Qt Creator 新建一个Qt Widgets Application应用程序,并编辑UI 文件,设置主窗口部件为QMdi-Area,同时创建菜单栏、工具栏以及参数区。并重新按照图2 所示框架布局整个UI 界面。
图2 主窗口整体框架设计图
菜单栏包括文件菜单栏以及操作菜单栏。文件菜单栏负责获取本地的data 文件,并且保留最近读取的文件显示;操作菜单栏主要是流程控制功能,负责软件启动、暂停、停止、重复播放等功能。所有设置好的控件操作将会对应该类下面的一个自定义槽函数,通过Qt 特有的connect 机制,将功能和槽函数实现动态绑定,当点击客户端操作时槽函数能够响应,实现相应操作。
工具栏设置于软件左上角,提供一系列位图式按钮控制指令,是菜单栏部分功能的展开按钮,方便终端用户操作。而进度条负责获取并显示当前文件读取到的位置,可拖拽。
参数区包括:数据分析参数、信号通道参数及信号解调参数。主要负责设置识别解调参数,并用三个结构体对象保存为全局参数,供所有模块调用。
离线数据模块通过子类化QFIleDialog 类,在此基础插入数据文件参数复选控件,实现自定义的Filecontrol 类。再通过选择数据文件获得文件名,同时利用QFileInfo 类完成文件类型判定。
由于经常会有大文件的读取,本软件使用多线程的方法读取文件数据,解决界面假死问题,而经常对线程的创建及销毁会产生很大的开销,所以可以利用Qt 的线程池函数QThreadPool,使用QThreadPool 直接获取QApplication 生成的默认线程池对象进行管理。在选中确认一个文件之后,创建一个读取任务放入线程池的任务队列,而任务的过程是QFile 获取文件句柄,以QDataStream 二进制流读取数据,最后保存结果,并通知UI 线程任务执行完毕,此任务结束,数据模块执行流程图如图3 所示。
图3 离线数据模块数据流程图
QCustomPlot 是一个开源的Qt C++小部件,用于绘图和数据可视化,该库能够专注制作美观且性能较强的图形和图表,效果佳,简单易用,只需要在项目中增加一个同名头文件和源文件,然后将一个widget提升为QCustomPlot 类即可使用[9]。本软件GUI 显示模块均基于QCustomPlot 二次开发实现。
基于QCustomPlot 二次开发的频谱图需要对子窗口初始化为自定义个性化窗口,并重新设置数据导入接口,增加右键弹出菜单QMenu,菜单栏包括:峰值保持、框选放大及自适范围等。
瀑布图设置图形通过QCPColorGradient 类构造一个自定义色条,再使用QCPColorMap 类绘制,以色条上不同颜色表示信号幅度强弱。每一帧数据追加插入到QList 数据末尾,同时删除QList 头部数据,以此推动瀑布图从上往下刷新。频谱图x轴范围改变会发出rangeChanged 信号,将之与瀑布图x轴setRange方法绑定,实现频谱瀑布图放缩同步。
离线数据模块获取完数据并保存的前提下,选择数据分析参数,点击启动全景按钮即可开启全景流程,全景刷新是根据当前数据偏移搭配定时器QTimer 设置的固定时间实现的,每个定时器周期内数据首先会经过FFT 处理并计算功率谱密度,得出信号在不同频率上得功率值,然后再进行坐标映射,最后将每个点的值利用setData 接口存入数据窗口内部,同时调用replot 重绘,replot 参数采用QCustomPlot::rp-QueuedReplot,可以显著改善重绘性能,数据便能全部以最优效果展示出来。全景浏览分析如图4 所示。
图4 全景浏览分析(上为频谱图,下为瀑布图,右侧小窗口为弹出控制菜单)
信号参数测量中2 个表格分别存储临时信号参数结果以及汇总信号参数结果,当通过框选信号启动识别后,利用离线数据模块构建好的线程池,保存当前信号位置,并将位置和原始IQ 数据加入新开辟的工作线程,新创建的工作线程会绑定2 个Signal-Slot,分别是传入参数以及传出信号识别结果。该线程以全景停止为退出条件进行无限循环抽取、识别。识别结果保存在SgnAnalysisResult 结构体中,最终传出工作线程,在UI 界面做显示。参数显示表格会设置弹出菜单,该菜单栏包括:显示信号位置,启动信号解调及删除该次信号结果。
信号参数测量模块的主要设计流程如图5 所示。
图5 参数测量工作流程
参数测量模块对信号测量的参数列表如表1所示。
表1 信号测量的参数列表及其说明
参数测量会在2 个表格展示信号识别结果信息(QTableWidget),一个用于汇总,另一个用于临时刷新。设置表头为信号参数,表格为单行选中,最右侧信号置信度直方图是继承于QCustomPlot,绘图选择QCPBars 柱状图,负责统计当前识别信号类型出现的频率(百分比),界面显示效果如图6 所示。
图6 识别界面及信号识别结果展示(以BPSK 为例)
常规信号解调结果展示基带波形图、位流图及星座图。基带波形图基于QCustomPlot 二次开发实现,它以当前点数为x轴,y轴为IQ 数据中I 路数据,数据点全部相连以连续的形式绘制。星座图以I 路数据为x轴,y轴为Q 路数据,设置数据绘图风格setLineStyle(QCPGraph::LineStyle::lsNone),此为散点图绘制方式,点与点之间没有连接,不同的信号的星座图会有不同的分布IQ 分布,能够直观展示解调效果。位流图使用的是QTextWidget,设置整帧数据为单行显示并且开启滚轮条,用01 字符串以append 的形式展示结果,结果会保存1 000 行,超过1 000 行则会自动删除最开始的一行。
常规信号解调算法由于时间复杂度高,耗时多,若直接进行调用,会使得UI 界面产生卡顿,因此该模块是基于双线程开发。子线程会在软件启动时默认直接开启,内部使用while 的方式,通过判断全景流程是否正在运行从而break,因此理论上解调的效率是和当前使用的计算机性能有关,计算机性能越强,运算速度越快,显示刷新效率越高。
常规信号解调结果展示如图7 所示。
图7 常规信号解调结果展示(以BPSK 为例)
常规信号解调流程是基于全景流程推动的。在全景启动的情况下,有2 种方式开启解调, 一种是从全景频谱图直接框选信号+手动设置解调参数,另一种是通过选中信号分析结果,自动进行信号解调。常规信号解调工作流程如图8 所示。
图8 常规信号解调工作流程
离线分析软件根据前文展示的框架以及模块化设计完成后,使用Release 重新构建项目,在Windows环境下重新生成可执行文件exe,再使用同编译环境下Qt 自带的命令行工具切换到当前exe 目录,手动输入windeployqt MainMDI.exe 命令,其中MainMDI 为生成的可执行文件的名称,该命令的作用是拷贝库文件。完成此步骤之后exe 目录会自动将该程序所需要的库文件全部拷贝到当前文件夹,最后使用第三方软件Enigma Virtual Box 将所有文件打包到指定目录,生成最终的一个可执行文件。
测试采用数据文件基于信号源生成,并且使用USRP 设备采集并保存下来的.dat 文件, 采集的数据内容如表2 所示。
表2 离线信号数据表
软件在设计打包完成后,经过多次文件读取及关闭,同步及分步执行所有功能,未发现明显的界面卡顿、假死等情况,同时经过测试,所有操作流程中一切正常,无报错、闪退等异常BUG 的发生。
频谱图分析分别采用某常用软件以及本文所设计的软件对信号1 进行频谱分析对比,验证频谱图绘制的正确性,发现无明显差异,对比图如图9 所示。
图9 BPSK 调制频谱图的对比
开启信号识别流程,观察到识别结果参数表格中所有参数均符合测试文件的信号参数,且右侧直方图显示BPSK 的信号置信度为100%,如图10 所示。综上所述,信号识别模块已经达到了设计要求。
图10 BPSK 参数识别结果(上方蓝色选中表格为识别结果汇总)
双击信号参数识别结果表,以识别参数结果为解调参数开启信号解调流程。如图11 所示,信号的星座图和位流图均符合BPSK 的特性,特别注意到,在基带波形图中,观察到波形图开始一段出现大范围波动,很可能是由于信号解调时引入了相位误差,导致解调信号的相位偏移,该偏移可能来自信号源本身的相位偏移、信号传输中的相位噪声、解调器本身的相位偏移等多个方面,这些偏移导致解调信号的相位发生变化,从而影响I 路数据的波形。
图11 BPSK 解调结果(左上为基带波形,左下为位流图,右侧为星座图)
本文所设计的基于Qt 的通信信号分析软件,全部基于Qt 和C++实现,有良好的模块设计以及跨平台性,代码可读性高,数据流清晰。完成了对离线数据信号读取解析、全景浏览、参数测量及信号解调。最后,在CentOS 及Windows 平台下分别封装打包交付给实验室成员及相关合作公司使用,完成设计要求。本软件的基本功能都已经实现,但后续仍有部分细节需进一步深入完善,要做到兼顾软件的整体性能和延展性,为使用者提供界面更精美、操作更便利、功能更强大的可视化的软件解决方案。■