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