摘 要:為解決大容量遙測數據文件的快速分割,軟件針對遙測文件以幀為基本單位且每幀頭都含有時碼的特點,設計按特征參數截取、按時間截取以及按幀序數截取等三種方法以滿足不同的截取要求。遙測參數的解算調用已成熟的動態鏈接庫,對于一些耗時的運算使用了二分搜索等優化算法。該軟件操作方便、截取效率高,在型號應用中發揮了重要作用。
關鍵詞:遙測; 文件截取; 軟件設計; 二進制; 數據圖形顯示
中圖分類號:TN92-34; TP311文獻標識碼: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 引 言
隨著科技的進步,空空導彈的研制越來越復雜。相應地就有越來越多的數據信息需要遙測傳輸,這必然導致遙測接收的數據文件較大。以3 Mb/s碼率計,10 min的遙測數據就有214 MB之多。數據處理軟件往往需要經過異步幀提取,有效位屏蔽,甚至經過費時的字符串處理[1]才能得到最終結果。所以當用戶處理這種大文件時往往需要等待很長的時間。如果能夠把這樣大的文件分割成較小的幾個文件然后分別處理,那么處理軟件的運行時間就可以縮短到用戶可以忍受的程度。
另一方面,空空導彈的發射試驗往往比較短暫,從導彈離開載機直到導彈爆炸只有不到1 min的時間。數據分析人員最關心的也正是這段時間的數據。而實際遙測中,為了確保數據的可靠接收,會從發射前5 min開始記錄直到遙測信號完全消失才停止記錄。
這種情況下,如果能夠根據導彈發射的特征信號(比如導彈與發射架分離的信號)來截取遙測數據文件也具有重要的實際意義。
本文通過對實際需求的分析,提出了按遙測幀數、時間和特征參數三種文件截取方法,并在VC 6.0平臺上予以實現。
1 軟件設計
1.1 功能設計
在空空導彈遙測中,待傳輸的信號都是先通過多路復用組裝成一個N字節長的遙測幀然后調制傳輸。在接收端解調后先通過幀同步獲得該N字節長的遙測幀,然后在幀頭加入8 B的時碼(又稱為B碼)來表示接收到該幀的時刻,如圖1所示。這樣存盤后的文件字節數是N+8的整數倍[2]。
圖1 遙測幀發送接收過程
因為遙測數據按幀存放,所以有意義的最小分割單位是幀而不是字節,對文件的截取最后都要歸結到按幀來截取。因此,軟件的第一個功能同時也是最基本的功能就是按幀的起止序號進行分割。
由于文件中每一幀數據的幀頭都有B碼,所以將該B碼換算成實際時間之后也可以根據時間進行截取。
數據分析人員一般要求提取導彈發射后到爆炸這一時間段的數據,所以利用導彈發射電氣分離信號(ES)的跳變,截取跳變時刻前5 s直到跳變時刻后50 s的數據能夠確保覆蓋所需數據,同時盡量減小數據文件的大小。
典型的電氣分離信號圖形如圖2所示。
圖2 典型電氣分離信號圖形
(a) ES沒有跳變 (b) ES有跳變(c) ES有跳變,信號有野點
(a)圖導彈未發射,(b)圖導彈發射,(c)圖導彈正常發射但信號有野點
通過對圖2的分析可以得出以下結論:ES跳變點需要通過計算的來判決,比如當前數據點與下一數據點之差超過信號范圍的2/3,那么就認為當前點為跳變點。但是對于圖2(c)中有野點的情況這種判決方法就有可能導致誤判。所以最好的辦法是讓用戶參與跳變點的判決。軟件自動找到第一個跳變點,用戶可以通過快捷鍵[3]找到下一個跳變點,直到正確的跳變點為止。
這種設計方法杜絕了跳變點的誤判,同時又能直觀快捷地輔助用戶找到跳變點,另外還簡化了軟件的設計。
1.2 模塊設計
分割一個文件的流程[4],如圖3所示。
分析圖3可以得出軟件必須的幾個模塊:
(1) 打開待分割文件并自動生成分割后文件;
(2) 分割方式選擇;
(3) 特征參數數據繪制;
(4) 起止幀序數選擇;
(5) 起止時間選擇;
(6) 是否需要剔除無效幀。
最終確定的軟件界面[5-6]如圖4所示。
圖3 文件分割流程圖
圖4 軟件界面
2 軟件實現
2.1 按特征參數分割
按特征參數分割涉及到遙測參數解算。程序運行時首先加載動態鏈接庫dbreader.dll,postpro.dll和eu.dll。在OnInitDialog中調用函數GetTMFrameFormatInfo來獲取遙測幀格式,包括遙測幀的長度,碼率,同步碼位置等信息。然后調用函數GetTMParaAllRecord來獲取所有參數在遙測幀中的位置信息,解算方法等。
當用戶從程序界面的參數下拉列表框中選擇一個參數時,觸發CBN_SELCHANGE事件并調用消息函數[7]。在消息函數中根據參數是幀同步數據還是幀異步數據分別調用GetASyncParaValue函數或EUConvert函數解算出數據,同時從數據中找出跳變點,然后在圖形控件上繪出曲線。
2.2 按B碼時間分割
要想根據時間信息來查找對應的遙測幀就需要將該時間和文件中各遙測幀頭的B碼代表的時間進行比較。如果采用遍歷查找的方法,對于總幀數為N的文件,理論上需要比較(N+1)/2次,要找到起、止兩個時間對應的幀就要比較N+1次。這對于較大的文件來說消耗的時間會很長。
在遙測文件中,每幀數據都是按接收到的先后順序從前往后依次存放。也就是說,搜索的目的序列是有序的。對于這種情況,可以采用折半查找法[8]進行搜索。理論證明,采用折半查找最多需要的比較次數為log2(n+1),搜索起、止兩個時間共需比較2*log2(n+1)次。
2.3 按幀序數分割
三種分割方式最后都歸結到按幀分割。按幀分割惟一復雜的地方就是剔除無效幀。要剔除無效幀需要將每一幀數據的同步碼取出來和標準的同步碼進行比較。如果差異位數超過容許值就丟棄該幀,否則保留。很多程序都采用依次右移一位,看二者最低位是否相同,如果不同則計數加1,循環直到兩個數都為零的方法。
這種方法效率非常低。本文采用了如圖5所示的計算方法[9]。
圖5 計算同步碼錯誤位數
這種算法的關鍵在兩處:首先對兩個被比較數a和b按位異或,結果c的二進制數中為1的位置就是a和b不一致的位置。然后c不停地與c-1按位與[3]并將結果賦給c,直到c為0。通過歸納法可以證明c與c-1按位與可以消掉c的從低位往高位數的第一個1,所以c的二進制值有幾個1就循環幾次。
3 結 語
本遙測軟件采用模塊化設計,便于實現和測試。同時結合遙測文件的結構,實現了按幀序數、按時間和按特征參數三種分割方法,較好地滿足了型號遙測數據處理的需求。從軟件的設計可以看出,對于較復雜的軟件采用自頂向下,逐漸細化的分析方法,分模塊設計[10];對于影響程序性能的處理過程有針對性地進行優化,可以有效地提高程序的可靠性和性能并簡化設計過程。
參考文獻
[1]李亞.遙測數據處理中導出參數模塊的設計[J].航空兵器,2009(6):47-49.
[2]李英麗,劉春亭.空空導彈遙測系統設計[M].北京:國防工業出版社,2006.
[3]侯俊杰.深入淺出MFC[M].2版.武漢:華中科技大學出版社,2000.
[4]嚴蔚敏,吳偉民.數據結構(C語言版)[M].北京:清華大學出版社,2006.
[5]官章全,韓云君,李顯.Visual C++ 6.0高級編程范例[M].北京:電子工業出版社,2000.
[6][美]KRUGLINSKI David J. Visual C++技術內幕(修訂版)[M].潘愛民,王國印,譯.4版.北京:清華大學出版社,2009.
[7]管建和,夏軍寶.Windows程序設計[M].北京:人民郵電出版社,2002.
[8]譚浩強.C語言程序設計[M].北京:清華大學出版社,2001.
[9]《編程之美》小組.編程之美[M].北京:電子工業出版社,2008.
[10][美]STROUSTRUP Bjarne. The C++ programming language[M].北京:高等教育出版社,2001.