2009-08-28 20 views
4

我需要一個快速的解壓縮程序二進制(十六進制數據)禁區資源環境優化像嵌入式系統例程,它具有以下特點:什麼將是一個很好的(de)壓縮爲這種情況

  1. 數據是8位(字節)導向(數據總線是8位寬)。
  2. 字節值不是從0到0xFF的範圍,而是在每個DataSet中都有一個泊松分佈(鐘形曲線)。 (被燒燬到Flash)
  3. 數據集固定在先進,每組很少> 1 - 2MB

壓縮可以隨着時間的需要一樣多,但一個字節減壓應採取23uS在最壞因爲它將在像嵌入式系統(3Mhz - 12Mhz核心,2k字節RAM)這樣的受限資源環境中完成。

什麼是一個很好的解壓程序?

基本運行長度編碼似乎太浪費了 - 我可以馬上看到,添加標題相間螺旋纏繞製成的壓縮數據,以投入使用未使用的字節值來表示經常重複的模式會給驚人的表現!

隨着我,誰只投入了幾分鐘,肯定有必須已經存在,從誰愛這東西的人更好的算法?

我想有一些「蓄勢待發」的例子嘗試在電腦上,這樣我可以比較性能面對面的人基本RLE。

+0

你真的指256字節的RAM嗎?因此,如果一個壓縮字節可以擴展到> 256個未壓縮字節,那麼它們就沒有空間了。 –

+0

連續字節之間是否存在關聯?壓縮是否有損? – David

+0

如果這與6502或z80類似,大多數(所有?)指令都需要幾個時鐘週期,並且在2MHz時需要超過1微秒的時間。 – David

回答

4

這兩種方案我使用性能時只關注:

  • LZO是GPL的。
  • liblzf擁有BSD許可。
  • miniLZO.tar.gz這是LZO,只是重新打包到一個更適合嵌入式開發的'縮小'版本。

兩者都是極其快速解壓時。我發現在大多數情況下,LZO將創建比liblzf略小的壓縮數據。您需要爲速度做自己的基準測試,但我認爲它們「基本相等」。兩者都比zlib快光年,儘管兩者都沒有壓縮(就像你期望的那樣)。

LZO,特別是miniLZOliblzf對於嵌入式目標都是優秀的。

2

好了,主要的兩個算法,腦海中出現HuffmanLZ

第一個基本上只是創建一個字典。如果你充分限制字典的大小,它應該是相當快的......但不要指望有很好的壓縮。

後者作品通過向重複輸出文件的部分反向引用。這可能需要很少的內存來運行,除了需要使用文件I/O讀取後向引用或將最近讀取的數據塊存儲在RAM中。

我懷疑LZ是最好的選擇,如果重複的部分往往是彼此接近。正如你所提到的,霍夫曼的工作是製作一個經常重複的元素字典。

+1

如果PoorLuzer有更多的RAM和CPU週期可以工作,那麼任何一個都可能是可行的,但如果約束真的如上所述,我認爲他問的是不可能的。 –

+0

我從一位會做實際編程的朋友那裏聽到了一些錯誤,我上次發佈的值和更新了帖子以反映更準確的值。這種東西對我來說是新的,因爲我一直爲OS編程。 – PoorLuzer

4

如果您預設的值分佈意味着每個值的可行性在所有數據集中都是固定的,您可以使用固定代碼創建huffman編碼(代碼樹不會嵌入到數據中)。

根據數據,我會嘗試使用固定代碼或lz77的huffman(請參閱Brian的鏈接)。

1

您應該嘗試使用帶命令行開關的壓縮軟件工具或可以嘗試不同算法的壓縮庫來嘗試不同的壓縮算法。 爲您的應用程序使用典型數據。然後你知道哪種算法最適合你的需求。

+0

是的,但問題是大多數軟件壓縮工具針對PC而不是嵌入式系統,因此對可用資源的數量有不同的假設。 – PoorLuzer

2

因爲這似乎是音頻,我會看差分PCM或ADPCM,或類似的東西,這將減少到4位/樣本沒有太多的質量損失。

使用最基本的差分PCM實現,只需在當前樣本和累加器之間存儲一個4位有符號差值,然後將該差值添加到累加器並移至下一個樣本。如果它與[-8,7]之外的差值,則必須鉗位該值,並且可能需要幾個樣本才能使累加器跟上。使用幾乎沒有內存的解碼非常快,只需將每個值添加到累加器並輸出累加器作爲下一個採樣。

與基本DPCM相比有一點小改進,當信號變大時,累加器可以更快地追上,更高的音高是使用查找表將4位值解碼爲更大的非線性範圍, 1分開接近零,但以更大的增量朝着極限增加。和/或您可以保留其中一個值來切換乘數。決定何時使用它到編碼器。通過這些改進,您可以獲得更好的質量,或者每個樣本3位而不是4位。

如果您的設備具有非線性μ律或A律ADC,則可以獲得與11 -12位,8位採樣。或者你可以在你的解碼器中自己做。 http://en.wikipedia.org/wiki/M-law_algorithm

有可能是廉價的芯片,已經爲你做了這一切,這取決於你在做什麼。我沒有看過任何。

+0

這不適用於音頻:-)它實際上是用一個經典的UART發送一個預定義的曼切斯特編碼數據集,通過對位的每一位進行「位反轉」。這個過程繼續進行,沒有剩餘字節。 – PoorLuzer

+1

我之所以假定是因爲正態分佈,是因爲23uS與44.1khz相匹配。 – David

1

我已經在嵌入式系統中使用zlib作爲引導加載程序,在啓動時將應用程序映像解壓縮到RAM中。許可證很好寬容,沒有GPL廢話。它確實做了一個malloc調用,但在我的情況下,我簡單地用一個存根返回了一個指向靜態塊的指針和一個相應的free()存根。我通過監控其內存分配使用情況來實現這一點,以確保正確的大小。如果你的系統可以支持動態內存分配,那麼它就簡單得多。

http://www.zlib.net/

相關問題