应用Qt 的星座图显示方法及实现

2023-08-16 05:00杜依亮张振邦
无线互联科技 2023年11期
关键词:数字通信星座图开源

杜依亮,颜 军,张振邦

(中国电波传播研究所,山东 青岛 266107)

0 引言

随着现代电子技术的飞速发展,数字通信技术得到了快速发展,在通信领域中逐渐占据了统治地位[1]。 数字通信信号的调制方式趋于多样化,利用调制识别技术快速稳健地识别接收信号的调制方式变得非常重要。 数字通信信号调制识别,广泛应用在电子侦察、智能调制解调器、无线电资源管理、频谱管理等军事和民用领域[2]。 任何一种数字幅相调制信号都可以用唯一的星座图表示,利用这种一一对应的关系,星座图可以作为一种特征用于调制方式的识别[3-6]。 文章针对数字信号调制识别技术对星座图数据的需求,提出并实现了一种星座图显示及存储方法,应用Qt 开发了星座图显示存储软件,可实时显示和保存多种调制样式的数字通信信号的星座图数据。

1 星座图基本理论

数字通信领域中,经常将数字信号在复平面上表示,以直观地表示信号以及信号之间的关系,这种图示就是星座图。 星座图是线性空间的延伸概念,便于更加方便形象地分析信号,是信号分析的利器[7-8]。

星座图是相对于IQ 信号调制而言的,将数据信息(调制信息)映射到极坐标中,其内容包含了信号的幅度信息和相位信息(确切而言是初始相位),对于调制、解调、误码性能等有很直观的判断。

1.1 IQ 信号调制

一个数字通信信号有3 个随时间变化的特性:幅度、相位和频率。 在IQ 调制系统中,通过改变数字通信信号的幅度、相位或者频率,实现对通信信号的调制。 通过幅移键控调制(Amplitude Shift Keying,ASK)进行信号幅度的数字化调制,通过多进制相移键控调制(Multiple Phase Shift Keying,MPSK)进行相位的数字化调制,通过多进制正交幅相调制(Multiple Quadrature Amplitude Modulation,MQAM)进行幅度和相位的数字化调制。

IQ 信号调制,也叫正交调制,通过改变正弦波的幅度、相位或者频率,将基带信号的信息加载到正弦波上。 加载了基带信息的信号称为已调信号(modulated signal),带通已调信号可表示成:

式(1)和式(2)是等价的,其中sl(t)是基带信号,s(t)是已调信号。

IQ 调制的结果就是IQ 信号,调制流程如图1所示。

图1 IQ 信号调制流程

I 路信号a 和Q 路信号b 为两路输入信号,I 路信号通过乘法器与cos(ω0t)相乘,Q 路信号先后通过两个乘法器分别与sin(ω0t)和-1 相乘,输出的IQ 信号为:

输入IQ 调制器的两路信号,常被称为复信号,用复数表示为a+jb,对应复平面上的一个点。 IQ 调制,可以利用复数乘法来实现:

式(4)中, a,b,cos(ω0t),sin(ω0t) 都为实信号,最终输出的IQ 信号s(t)也是实信号。

1.2 IQ 信号解调

IQ 调制后的信号通过天线辐射出去,经信道传输到达接收端,接收端收到信号后,进行解调。 IQ 信号解调流程如图2 所示。

图2 IQ 信号解调流程

接收端收到信号s(t)后,分为两路进行解调:一路通过乘法器与cos(ω0t) 相乘,另一路通过乘法器与-sin(ω0t) 相乘,再分别进行积分,就可以得到原来的I 路信号a 和Q 路信号b。 I 路信号a 解调计算过程如下:

Q 路信号b 解调计算过程如下:

式(6)的计算用到了sin(2ω0t),cos(2ω0t) 在[-T/2,T/2]区间内的积分为0,也就是正弦函数和余弦函数在一个周期内的积分是0。 式(6)中的T,需要满足条件:T 是T0的整数倍。 T0是cos(ω0t) 的周期。

1.3 星座图基本原理

星座图中,点到原点的距离代表的物理含义是:这个点对应信号的能量,离原点越远,表明信号能量越大。 相邻两个点的距离为欧氏距离,表示的是这种调制所具有的抗噪声性能,欧氏距离越大,抗噪声性能越好。

对于16QAM 信号而言,既有幅度信息又有相位信息,将这两个信息映射到坐标轴上,横坐标是I 路,纵坐标是Q 路,如点(1+j)就表示该点的幅度是,相位角是,如图3 所示。

图3 BPSK,16QAM 星座图

QPSK 星座图如图4 所示,信号可分解为一组相互独立的分量:同相分量(I)和正交分量(Q)。 这两个分量是正交的,且互不相干的。 QPSK 调制中使用的是格雷码,采用00↔π/4,01↔3π/4,11↔5π/4,10↔7π/4 的映射关系,在相同的信道条件下,降低了误比特率。

