杜依亮,顏 軍,張振邦
(中國電波傳播研究所,山東 青島 266107)
隨著現(xiàn)代電子技術(shù)的飛速發(fā)展,數(shù)字通信技術(shù)得到了快速發(fā)展,在通信領(lǐng)域中逐漸占據(jù)了統(tǒng)治地位[1]。 數(shù)字通信信號(hào)的調(diào)制方式趨于多樣化,利用調(diào)制識(shí)別技術(shù)快速穩(wěn)健地識(shí)別接收信號(hào)的調(diào)制方式變得非常重要。 數(shù)字通信信號(hào)調(diào)制識(shí)別,廣泛應(yīng)用在電子偵察、智能調(diào)制解調(diào)器、無線電資源管理、頻譜管理等軍事和民用領(lǐng)域[2]。 任何一種數(shù)字幅相調(diào)制信號(hào)都可以用唯一的星座圖表示,利用這種一一對(duì)應(yīng)的關(guān)系,星座圖可以作為一種特征用于調(diào)制方式的識(shí)別[3-6]。 文章針對(duì)數(shù)字信號(hào)調(diào)制識(shí)別技術(shù)對(duì)星座圖數(shù)據(jù)的需求,提出并實(shí)現(xiàn)了一種星座圖顯示及存儲(chǔ)方法,應(yīng)用Qt 開發(fā)了星座圖顯示存儲(chǔ)軟件,可實(shí)時(shí)顯示和保存多種調(diào)制樣式的數(shù)字通信信號(hào)的星座圖數(shù)據(jù)。
數(shù)字通信領(lǐng)域中,經(jīng)常將數(shù)字信號(hào)在復(fù)平面上表示,以直觀地表示信號(hào)以及信號(hào)之間的關(guān)系,這種圖示就是星座圖。 星座圖是線性空間的延伸概念,便于更加方便形象地分析信號(hào),是信號(hào)分析的利器[7-8]。
星座圖是相對(duì)于IQ 信號(hào)調(diào)制而言的,將數(shù)據(jù)信息(調(diào)制信息)映射到極坐標(biāo)中,其內(nèi)容包含了信號(hào)的幅度信息和相位信息(確切而言是初始相位),對(duì)于調(diào)制、解調(diào)、誤碼性能等有很直觀的判斷。
一個(gè)數(shù)字通信信號(hào)有3 個(gè)隨時(shí)間變化的特性:幅度、相位和頻率。 在IQ 調(diào)制系統(tǒng)中,通過改變數(shù)字通信信號(hào)的幅度、相位或者頻率,實(shí)現(xiàn)對(duì)通信信號(hào)的調(diào)制。 通過幅移鍵控調(diào)制(Amplitude Shift Keying,ASK)進(jìn)行信號(hào)幅度的數(shù)字化調(diào)制,通過多進(jìn)制相移鍵控調(diào)制(Multiple Phase Shift Keying,MPSK)進(jìn)行相位的數(shù)字化調(diào)制,通過多進(jìn)制正交幅相調(diào)制(Multiple Quadrature Amplitude Modulation,MQAM)進(jìn)行幅度和相位的數(shù)字化調(diào)制。
IQ 信號(hào)調(diào)制,也叫正交調(diào)制,通過改變正弦波的幅度、相位或者頻率,將基帶信號(hào)的信息加載到正弦波上。 加載了基帶信息的信號(hào)稱為已調(diào)信號(hào)(modulated signal),帶通已調(diào)信號(hào)可表示成:
式(1)和式(2)是等價(jià)的,其中sl(t)是基帶信號(hào),s(t)是已調(diào)信號(hào)。
IQ 調(diào)制的結(jié)果就是IQ 信號(hào),調(diào)制流程如圖1所示。
圖1 IQ 信號(hào)調(diào)制流程
I 路信號(hào)a 和Q 路信號(hào)b 為兩路輸入信號(hào),I 路信號(hào)通過乘法器與cos(ω0t)相乘,Q 路信號(hào)先后通過兩個(gè)乘法器分別與sin(ω0t)和-1 相乘,輸出的IQ 信號(hào)為:
輸入IQ 調(diào)制器的兩路信號(hào),常被稱為復(fù)信號(hào),用復(fù)數(shù)表示為a+jb,對(duì)應(yīng)復(fù)平面上的一個(gè)點(diǎn)。 IQ 調(diào)制,可以利用復(fù)數(shù)乘法來實(shí)現(xiàn):
式(4)中, a,b,cos(ω0t),sin(ω0t) 都為實(shí)信號(hào),最終輸出的IQ 信號(hào)s(t)也是實(shí)信號(hào)。
IQ 調(diào)制后的信號(hào)通過天線輻射出去,經(jīng)信道傳輸?shù)竭_(dá)接收端,接收端收到信號(hào)后,進(jìn)行解調(diào)。 IQ 信號(hào)解調(diào)流程如圖2 所示。
圖2 IQ 信號(hào)解調(diào)流程
接收端收到信號(hào)s(t)后,分為兩路進(jìn)行解調(diào):一路通過乘法器與cos(ω0t) 相乘,另一路通過乘法器與-sin(ω0t) 相乘,再分別進(jìn)行積分,就可以得到原來的I 路信號(hào)a 和Q 路信號(hào)b。 I 路信號(hào)a 解調(diào)計(jì)算過程如下:
Q 路信號(hào)b 解調(diào)計(jì)算過程如下:
式(6)的計(jì)算用到了sin(2ω0t),cos(2ω0t) 在[-T/2,T/2]區(qū)間內(nèi)的積分為0,也就是正弦函數(shù)和余弦函數(shù)在一個(gè)周期內(nèi)的積分是0。 式(6)中的T,需要滿足條件:T 是T0的整數(shù)倍。 T0是cos(ω0t) 的周期。
星座圖中,點(diǎn)到原點(diǎn)的距離代表的物理含義是:這個(gè)點(diǎn)對(duì)應(yīng)信號(hào)的能量,離原點(diǎn)越遠(yuǎn),表明信號(hào)能量越大。 相鄰兩個(gè)點(diǎn)的距離為歐氏距離,表示的是這種調(diào)制所具有的抗噪聲性能,歐氏距離越大,抗噪聲性能越好。
對(duì)于16QAM 信號(hào)而言,既有幅度信息又有相位信息,將這兩個(gè)信息映射到坐標(biāo)軸上,橫坐標(biāo)是I 路,縱坐標(biāo)是Q 路,如點(diǎn)(1+j)就表示該點(diǎn)的幅度是,相位角是,如圖3 所示。
圖3 BPSK,16QAM 星座圖
QPSK 星座圖如圖4 所示,信號(hào)可分解為一組相互獨(dú)立的分量:同相分量(I)和正交分量(Q)。 這兩個(gè)分量是正交的,且互不相干的。 QPSK 調(diào)制中使用的是格雷碼,采用00?π/4,01?3π/4,11?5π/4,10?7π/4 的映射關(guān)系,在相同的信道條件下,降低了誤比特率。
圖4 QPSK 星座圖
Qt 是基于C++語言編寫的跨平臺(tái)圖形用戶界面開發(fā)框架,具有模塊化程度高、二次開發(fā)接口豐富、幫助文檔詳細(xì)、代碼可移植性好等特點(diǎn)。 使用Qt 開發(fā)的應(yīng)用程序,可移植到Windows,Linux,MacOS 等操作系統(tǒng)中,實(shí)現(xiàn)一處開發(fā)、多處編譯運(yùn)行[9]。 Qt 的許可類型分為商業(yè)許可和開源許可。 開源許可包括LGPL和GPL;商業(yè)許可包含更多的模塊,但需要支付費(fèi)用;開源許可無需支付費(fèi)用,但要遵循開源許可協(xié)議LGPL 或GPL。 Qt Core,Qt Gui,Qt Widgets,Qt Network等常用模塊的開源協(xié)議是LGPL 或GPL;Qt Charts 及Qt Virtual Keyboard 等部分開源模塊的開源協(xié)議是GPL[10]。 Qt5.15.2 以前的版本可在官網(wǎng)下載安裝包,Qt5.15.2 以后的版本需要用戶自己編譯[11]。
Qt 的繪圖系統(tǒng)基于QPainter,QPaintDevice 和QPaimEngine 類。 QPainter 類用來進(jìn)行繪圖操作。QPaintDevice 類是一個(gè)使用QPainter 進(jìn)行繪圖的抽象的二 維 界 面, 為 QPainter 提 供 一 個(gè)“ 畫 布”。QPaintEngine 類給QPainter 提供在不同設(shè)備上繪圖的接口。 用戶使用 QPainter 在 QWidget, QPixmap,QImage 等繪圖設(shè)備上繪制點(diǎn)、線、橢圓、矩形等基本形狀組成自己需要的圖形,繪制的圖形是不可交互的[12]。 Qt 還 提 供 了 Graphics View 架 構(gòu), 使 用QGraphicsView,QGraphicsScene,QGraphicsItem 類繪圖,在一個(gè)場(chǎng)景中可以繪制大量圖形部件,每個(gè)圖形部件都有選擇、移動(dòng)等交互操作[13]。 繪制的星座圖無需交互操作,所以選擇使用QPainter 在QWidget 上進(jìn)行繪圖。
QWidget 類及其子類是最常用的繪圖設(shè)備,從QWidget 類繼承的類都有paintEvent()事件,要在設(shè)備上繪圖,只需重定義此事件并編寫響應(yīng)代碼。 創(chuàng)建一個(gè)QPainter 對(duì)象獲取繪圖設(shè)備的接口,就可以在繪圖設(shè)備的“畫布”上繪圖。 在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 窗口的繪制事件。 窗口顯示時(shí),就會(huì)產(chǎn)生此繪制事件。 通常事件由系統(tǒng)或Qt 自身產(chǎn)生,從Qt 的事件類QEvent 繼承下來,通過事件響應(yīng)函數(shù)event()來通知需要通知的對(duì)象。 事件響應(yīng)函數(shù),就是事件通知給相應(yīng)對(duì)象的事件處理函數(shù)[14]。
除了事件機(jī)制外,Qt 還有信號(hào)槽機(jī)制。 信號(hào)槽是Qt 的核心機(jī)制,Qt 使用信號(hào)與槽實(shí)現(xiàn)對(duì)象間通信。信號(hào)與槽通過connect()函數(shù)進(jìn)行連接[15-16]。
槽函數(shù)和普通的C++成員函數(shù)很相似,可以是虛函數(shù)(virtual),可以重載(overload),也可以是公有的(public)、保護(hù)的(protect)、私有的(private)。 信號(hào)槽需要Qt 的元對(duì)象系統(tǒng)支持,所有使用信號(hào)槽機(jī)制的Qt 類都必須包含一個(gè)Q_Object 的宏。 信號(hào)槽隱藏了復(fù)雜的底層實(shí)現(xiàn),與回調(diào)函數(shù)(callback)相比,信號(hào)槽需要查找連接的對(duì)象和槽函數(shù),所以執(zhí)行速度稍慢。但這種差別在程序運(yùn)行時(shí)幾乎感覺不到,而其提供的靈活性卻比回調(diào)函數(shù)強(qiáng)很多。
應(yīng)用Qt 開發(fā)星座圖顯示存儲(chǔ)軟件,實(shí)現(xiàn)對(duì)IQ 數(shù)據(jù)的讀取、解析、顯示、處理和保存等操作。 軟件設(shè)計(jì)流程如圖5 所示。 使用ConstellationShape 類繼承QMainWindow 類來實(shí)現(xiàn),中間的窗口為星座圖顯示窗,下邊有3 個(gè)功能按鈕,分別為“加載數(shù)據(jù)”“保存數(shù)據(jù)”“停止工作”按鈕。
圖5 設(shè)計(jì)流程
中間的星座圖繪制窗口,調(diào)用StarMap 子工程生成的動(dòng)態(tài)庫來構(gòu)建,使用高內(nèi)聚、低耦合的思想進(jìn)行模塊化編程。 星座圖中的網(wǎng)格繪制,通過調(diào)用drawGrid()函數(shù)來實(shí)現(xiàn)。 繪制流程是先設(shè)置畫筆的樣式為Qt::DotLine、顏色為網(wǎng)格顏色,調(diào)用Qt 自帶的畫線函數(shù)drawLine()函數(shù)繪制出虛線網(wǎng)格;再設(shè)置畫筆顏色為坐標(biāo)軸顏色,調(diào)用drawLine()函數(shù)繪制出中間的坐標(biāo)軸。
星座圖中的點(diǎn)的繪制,需先設(shè)置畫筆的顏色為星座圖點(diǎn)的顏色,再調(diào)用Qt 自帶的畫點(diǎn)函數(shù)drawPoint()來實(shí)現(xiàn)。 星座圖的繪制,主要通過drawTarget()函數(shù)實(shí)現(xiàn)。 StarMap_IQ_Data 為星座圖數(shù)據(jù)結(jié)構(gòu)體,保存的是數(shù)字調(diào)制信號(hào)的IQ 數(shù)據(jù)。 關(guān)鍵代碼如下:
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));
}
}
星座圖在數(shù)字調(diào)制識(shí)別中的作用越來越重要[17]。 軟件對(duì)接收機(jī)采集的數(shù)字通信信號(hào)的IQ 數(shù)據(jù)進(jìn)行解析并繪制在星座圖上,正交相移鍵控(Quadrature Phase Shift Keying,QPSK)信號(hào)的星座如圖6 所示。
圖6 QPSK 星座
星座圖窗口顯示接收機(jī)采集的數(shù)字通信信號(hào)的星座圖。 點(diǎn)擊界面右下方按鈕,通過Qt 的信號(hào)槽機(jī)制調(diào)用相應(yīng)的按鈕響應(yīng)槽函數(shù),實(shí)現(xiàn)加載數(shù)據(jù)、保存數(shù)據(jù)、停止工作等功能。 Qt5 之后,槽函數(shù)可通過lambda 函數(shù)表達(dá)式實(shí)現(xiàn)。
點(diǎn)擊“加載數(shù)據(jù)” 按鈕, 調(diào)用Qt 框架中的QFileDialog 類創(chuàng)建文件選擇對(duì)話框,打開由DATA_PATH 宏指定的IQ 數(shù)據(jù)文件存放目錄,選擇IQ 數(shù)據(jù)文件進(jìn)行加載。 加載文件后,對(duì)文件數(shù)量進(jìn)行判斷,如果選擇的文件數(shù)大于0,則啟動(dòng)一個(gè)定時(shí)器,依次讀取并解析選擇的IQ 數(shù)據(jù)文件,根據(jù)解析出的IQ 數(shù)據(jù)繪制星座圖。 關(guān)鍵代碼如下:
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 數(shù)據(jù)并繪制星座圖, 是通過函數(shù)readAndDraw()實(shí)現(xiàn)的,關(guān)鍵代碼如下: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,[=]()
}
點(diǎn)擊“保存數(shù)據(jù)”按鈕,對(duì)當(dāng)前顯示的星座圖進(jìn)行截圖,保存到指定目錄中。 關(guān)鍵代碼如下: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");});
點(diǎn)擊“停止工作”按鈕,停止顯示星座圖,并將星座圖上的數(shù)據(jù)清空。 關(guān)鍵代碼如下:
connect(btnStop, &QPushButton::clicked, this,[=](){
stopTimer();
m_starMap->clearData();
});
文章針對(duì)數(shù)字通信信號(hào)調(diào)制識(shí)別對(duì)星座圖數(shù)據(jù)的需求,提出了一種應(yīng)用Qt 的星座圖顯示存儲(chǔ)方法,使用Qt 圖形界面框架開發(fā)了星座圖顯示及存儲(chǔ)軟件。 該軟件具有良好的用戶交互界面,筆者對(duì)不同調(diào)制類型的數(shù)字通信信號(hào)的星座圖進(jìn)行了演示,為后續(xù)基于星座圖的調(diào)制識(shí)別提供了數(shù)據(jù)支撐。 軟件顯示的星座圖是基于合作方提供的IQ 數(shù)據(jù)繪制的,下一步工作是將基于星座圖的調(diào)制識(shí)別算法合并入軟件中并實(shí)現(xiàn)對(duì)非合作方數(shù)字通信信號(hào)星座圖的繪制及其調(diào)制方式的識(shí)別。