葉潤武+胡潔+劉委+孫旭+高亞紅
摘 要:隨著車聯(lián)網(wǎng)技術(shù)的不斷發(fā)展,海量數(shù)據(jù)傳輸和存儲(chǔ)成為關(guān)鍵問題,普通壓縮算法壓縮效率難以滿足需要。根據(jù)LZW算法原理,結(jié)合車聯(lián)網(wǎng)系統(tǒng)中發(fā)動(dòng)機(jī)參數(shù)數(shù)據(jù)傳輸特點(diǎn),對LZW算法的字典初始化、字典查找方式、字典大小進(jìn)行改進(jìn),并應(yīng)用于車聯(lián)網(wǎng)系統(tǒng)。現(xiàn)場測試結(jié)果表明,當(dāng)數(shù)據(jù)達(dá)到一定量后,改進(jìn)的LZW壓縮算法性能趨于穩(wěn)定,壓縮率較普通LZW壓縮算法提高了30%,滿足了發(fā)動(dòng)機(jī)系統(tǒng)數(shù)據(jù)壓縮的應(yīng)用需求。
關(guān)鍵詞:LZW算法;車聯(lián)網(wǎng);數(shù)據(jù)壓縮;字典編碼
DOIDOI:10.11907/rjdk.171195
中圖分類號:TP319
文獻(xiàn)標(biāo)識碼:A 文章編號:1672-7800(2017)007-0152-03
0 引言
隨著電子技術(shù)的不斷進(jìn)步,發(fā)動(dòng)機(jī)監(jiān)測技術(shù)已從簡單控制發(fā)展到現(xiàn)代電子控制。為了減少線束、提高信號利用率、共享和傳輸大批量發(fā)動(dòng)機(jī)運(yùn)行狀態(tài)參數(shù),車聯(lián)網(wǎng)成為汽車電子化發(fā)展的重要環(huán)節(jié)[1]。為了準(zhǔn)確采集與分析發(fā)動(dòng)機(jī)運(yùn)行狀態(tài)參數(shù),需對發(fā)動(dòng)機(jī)運(yùn)行狀態(tài)參數(shù)實(shí)時(shí)采集,傳輸給上位機(jī)。由于采集頻率較高,龐大的數(shù)據(jù)量不僅給網(wǎng)絡(luò)傳輸帶來擁塞,而且給數(shù)據(jù)庫存儲(chǔ)帶來巨大壓力[2]。對此,除了優(yōu)化數(shù)據(jù)庫的存儲(chǔ)結(jié)構(gòu)外,數(shù)據(jù)壓縮尤為重要。LZW算法以其獨(dú)特的優(yōu)點(diǎn)廣泛應(yīng)用于數(shù)據(jù)壓縮領(lǐng)域。LZW算法可以有效利用字符出現(xiàn)次數(shù)的冗余度進(jìn)行壓縮,自適應(yīng)產(chǎn)生字典,對數(shù)據(jù)流中重復(fù)出現(xiàn)的字節(jié)和字串,LZW壓縮技術(shù)具有很高的壓縮比[3]。
1 發(fā)動(dòng)機(jī)參數(shù)采集系統(tǒng)組成
發(fā)動(dòng)機(jī)參數(shù)采集系統(tǒng)主要由兩大部分組成:①無線數(shù)據(jù)模塊(發(fā)動(dòng)機(jī)參數(shù)采集模塊),由主控制器芯片MC9S08DZ60組成數(shù)據(jù)采集單元。電子控制單元通過CAN總線采集ECU節(jié)點(diǎn)數(shù)據(jù),CAN模塊接口電路作為通信橋梁。根據(jù)TCP/IP協(xié)議,通過GPRS與上位機(jī)實(shí)現(xiàn)多機(jī)串口通信;②基于客戶/服務(wù)器(C/S)結(jié)構(gòu),以數(shù)據(jù)庫技術(shù)為核心,編寫數(shù)據(jù)采集管理系統(tǒng)并通過多線程技術(shù)開發(fā)基于TCP協(xié)議的多客戶機(jī)/服務(wù)器通信程序[4],采用Web 技術(shù),開發(fā)一個(gè)基于 B/S 模式的遠(yuǎn)程查詢和分析系統(tǒng)。本文主要研究第①部分,如圖1所示。
系統(tǒng)由無線數(shù)據(jù)模塊、服務(wù)器軟件和用戶終端3個(gè)模塊組成。本文研究的是無線數(shù)據(jù)模塊和數(shù)據(jù)壓縮。
1.1 無線數(shù)據(jù)模塊設(shè)計(jì)
無線數(shù)據(jù)模塊包含硬件和軟件兩部分。軟件按照分層架構(gòu),分為接口層和應(yīng)用層,接口設(shè)計(jì)成函數(shù)調(diào)用型底層軟件,應(yīng)用層實(shí)現(xiàn)通信與控制功能。對于不同的應(yīng)用對象和功能需求,可修改和添加功能以滿足需要。系統(tǒng)組成如圖2所示。
1.2 數(shù)據(jù)處理模塊設(shè)計(jì)
數(shù)據(jù)采集完后需要進(jìn)行一系列處理,使其更好地傳輸,主要包括數(shù)據(jù)分類、轉(zhuǎn)化。之后,為了方便傳輸,減少帶寬,緩解數(shù)據(jù)庫存儲(chǔ)壓力,對轉(zhuǎn)化后的數(shù)據(jù)進(jìn)行預(yù)處理和壓縮。上下位機(jī)的通信按照已經(jīng)定義好的通信協(xié)議進(jìn)行。
每幀數(shù)據(jù)中的ID號代表數(shù)據(jù)類型,首先根據(jù)ID對數(shù)據(jù)進(jìn)行分類,之后讀取參數(shù)值,流程如圖3所示。
2 數(shù)據(jù)壓縮
2.1 LZW編碼原理
LZW編碼器是一種貪婪分析算法,每次對字符的編碼都要順序檢查輸入的數(shù)據(jù)流,從字典中找出已經(jīng)出現(xiàn)過的最長字符串,并輸出對應(yīng)的索引值[5]。LZW編碼算法實(shí)現(xiàn)步驟:①將字典中的0-255項(xiàng)初始化,當(dāng)前前綴P為空;②將字符流中第一個(gè)字符存入當(dāng)前字符串P中;③輸入下一個(gè)字符串x,然后判斷P+x是否在字典中。若是,P=P+x,若否,輸出代表當(dāng)前前綴P的碼字,并把字符串P+x添加到字典,再令P=x;④判斷當(dāng)前碼字流中是否還有碼字要編碼。若有,返回步驟②,若沒有,將當(dāng)前字符串的編碼輸出即可,程序結(jié)束。
2.2 數(shù)據(jù)預(yù)處理模塊
無線數(shù)據(jù)模塊采集完參數(shù)后,存入芯片的RAM區(qū),在進(jìn)行LZW壓縮前,需要對采集的參數(shù)作預(yù)處理,數(shù)據(jù)結(jié)構(gòu)如圖4所示。
無線數(shù)據(jù)模塊主要采集心跳信息、發(fā)動(dòng)機(jī)參數(shù)信息和GPS位置信息3種數(shù)據(jù),如圖5所示。
在通信協(xié)議中,定義了不同的端口號和標(biāo)識符對其進(jìn)行接收。這3種數(shù)據(jù)的端口號和標(biāo)識符是對應(yīng)的,處理步驟:①去掉端口號和標(biāo)識符,用m,n和h代替;②因?yàn)橄到y(tǒng)采集的發(fā)動(dòng)機(jī)參數(shù)有96種之多,為了方便后續(xù)字典查找,本系統(tǒng)對96種發(fā)動(dòng)機(jī)參數(shù)設(shè)置索引,參數(shù)索引值加入LZW編碼的前綴直接存儲(chǔ)在字典中[6]。
2.3 字典初始化改進(jìn)
在LZW算法中,首先按碼表初始化256個(gè)字符,這就是字典的初始項(xiàng),實(shí)際是用典型16位指針表示。數(shù)據(jù)壓縮算法的主要改進(jìn)思想是利用變字長的碼字進(jìn)行編碼,通過編碼過程設(shè)置步驟號來改進(jìn)編碼的存儲(chǔ)字節(jié)數(shù)[5]。假設(shè)現(xiàn)在的位號為1,要輸出其編碼的位數(shù),其位數(shù)為整數(shù),壓縮過程和解碼過程一一對應(yīng),則可以通過步驟號來準(zhǔn)確判斷編碼位數(shù),從而得到正確的解碼。發(fā)動(dòng)機(jī)參數(shù)的內(nèi)容多為發(fā)動(dòng)機(jī)運(yùn)行狀態(tài)參數(shù)信息、故障代碼等,以十六進(jìn)制進(jìn)行存儲(chǔ)發(fā)送,發(fā)動(dòng)機(jī)參數(shù)為0,1,3,4,5,6,7,8,9,A,B,C,D,E,F(xiàn)這16種字符格式。首先初始化前16項(xiàng),初始化編碼位數(shù)采用8位,大大減少了編碼位數(shù),很大程度上提高了發(fā)動(dòng)機(jī)參數(shù)的壓縮效率和質(zhì)量[7]。
字典初始項(xiàng)只有19個(gè),除了十六進(jìn)制的0~F,還要將替代后的標(biāo)識符和端口號一起寫入字典,相對應(yīng)的索引值就是16,17,18,這樣大大減少了字典的初始項(xiàng)。
2.4 字典查找方式改進(jìn)
LZW算法的字典查找方式是順序查找,當(dāng)字典很大時(shí),查找速度大大降低。本系統(tǒng)中發(fā)動(dòng)機(jī)參數(shù)有96種之多,順序查找時(shí)間過長。因此,對字典的查找方式進(jìn)行改進(jìn),改進(jìn)方式如下:在數(shù)據(jù)預(yù)處理模塊,對發(fā)動(dòng)機(jī)的96種參數(shù)加索引值,在LZW壓縮過程中,索引值作為LZW編碼前綴的一部分。這里分別引入二叉樹查找和哈希查找兩種方式,通過對比,得出當(dāng)數(shù)據(jù)量逐漸增大時(shí),哈希查找的速度明顯高于二叉樹查找,所以在字典的查找方式中,結(jié)合哈希查找,大大提高了數(shù)據(jù)的壓縮速度[8]。endprint
2.5 字典大小改進(jìn)
數(shù)據(jù)存儲(chǔ)在ROM區(qū),MC9S08DZ60芯片的ROM區(qū)大小是4K。發(fā)動(dòng)機(jī)運(yùn)行狀態(tài)參數(shù)具有多樣化和較高的采集頻率,隨著壓縮的不斷進(jìn)行,字典一定會(huì)溢出。為了防止字典溢出,在字典初始化時(shí)設(shè)置溢出標(biāo)識符T,在壓縮過程中,時(shí)刻檢測T值。當(dāng)T=1時(shí),代表字典溢出,這時(shí),自動(dòng)清空字典,重新開始字典初始化。
3 系統(tǒng)實(shí)驗(yàn)
本文主要對無線數(shù)據(jù)模塊進(jìn)行測試。測試包括兩部分:①對無線數(shù)據(jù)模塊數(shù)據(jù)接收進(jìn)行測試,驗(yàn)證發(fā)動(dòng)機(jī)參數(shù)采集的正確性,以此作為本系統(tǒng)是否有效及可靠的依據(jù),為后面的數(shù)據(jù)壓縮提供數(shù)據(jù);②對數(shù)據(jù)壓縮模塊進(jìn)行測試,通過對改進(jìn)的LZW壓縮算法和普通LZW壓縮算法對比,驗(yàn)證算法的壓縮比。
發(fā)動(dòng)機(jī)主要參數(shù)如表1所示。
3.1 測試
發(fā)動(dòng)機(jī)參數(shù)采集準(zhǔn)確性測試,上位機(jī)數(shù)據(jù)接收界面如圖6所示。
通過和預(yù)設(shè)值對比,驗(yàn)證了發(fā)動(dòng)機(jī)參數(shù)采集系統(tǒng)的正確完整性。對100組發(fā)動(dòng)機(jī)參數(shù)的采集,誤差均在精度范圍內(nèi),證明發(fā)動(dòng)機(jī)采集系統(tǒng)安全可靠。
3.2 改進(jìn)的LZW壓縮算法對比實(shí)驗(yàn)
經(jīng)典的LZW壓縮算法壓縮率如表2所示。
改進(jìn)的LZW壓縮算法結(jié)果如表3所示。
通過對多組數(shù)據(jù)壓縮比計(jì)算,發(fā)現(xiàn)壓縮比越來越低,剛開始壓縮比較高的原因是發(fā)動(dòng)機(jī)運(yùn)行狀態(tài)參數(shù)之間的相關(guān)性較低。隨著壓縮數(shù)據(jù)的逐漸增多,字典越來越適應(yīng)于數(shù)據(jù),壓縮率逐漸提高。
4 結(jié)語
發(fā)動(dòng)機(jī)采集實(shí)驗(yàn)表明系統(tǒng)具有正確性、完整性以及安全性。隨著數(shù)據(jù)量的不斷增大,壓縮效果越來越好,改進(jìn)的LZW壓縮算法壓縮率也越來越好。當(dāng)壓縮數(shù)據(jù)量達(dá)到380k時(shí),壓縮效率趨于穩(wěn)定,壓縮比優(yōu)于普通的LZW算法30%,大量節(jié)約了發(fā)動(dòng)機(jī)數(shù)據(jù)采集系統(tǒng)內(nèi)存,提高了壓縮效率與系統(tǒng)性能。
參考文獻(xiàn):
[1]趙楠. 航電數(shù)據(jù)壓縮及傳輸算法研究[D]. 西安:西安電子科技大學(xué), 2011.
[2]劉委.基于LZW算法的發(fā)動(dòng)機(jī)參數(shù)實(shí)時(shí)采集系統(tǒng)的實(shí)現(xiàn)[D].鎮(zhèn)江:江蘇大學(xué),2016.
[3]曾玲, 饒志宏. 幾種數(shù)據(jù)壓縮算法的比較[J]. 通信技術(shù), 2002(9):12-15.
[4]鄭翠芳. 幾種常用無損數(shù)據(jù)壓縮算法研究[J]. 計(jì)算機(jī)技術(shù)與發(fā)展, 2011, 21(9):73-76.
[5]楊燕姣. 基于LZW算法的遙測數(shù)據(jù)實(shí)時(shí)采集壓縮系統(tǒng)的研究[D]. 太原:中北大學(xué), 2014.
[6]王軍選, 田小平, 曹紅梅. 信息論基礎(chǔ)與編碼[M]. 北京:人民郵電出版社, 2011.
[7]李小遐, 高楊. 一種基于字典的無損壓縮改進(jìn)算法研究[J]. 自動(dòng)化與儀器儀表, 2016(2):125-129..
[8]楊長生, 宋廣華, 卓越. HLZ:一種采用混合字典的自適應(yīng)無損編碼算法[J]. 浙江大學(xué)學(xué)報(bào):工學(xué)版, 2002, 36(1):40-43.endprint