图4 QPSK 星座图

2 星座图显示设计

2.1 Qt 简介

Qt 是基于C++语言编写的跨平台图形用户界面开发框架,具有模块化程度高、二次开发接口丰富、帮助文档详细、代码可移植性好等特点。 使用Qt 开发的应用程序,可移植到Windows,Linux,MacOS 等操作系统中,实现一处开发、多处编译运行[9]。 Qt 的许可类型分为商业许可和开源许可。 开源许可包括LGPL和GPL;商业许可包含更多的模块,但需要支付费用;开源许可无需支付费用,但要遵循开源许可协议LGPL 或GPL。 Qt Core,Qt Gui,Qt Widgets,Qt Network等常用模块的开源协议是LGPL 或GPL;Qt Charts 及Qt Virtual Keyboard 等部分开源模块的开源协议是GPL[10]。 Qt5.15.2 以前的版本可在官网下载安装包,Qt5.15.2 以后的版本需要用户自己编译[11]。

2.2 Qt 绘图功能

Qt 的绘图系统基于QPainter,QPaintDevice 和QPaimEngine 类。 QPainter 类用来进行绘图操作。QPaintDevice 类是一个使用QPainter 进行绘图的抽象的二 维 界 面, 为 QPainter 提 供 一 个“ 画 布”。QPaintEngine 类给QPainter 提供在不同设备上绘图的接口。 用户使用 QPainter 在 QWidget, QPixmap,QImage 等绘图设备上绘制点、线、椭圆、矩形等基本形状组成自己需要的图形,绘制的图形是不可交互的[12]。 Qt 还 提 供 了 Graphics View 架 构, 使 用QGraphicsView,QGraphicsScene,QGraphicsItem 类绘图,在一个场景中可以绘制大量图形部件,每个图形部件都有选择、移动等交互操作[13]。 绘制的星座图无需交互操作,所以选择使用QPainter 在QWidget 上进行绘图。

QWidget 类及其子类是最常用的绘图设备,从QWidget 类继承的类都有paintEvent()事件,要在设备上绘图,只需重定义此事件并编写响应代码。 创建一个QPainter 对象获取绘图设备的接口,就可以在绘图设备的“画布”上绘图。 在paintEvent()事件里绘图的代码如下:

void StarMap::paintEvent(QPaintEvent ∗event){

QPainter painter(this);

painter. setRenderHints(QPainter::Antialiasing |QPainter::TextAntialiasing);

painter.translate(width()/ 2,height()/ 2);drawGrid(&painter);drawTarget(&painter);}

paintEvent()是Qt 窗口的绘制事件。 窗口显示时,就会产生此绘制事件。 通常事件由系统或Qt 自身产生,从Qt 的事件类QEvent 继承下来,通过事件响应函数event()来通知需要通知的对象。 事件响应函数,就是事件通知给相应对象的事件处理函数[14]。

除了事件机制外,Qt 还有信号槽机制。 信号槽是Qt 的核心机制,Qt 使用信号与槽实现对象间通信。信号与槽通过connect()函数进行连接[15-16]。

槽函数和普通的C++成员函数很相似,可以是虚函数(virtual),可以重载(overload),也可以是公有的(public)、保护的(protect)、私有的(private)。 信号槽需要Qt 的元对象系统支持,所有使用信号槽机制的Qt 类都必须包含一个Q_Object 的宏。 信号槽隐藏了复杂的底层实现,与回调函数(callback)相比,信号槽需要查找连接的对象和槽函数,所以执行速度稍慢。但这种差别在程序运行时几乎感觉不到,而其提供的灵活性却比回调函数强很多。

2.3 星座图显示设计

应用Qt 开发星座图显示存储软件,实现对IQ 数据的读取、解析、显示、处理和保存等操作。 软件设计流程如图5 所示。 使用ConstellationShape 类继承QMainWindow 类来实现,中间的窗口为星座图显示窗,下边有3 个功能按钮,分别为“加载数据”“保存数据”“停止工作”按钮。

图5 设计流程

中间的星座图绘制窗口,调用StarMap 子工程生成的动态库来构建,使用高内聚、低耦合的思想进行模块化编程。 星座图中的网格绘制,通过调用drawGrid()函数来实现。 绘制流程是先设置画笔的样式为Qt::DotLine、颜色为网格颜色,调用Qt 自带的画线函数drawLine()函数绘制出虚线网格;再设置画笔颜色为坐标轴颜色,调用drawLine()函数绘制出中间的坐标轴。

星座图中的点的绘制,需先设置画笔的颜色为星座图点的颜色,再调用Qt 自带的画点函数drawPoint()来实现。 星座图的绘制,主要通过drawTarget()函数实现。 StarMap_IQ_Data 为星座图数据结构体,保存的是数字调制信号的IQ 数据。 关键代码如下:

