文獻標識碼: B
文章編號: 0258-7998(2012)11-0041-03
在多傳感器測量系統中,為了精確測量,需要對傳感器輸出信號進行高速、高分辨率采樣[1]。這樣勢必會產生大量需要存儲的數據,占用很大的存儲空間,同時也不便于實時傳輸。但在一些嵌入式系統中,由于受到工藝、成本等各種因素的限制,存儲器空間非常有限,以至于經常采取降低采樣率的辦法來達到節省存儲空間的目的。為此,在采樣率和分辨率均不能降低的情況下,為了保證測量精度,對傳感器信號進行壓縮存儲、傳輸是十分必要的。
目前,有關傳感器數據壓縮傳輸的研究有:(1)參考文獻[2]提出一種存儲有效的漸進小波數據壓縮算法,使得漸進傳送的數據單元能產生大的編碼增益,在存儲有效的同時又能夠節省網絡傳輸耗能;(2)參考文獻[3]提出了一種基于改進的二叉樹算法對原始采樣數據進行實時壓縮,對采樣數據在二維方向上進行去冗余處理,從而達到節省數據存儲空間、提高數據傳輸效率的目的;(3)參考文獻[4]針對測井傳感器數據特征將其分為兩類,第一類采用差分編碼(預處理),再用Huffman編碼壓縮輸出,第二類采用基于統計的預測模型和分段線性預測模型(PLOT)進行處理輸出。
但以上幾種方法都是有損壓縮,無法完全恢復出原始數據,并且壓縮數據前后都有相關性,沒有提出一旦出現誤碼或丟包情況將如何正確解壓的問題。本文以無損壓縮方法中性能較優的Zlib為基礎,并采取改進措施,在保證壓縮率和實時性的前提下,解決網絡傳輸中誤碼和丟包容錯問題,同時對測井傳感器數據進行了測試實驗。
1 Zlib無損壓縮方法
無損壓縮就是利用數據的統計冗余進行壓縮,并可完全回復原始數據而不引起任何失真。典型的無損壓縮算法如Shanno-Fano編碼、Huffman(哈夫曼)編碼、算術編碼、游程編碼、LZW編碼、LZ編碼以及應用最廣也是最好的結合LZ和Huffman編碼的DEFLATE編碼,其主要應用在RAR、LZMA、Zlib、Gzip、Bzip等壓縮算法中。
雖然LZMA具有好的壓縮率,但是消耗資源過大(最小資源消耗在1 MB左右)且壓縮速率很慢,不適合實際嵌入式應用。所以本文選用Zlib壓縮算法,其中SYNC_FLUSH模式下的流程圖如1所示。
首先初始化程序,然后將待壓縮數據存到處理窗口中,用LZ算法對待壓縮數據進行預處理。一方面通過Hash算法生成并不斷更新當前塊的壓縮字典;另一方面通過查找字典將數據匹配情況存到緩沖區中并統計其頻率。這樣通過未匹配字節、匹配長度和匹配距離描述了原始數據的匹配關系。當處理窗口數據被處理完之后,再利用動態和靜態Huffman算法對其匹配情況進行編碼,并比較選擇壓縮效果好的Huffman算法進行壓縮編碼輸出。但是如果選擇的是動態Huffman算法,還需要在壓縮數據之前用deflate_tree編碼壓縮動態Huffman字典編碼并輸出。當每個壓縮塊完成之后再加上Zlib容錯方式,如果是最后一個壓縮塊,則還需要最后輸出校驗信息,否則需要重新初始化壓縮下一個數據塊。
2 改進的Zlib算法
2.1 基本思想
源Zlib壓縮算法中,SYNC_FLUSH模式雖然通過添加header信息和Zlib容錯方式字段實現分包壓縮,同時每個壓縮塊都重新生成字典實現相互獨立,但是仍然不能解決容錯問題,原因如下。
(1)如果壓縮數據在網絡傳輸過程中出現誤碼的情況,并且誤碼之后的數據又能夠通過當前塊的壓縮字典解壓,但是解壓錯誤,而最后輸出錯誤的解壓結果不報錯;
(2)如果出現丟包的情況,則解壓過程中會報異常且直接終止跳出,導致后面正確的壓縮塊不能正常解壓。
針對以上兩個問題,本文提出改進并實現獨立分包壓縮并且能夠獨立解壓的方法,以解決因網絡傳輸導致的誤碼和丟包的容錯問題。此外,根據實際程序應用修改滑動窗口大小和內存消耗等級,大大減小了內存資源消耗。
2.2 獨立分包壓縮的算法流程
每次讀4 KB樣本數據,然后獨立壓縮成一個壓縮塊放到輸出緩沖區,當輸出緩沖區內滿2 KB數據時就寫到輸出文件中。每次把4 B檢錯信息adler寫到壓縮塊最后(Zlib容錯方式0x0000ffff之前),便于解壓檢錯實現容錯機制。這樣就得到如圖2所示的壓縮數據格式。
獨立分包壓縮要求每次都要初始化字典并重新建立字典,這樣會導致壓縮率(壓縮率=壓縮后數據大小/壓縮前數據大小)提高(即壓縮效果變差)。但是測試表明,壓縮效果較壓縮效果最好的NO_FLUSH模式(其生成的壓縮包之間相互關聯,如果出現誤碼或丟包情況,就會使出錯后的壓縮塊不能解壓)并沒有下降很多,壓縮率只提高了2%;而與源程序的SYNC_FLUSH模式壓縮率幾乎相等,因為雖然每個壓縮包都加了4 B的檢錯信息,但是只有第一個壓縮塊加了2 B的header信息,而源程序中每個壓縮塊都要加header信息且最后一個加了檢錯信息,最終生成的壓縮數據比源程序多(2×N-2)B,其中N表示壓縮塊的個數。由于都是獨立分包壓縮,解壓可以容錯,并且可以極大地減小其程序消耗的資源。因為這時并不需要分配大的滑動字典窗口和字典空間,優化之后總共動態分配空間為96 KB左右,而NO_FLUSH模式下資源消耗在260 KB左右。
2.3 獨立解壓的算法流程
本文是模擬傳感器數據獨立分包壓縮再整體解壓,因為在實際工程中解壓程序是源源不斷地從輸入緩沖區中讀數據解壓。但是如果讀入的待解壓數據出現誤碼和丟包情況(而解壓程序并不知道),解壓程序必須實現獨立解壓功能,即丟棄出錯的壓縮塊而又不影響后面的正確的壓縮塊解壓,這就要求每個壓縮包必須是獨立壓縮。采用在每個壓縮塊后面寫入檢錯信息adler和Zlib容錯方式就能很好地解決這個問題。具體解壓流程圖如圖3所示。
為了便于誤碼或丟包的測試,將壓縮數據存放在一個緩沖區中。這就要求預判壓縮數據大小再分配緩沖區空間保證有足夠大,再整體解壓;然后就是模擬誤碼和丟包情況:因為在分包壓縮過程中可以統計每個壓縮塊的大小,再根據壓縮塊的格式就可很容易修改Zlib頭信息、壓縮數據、檢錯信息和Zlib容錯方式來模擬誤碼,并且通過移除一定長度的壓縮數據來模擬丟包情況;最后對測井傳感器數據測試驗證了容錯能力。
2.4 壓縮算法的DSP實現
首先在CCS3.3編譯環境下,選擇F2812的Device Simulator仿真。其DSP擴展一個256 KB的片外空間,因為程序在F2812中測試程序總空耗(程序執行消耗總資源,包括動態分配heap空間96 KB左右)為140 KB左右,并選擇大寄存器模式;設置heap大小;在調試程序通過之后選擇XDS560 emulator將程序下載到F2812上運行。在運行之前設置一個定時中斷,定時從樣本數據文件中讀數據到輸入緩沖區,而在壓縮程序中每次直接從輸入緩沖區中讀數據進行壓縮。
3 實驗與分析
在現代傳感器遙測遙傳網絡中,石油測井網絡是極具代表性的。隨著測井技術的發展,尤其是組合測井、成像測井的出現,造成了測井數據的快速膨脹。但是數據傳輸帶寬的限制和實時的要求,不能夠把這些數據實時而可靠地傳到地面,成為阻礙測井技術發展的一大問題,迫切需要解決。而應用無損數據壓縮技術來減小數據傳輸量是最有效途徑之一[5]。
所以本文以石油測井網絡為例,利用DSP F2812嵌入式平臺對測井數據進行實時壓縮,并把壓縮后的數據實時傳到地面PC機后再由網絡傳輸到控制中心進行實時解壓縮。測試結果如表1所示。其中樣本數據主要由自然伽瑪能譜測井儀、方位測井儀、電纜遙測傳輸儀、總線適配器等儀器采集生成。
測試結果表明,不同類型測井數據樣本壓縮率、時延和壓縮速率差異還是很明顯的,主要由于不同樣本文件的數據結構差異很大。而且在滿足獨立分包壓縮前提下,每個包都要重新建立字典,包越小壓縮效果越差,而本方法的包只有4 KB,壓縮率基本上都在60%以下,但實時性也能達標。因為壓縮速率大于測井儀器的采集數據速率(這取決于不同的儀器速率傳輸能力和采集間隔的控制,但最大不超過500 kb/s)。而在沒改進之前,farheap空間占192 KB,heap空間占40 KB,程序總消耗約為260 KB,所以改進后的Zlib算法運行所占資源很少且壓縮效果很好,適合于嵌入式平臺應用。由于壓縮程序的移植優化只是在算法和程序結構上,并沒有進一步在匯編級別上的優化,因此壓縮速率提升空間還很大。
本文針對傳感器數據在分組傳輸環境下的特點和要求,提出基于Zlib的傳感器數據壓縮方法,并在DSP嵌入式平臺上得到應用驗證。本壓縮方法具有良好的壓縮效果和壓縮速率,并且能夠實現分包壓縮獨立解壓,解決了在網絡傳輸過程中誤碼和丟包的容錯問題,
參考文獻
[1] LEMING S K,STALFORD H L.Bridge weigh-in-motion system development using superposition of dynamic truck/static bridge Interaction[C].IEEE American Control Conference,2003.
[2] 周四望,林亞平,葉松濤,等.傳感器網絡中一種存儲有效的小波漸進數據壓縮算法[J].計算機研究與發展,2009,46(12):2085-2092.
[3] 劉貞,王祁.多傳感器信號數據采集實時壓縮算法[J].傳感技術學報,2006,19(6):2712-2715.
[4] 漢澤西,郭楓,呂飛.測井數據的無損壓縮方法研究[J]. 現代電子技術,2004(22):94-96.
[5] 郭楓,漢澤西.測井數據的無損壓縮方法研究[D].西安:西安石油大學,2005.