摘 要:為解決大容量遙測數(shù)據(jù)文件的快速分割,軟件針對遙測文件以幀為基本單位且每幀頭都含有時碼的特點(diǎn),設(shè)計(jì)按特征參數(shù)截取、按時間截取以及按幀序數(shù)截取等三種方法以滿足不同的截取要求。遙測參數(shù)的解算調(diào)用已成熟的動態(tài)鏈接庫,對于一些耗時的運(yùn)算使用了二分搜索等優(yōu)化算法。該軟件操作方便、截取效率高,在型號應(yīng)用中發(fā)揮了重要作用。
關(guān)鍵詞:遙測; 文件截取; 軟件設(shè)計(jì); 二進(jìn)制; 數(shù)據(jù)圖形顯示
中圖分類號:TN92-34; TP311文獻(xiàn)標(biāo)識碼:A
文章編號:1004-373X(2010)17-0036-03
Design and Implementation of Telemetry File Splitter
JIA Pi-jun
(China Airborne Missile Academy,Luoyang 471009,China)
Abstract: To split large telemetry files rapidly, based on the specialty that every frame in telemetry files has a B-Code at head, three different splitting methods are designed to meet different requirements such as characteristic parameters, time or frame ordinals. The parameter demodulating module adopted the mature DLL, some optimized algorithms are implemented to advance performance. In practical airborne telemetry, this software is convenient and has high efficiency.
Keywords: telemetry; file split; software design; binary; graphical display of data
0 引 言
隨著科技的進(jìn)步,空空導(dǎo)彈的研制越來越復(fù)雜。相應(yīng)地就有越來越多的數(shù)據(jù)信息需要遙測傳輸,這必然導(dǎo)致遙測接收的數(shù)據(jù)文件較大。以3 Mb/s碼率計(jì),10 min的遙測數(shù)據(jù)就有214 MB之多。數(shù)據(jù)處理軟件往往需要經(jīng)過異步幀提取,有效位屏蔽,甚至經(jīng)過費(fèi)時的字符串處理[1]才能得到最終結(jié)果。所以當(dāng)用戶處理這種大文件時往往需要等待很長的時間。如果能夠把這樣大的文件分割成較小的幾個文件然后分別處理,那么處理軟件的運(yùn)行時間就可以縮短到用戶可以忍受的程度。
另一方面,空空導(dǎo)彈的發(fā)射試驗(yàn)往往比較短暫,從導(dǎo)彈離開載機(jī)直到導(dǎo)彈爆炸只有不到1 min的時間。數(shù)據(jù)分析人員最關(guān)心的也正是這段時間的數(shù)據(jù)。而實(shí)際遙測中,為了確保數(shù)據(jù)的可靠接收,會從發(fā)射前5 min開始記錄直到遙測信號完全消失才停止記錄。
這種情況下,如果能夠根據(jù)導(dǎo)彈發(fā)射的特征信號(比如導(dǎo)彈與發(fā)射架分離的信號)來截取遙測數(shù)據(jù)文件也具有重要的實(shí)際意義。
本文通過對實(shí)際需求的分析,提出了按遙測幀數(shù)、時間和特征參數(shù)三種文件截取方法,并在VC 6.0平臺上予以實(shí)現(xiàn)。
1 軟件設(shè)計(jì)
1.1 功能設(shè)計(jì)
在空空導(dǎo)彈遙測中,待傳輸?shù)男盘柖际窍韧ㄟ^多路復(fù)用組裝成一個N字節(jié)長的遙測幀然后調(diào)制傳輸。在接收端解調(diào)后先通過幀同步獲得該N字節(jié)長的遙測幀,然后在幀頭加入8 B的時碼(又稱為B碼)來表示接收到該幀的時刻,如圖1所示。這樣存盤后的文件字節(jié)數(shù)是N+8的整數(shù)倍[2]。
圖1 遙測幀發(fā)送接收過程
因?yàn)檫b測數(shù)據(jù)按幀存放,所以有意義的最小分割單位是幀而不是字節(jié),對文件的截取最后都要?dú)w結(jié)到按幀來截取。因此,軟件的第一個功能同時也是最基本的功能就是按幀的起止序號進(jìn)行分割。
由于文件中每一幀數(shù)據(jù)的幀頭都有B碼,所以將該B碼換算成實(shí)際時間之后也可以根據(jù)時間進(jìn)行截取。
數(shù)據(jù)分析人員一般要求提取導(dǎo)彈發(fā)射后到爆炸這一時間段的數(shù)據(jù),所以利用導(dǎo)彈發(fā)射電氣分離信號(ES)的跳變,截取跳變時刻前5 s直到跳變時刻后50 s的數(shù)據(jù)能夠確保覆蓋所需數(shù)據(jù),同時盡量減小數(shù)據(jù)文件的大小。
典型的電氣分離信號圖形如圖2所示。
圖2 典型電氣分離信號圖形
(a) ES沒有跳變 (b) ES有跳變(c) ES有跳變,信號有野點(diǎn)
(a)圖導(dǎo)彈未發(fā)射,(b)圖導(dǎo)彈發(fā)射,(c)圖導(dǎo)彈正常發(fā)射但信號有野點(diǎn)
通過對圖2的分析可以得出以下結(jié)論:ES跳變點(diǎn)需要通過計(jì)算的來判決,比如當(dāng)前數(shù)據(jù)點(diǎn)與下一數(shù)據(jù)點(diǎn)之差超過信號范圍的2/3,那么就認(rèn)為當(dāng)前點(diǎn)為跳變點(diǎn)。但是對于圖2(c)中有野點(diǎn)的情況這種判決方法就有可能導(dǎo)致誤判。所以最好的辦法是讓用戶參與跳變點(diǎn)的判決。軟件自動找到第一個跳變點(diǎn),用戶可以通過快捷鍵[3]找到下一個跳變點(diǎn),直到正確的跳變點(diǎn)為止。
這種設(shè)計(jì)方法杜絕了跳變點(diǎn)的誤判,同時又能直觀快捷地輔助用戶找到跳變點(diǎn),另外還簡化了軟件的設(shè)計(jì)。
1.2 模塊設(shè)計(jì)
分割一個文件的流程[4],如圖3所示。
分析圖3可以得出軟件必須的幾個模塊:
(1) 打開待分割文件并自動生成分割后文件;
(2) 分割方式選擇;
(3) 特征參數(shù)數(shù)據(jù)繪制;
(4) 起止幀序數(shù)選擇;
(5) 起止時間選擇;
(6) 是否需要剔除無效幀。
最終確定的軟件界面[5-6]如圖4所示。
圖3 文件分割流程圖
圖4 軟件界面
2 軟件實(shí)現(xiàn)
2.1 按特征參數(shù)分割
按特征參數(shù)分割涉及到遙測參數(shù)解算。程序運(yùn)行時首先加載動態(tài)鏈接庫dbreader.dll,postpro.dll和eu.dll。在OnInitDialog中調(diào)用函數(shù)GetTMFrameFormatInfo來獲取遙測幀格式,包括遙測幀的長度,碼率,同步碼位置等信息。然后調(diào)用函數(shù)GetTMParaAllRecord來獲取所有參數(shù)在遙測幀中的位置信息,解算方法等。
當(dāng)用戶從程序界面的參數(shù)下拉列表框中選擇一個參數(shù)時,觸發(fā)CBN_SELCHANGE事件并調(diào)用消息函數(shù)[7]。在消息函數(shù)中根據(jù)參數(shù)是幀同步數(shù)據(jù)還是幀異步數(shù)據(jù)分別調(diào)用GetASyncParaValue函數(shù)或EUConvert函數(shù)解算出數(shù)據(jù),同時從數(shù)據(jù)中找出跳變點(diǎn),然后在圖形控件上繪出曲線。
2.2 按B碼時間分割
要想根據(jù)時間信息來查找對應(yīng)的遙測幀就需要將該時間和文件中各遙測幀頭的B碼代表的時間進(jìn)行比較。如果采用遍歷查找的方法,對于總幀數(shù)為N的文件,理論上需要比較(N+1)/2次,要找到起、止兩個時間對應(yīng)的幀就要比較N+1次。這對于較大的文件來說消耗的時間會很長。
在遙測文件中,每幀數(shù)據(jù)都是按接收到的先后順序從前往后依次存放。也就是說,搜索的目的序列是有序的。對于這種情況,可以采用折半查找法[8]進(jìn)行搜索。理論證明,采用折半查找最多需要的比較次數(shù)為log2(n+1),搜索起、止兩個時間共需比較2*log2(n+1)次。
2.3 按幀序數(shù)分割
三種分割方式最后都?xì)w結(jié)到按幀分割。按幀分割惟一復(fù)雜的地方就是剔除無效幀。要剔除無效幀需要將每一幀數(shù)據(jù)的同步碼取出來和標(biāo)準(zhǔn)的同步碼進(jìn)行比較。如果差異位數(shù)超過容許值就丟棄該幀,否則保留。很多程序都采用依次右移一位,看二者最低位是否相同,如果不同則計(jì)數(shù)加1,循環(huán)直到兩個數(shù)都為零的方法。
這種方法效率非常低。本文采用了如圖5所示的計(jì)算方法[9]。
圖5 計(jì)算同步碼錯誤位數(shù)
這種算法的關(guān)鍵在兩處:首先對兩個被比較數(shù)a和b按位異或,結(jié)果c的二進(jìn)制數(shù)中為1的位置就是a和b不一致的位置。然后c不停地與c-1按位與[3]并將結(jié)果賦給c,直到c為0。通過歸納法可以證明c與c-1按位與可以消掉c的從低位往高位數(shù)的第一個1,所以c的二進(jìn)制值有幾個1就循環(huán)幾次。
3 結(jié) 語
本遙測軟件采用模塊化設(shè)計(jì),便于實(shí)現(xiàn)和測試。同時結(jié)合遙測文件的結(jié)構(gòu),實(shí)現(xiàn)了按幀序數(shù)、按時間和按特征參數(shù)三種分割方法,較好地滿足了型號遙測數(shù)據(jù)處理的需求。從軟件的設(shè)計(jì)可以看出,對于較復(fù)雜的軟件采用自頂向下,逐漸細(xì)化的分析方法,分模塊設(shè)計(jì)[10];對于影響程序性能的處理過程有針對性地進(jìn)行優(yōu)化,可以有效地提高程序的可靠性和性能并簡化設(shè)計(jì)過程。
參考文獻(xiàn)
[1]李亞.遙測數(shù)據(jù)處理中導(dǎo)出參數(shù)模塊的設(shè)計(jì)[J].航空兵器,2009(6):47-49.
[2]李英麗,劉春亭.空空導(dǎo)彈遙測系統(tǒng)設(shè)計(jì)[M].北京:國防工業(yè)出版社,2006.
[3]侯俊杰.深入淺出MFC[M].2版.武漢:華中科技大學(xué)出版社,2000.
[4]嚴(yán)蔚敏,吳偉民.數(shù)據(jù)結(jié)構(gòu)(C語言版)[M].北京:清華大學(xué)出版社,2006.
[5]官章全,韓云君,李顯.Visual C++ 6.0高級編程范例[M].北京:電子工業(yè)出版社,2000.
[6][美]KRUGLINSKI David J. Visual C++技術(shù)內(nèi)幕(修訂版)[M].潘愛民,王國印,譯.4版.北京:清華大學(xué)出版社,2009.
[7]管建和,夏軍寶.Windows程序設(shè)計(jì)[M].北京:人民郵電出版社,2002.
[8]譚浩強(qiáng).C語言程序設(shè)計(jì)[M].北京:清華大學(xué)出版社,2001.
[9]《編程之美》小組.編程之美[M].北京:電子工業(yè)出版社,2008.
[10][美]STROUSTRUP Bjarne. The C++ programming language[M].北京:高等教育出版社,2001.