基于A(yíng)Tmegal28的LED屏圖像數據解碼設計
2.1 Huffman解碼的實(shí)現
Huffman解碼是解碼過(guò)程中重要的一環(huán)。傳統的哈夫曼解碼需要逐位查找哈夫曼表,進(jìn)行比較判斷,由于查找過(guò)程需要大量的移位及循環(huán)。這樣的解碼效率非常低。針對這種情況,充分考慮到ATmegal28的存儲容量的限制,在讀文件頭時(shí),軟件事先構造出不同碼長(cháng)下的哈夫曼碼字的最小值表和最大值表如表1所示,最小值在哈夫曼表中的索引以及哈夫曼樹(shù)各葉子結點(diǎn)對應的編碼表。
在解碼的時(shí)候,讀取1串二進(jìn)制數據,分別與各碼長(cháng)下的最大值和最小值進(jìn)行比較,如果在哈夫曼表中沒(méi)有該碼長(cháng)的碼字,說(shuō)明該比特數據不是完整的Huff_man編碼,接著(zhù)讀取下一個(gè)比特數據加在前面的比特數據組成的新的碼字,然后再在最小值表和最大值表中進(jìn)行查找,直至找到確切的碼字。最后把該碼字減去同一碼長(cháng)下最小值,加上此最小值在哈夫曼表中的索引即可得到該碼字在編碼表中的位置。
2.2 IDCT變換的實(shí)現
將8×8塊中的顏色分量單元的64個(gè)值逐一乘以對應的量化表內位置相同的系數,然后再將64個(gè)數據進(jìn)行Z字型的重新排列,進(jìn)行IDCT變換。IDCT的運算量很大,其中要進(jìn)行大量的浮點(diǎn)乘法和加法運算,因而在解碼過(guò)程中IDCT所占時(shí)間最多。采用行列分解法先將二維IDCT分解成一維8點(diǎn)的IDCT,對于一維8點(diǎn)IDCT采用Loeffler的快速算法。圖2為L(cháng)oef―fler算法的流程圖,Loeffler算法運算因子的解釋如圖3 所示。
直接對旋轉因子進(jìn)行計算需要4次乘法和2次加法,這樣1次8個(gè)點(diǎn)的一維IDCT變換總共需要14次乘法和26次加法??梢詫πD因子進(jìn)行變形如式(1)所示:
從而1次旋轉因子計算只需要3次乘和3次加。進(jìn)而進(jìn)行1次一維IDCT只需11次乘和29次加。因為乘法運算的代價(jià)高于加法運算,所以這種變形是有益的。完成一次二維的IDCT運算總共要進(jìn)行16次的8點(diǎn)一維IDCT運算。由于ATmegal28在速度方面的限制,在IDCT運算過(guò)程中把浮點(diǎn)操作改進(jìn)為整形運算,并且把的值擴大211倍存儲起來(lái),為IDCT運算做準備。
評論