void StarMap::drawTarget(QPainter ∗painter){

QPen pen;

pen.setColor(m_tarColor);

pen.setWidth(2);

painter->setPen(pen);

for (int i = 0; i < m_count; i++)

{

StarMap_IQ_Data iq;

iq.i = m_npData[i] & 0xffff;

iq.q = (m_npData[i] >> 16)& 0xffff;

double x = m_dStartX + m_incrementX ∗(iq.i - m_minX)/ m_xStep;

double y = m_dStartY + m_incrementY ∗(iq.q - m_minY)/ m_yStep;

painter->drawPoint(QPointF(x,-y));

}

}

星座图在数字调制识别中的作用越来越重要[17]。 软件对接收机采集的数字通信信号的IQ 数据进行解析并绘制在星座图上,正交相移键控(Quadrature Phase Shift Keying,QPSK)信号的星座如图6 所示。

图6 QPSK 星座

星座图窗口显示接收机采集的数字通信信号的星座图。 点击界面右下方按钮,通过Qt 的信号槽机制调用相应的按钮响应槽函数,实现加载数据、保存数据、停止工作等功能。 Qt5 之后,槽函数可通过lambda 函数表达式实现。

点击“加载数据” 按钮, 调用Qt 框架中的QFileDialog 类创建文件选择对话框,打开由DATA_PATH 宏指定的IQ 数据文件存放目录,选择IQ 数据文件进行加载。 加载文件后,对文件数量进行判断,如果选择的文件数大于0,则启动一个定时器,依次读取并解析选择的IQ 数据文件,根据解析出的IQ 数据绘制星座图。 关键代码如下:

connect(btnLoad,&QPushButton::clicked, this,[=](){QStringListfiles =QFileDialog::getOpenFileNames(this," Selectoneormorefilesto open",DATA _ PATH,tr ( "Data(∗. dat∗.bin)"))

Q

;Timer ∗updateFileTimer = new QTimer(this);

if (files.count()>= 0){

updateFileTimer->start(500);}this,[=](){

connect(updateFileTimer,&QTimer::timeout,

staticintindex=0;

if(index>=files.count()){

index=0;

}else{

d

eleteupdateFileTimer;

updateFileTimer->stop();

QStringfileName=files.at(index++);

readAndDraw(fileName);

}

});

});

读取IQ 数据并绘制星座图, 是通过函数readAndDraw()实现的,关键代码如下:QStri ng&fileName)

voidConstellationShape::readAndDraw ( const(fileName ,modName);

{

QStringmodName;

if (modName=="PI4DQPSK"){

DataRangeStructdataRange=getDataRange

modName="PI/4DQPSK";

}

m_starMap->setTitle(modName);

int∗data;

intnFileSize=-1;

readData(fileName,data,nFileSize);

m_starMap->setAxisRange(dataRange. minI,dataRange. maxI,dataRange. minQ,dataRange.maxQ);{qDebug()<<11;});

m_starMap->setData(data,nFileSize);

//QTimer::singleShot(1000,this,[=]()

}

点击“保存数据”按钮,对当前显示的星座图进行截图,保存到指定目录中。 关键代码如下:this, [=](){

connect ( btnCapture,&QPushButton::clicked,

QPixmappic=m_starMap->grab();

QStringpath =QApplication::applicationDirPath();

QStringfileName=m_starMap->title();

if (fileName == "PI/4DQPSK"){

fileName = "PI4DQPSK";

}

fileName = QStringLiteral ( "/dataPng/% 1.png").arg(fileName);

fileName = path + fileName;

pic.save(fileName, "png");});

点击“停止工作”按钮,停止显示星座图,并将星座图上的数据清空。 关键代码如下:

connect(btnStop, &QPushButton::clicked, this,[=](){

stopTimer();

m_starMap->clearData();

});

3 结语

文章针对数字通信信号调制识别对星座图数据的需求,提出了一种应用Qt 的星座图显示存储方法,使用Qt 图形界面框架开发了星座图显示及存储软件。 该软件具有良好的用户交互界面,笔者对不同调制类型的数字通信信号的星座图进行了演示,为后续基于星座图的调制识别提供了数据支撑。 软件显示的星座图是基于合作方提供的IQ 数据绘制的,下一步工作是将基于星座图的调制识别算法合并入软件中并实现对非合作方数字通信信号星座图的绘制及其调制方式的识别。

猜你喜欢
数字通信星座图开源
数字通信&数学
五毛钱能买多少头牛
数字通信系统中自适应均衡技术
基于资源块星座图的稀疏码多址接入码本设计
大家说:开源、人工智能及创新
开源中国开源世界高峰论坛圆桌会议纵论开源与互联网+创新2.0
开源计算机辅助翻译工具研究
信号分割修正聚类的星座图恢复算法
地铁中压环网数字通信过电流保护方案
《数字通信世界》杂志社记者证通过年度核验人员名单公示