隨著(zhù)多媒體市場(chǎng)的迅猛發(fā)展,百萬(wàn)像素的數碼相機、各種功能強大的彩屏手機等數字消費產(chǎn)品逐漸普及。這些多媒體應用均需要處理高質(zhì)量、高分辨率的大圖像,這對存儲介質(zhì)的容量和傳輸信道的帶寬都提出了新要求。圖像壓縮的國際標準JPEG已不能滿(mǎn)足這些新的要求,而且它在低碼率時(shí)還存在著(zhù)方塊效率。因此,從1997年開(kāi)始,JPEG委員會(huì )就致力于開(kāi)發(fā)新的靜態(tài)圖像壓縮標準JPEG2000,并在2000年8月形成了最終經(jīng)濟核草案,在2000年12月使其成為了國標標準。 JPEG2000相比JPEG有著(zhù)更大的靈活性,不僅能對原始圖像高效地壓縮,而且可以對壓縮后的數據進(jìn)行處理。這意味著(zhù)可以從壓縮碼流中提取一部分數據來(lái)重建低分辨率或低碼率的圖像,或者是撮圖像的感興趣區域。這樣就允許將原始圖像壓縮為單一的碼流以適應不同的傳輸信道、存儲或顯示設備,而不必考慮圖像的大小、分量多少以及樣本的精度。 JPEG2000的一個(gè)主要特性就是基于圖像質(zhì)量和分辨率的累進(jìn)傳輸,為了支持這種可分級的壓縮編碼,JPEG2000采用了離散小波變換(DWT)替代JPEG中的離散余弦變換(DCT),并采用了Taubman提出的具有優(yōu)化截斷點(diǎn)的嵌入式塊編碼(EBCOT)算法。 JPEG2000編碼器的框圖如圖1所示。 首先將原始圖像劃分為圖像片,通過(guò)DWT將圖像片分解為不同的分辨率級別,獲得多個(gè)子帶的頻域系數,將各個(gè)子帶劃分為碼塊(典型大小是32×32或64×64),對每個(gè)碼塊進(jìn)行嵌入式的塊編碼,生成上下文和待編碼的數據位;然后由算術(shù)編碼部分根據每個(gè)數據位的上下文自適應編碼,產(chǎn)生每個(gè)碼塊的子碼流;最后將各個(gè)碼塊的子碼流組織成代表碼流質(zhì)量層的分組,并添加相應的頭結構信息,幫助解碼器如何解碼。 EBCOT作為JPEG2000的核心部分,包含了層1和層2兩部分,其中嵌入式塊編碼的邏輯比較復雜,是影響編碼速度的瓶頸之一,使用通用處理器很難提高其效率。傳統的編碼方式采用軟件實(shí)現,但速度和效率不高,且占用較大的存儲資源;而采用硬件實(shí)現方式則會(huì )有更大的靈活性。事實(shí)上采用硬件芯片實(shí)現,不但可以提高編碼的速率和效率,而且也能根據算法本身的特點(diǎn),采用特定的、高效的硬件結構來(lái)實(shí)現算法的關(guān)鍵部分,可以較大幅度地提高編碼效率。另外,隨著(zhù)多媒體的應用和網(wǎng)絡(luò )應用逐步便攜化,以前多數可以在PC機上處理的工作必須轉移到便攜產(chǎn)品上,這對便攜產(chǎn)品有限的資源提出了挑戰。因此有必要研究硬件編碼芯片完成編碼過(guò)程,本文旨在研究JPEG2000編碼中的關(guān)鍵技術(shù)——嵌入式塊編碼。 1 算法分析及設計 嵌入式塊編碼其實(shí)是基于位平面的編碼,而每個(gè)位平面又被劃分為三個(gè)編碼通道,即顯著(zhù)通道、細分通道和清除通道。編碼采用固定的掃描方式,每個(gè)比特位僅在其中的一個(gè)編碼通道中完成編碼。編碼過(guò)程可以分為兩個(gè)步驟,即差別編碼通道的歸屬和編碼原操作。在顯著(zhù)通道中,當比特位本身不顯著(zhù),且周?chē)?個(gè)近鄰至少有一個(gè)是顯著(zhù)時(shí)被編碼;在細分通道中,當比特位在上一個(gè)位平面就變顯著(zhù)時(shí)被編碼;在清除通道,所有在上面兩個(gè)通道中略過(guò)的比特位被編碼。編碼原操作共患難個(gè),即零值編碼、符號編碼、細化編碼和游程編碼。 根據算法要求,編碼時(shí)必須用到一些編碼信息。假設碼塊的大小是32×32的,則編碼信息立即包括1024個(gè)顯著(zhù)信息位(表示當前系數位是否顯著(zhù))、1024個(gè)細化信息位(表示當前系數位是否第一次細分)、1024個(gè)訪(fǎng)問(wèn)信息位(表示當前系統位是否在前面的編碼通道中編過(guò))。當然,除此之外,還需要有1024個(gè)符號位和幅度位,因此編碼過(guò)程中需要存儲的信息為5Kbit。由于FPGA片內RAM資源十分有限,因此將碼塊量化后的小波系數在外部RAM中(對于32×32的碼塊,16bit的系數,需要存儲16bit),而在片內只存儲5Kbit的信息。 塊編碼過(guò)程是以一列的4個(gè)比特位為單位進(jìn)行編碼,且在判別編碼通道的歸屬和編碼操作時(shí),都需要用到當前比特位的8個(gè)近鄰的顯著(zhù)信息和符號信息。因此,事實(shí)上在編碼每一列數據時(shí),必須訪(fǎng)問(wèn)18bit的顯著(zhù)信息和符號信息,以及當前列的幅度位、訪(fǎng)問(wèn)信息和細分信息各4bit。對于幅度位、訪(fǎng)問(wèn)信息和細分信息,可以將每列的數據作為一個(gè)字存儲,但這種存儲方式對顯著(zhù)信息和符號信息卻效率較低。如圖2系數,需要存儲16Kbit),而在片內只存儲5Kbit的信息。 塊編碼過(guò)程是以一列的4個(gè)比特位為單位進(jìn)行編碼,且在判別編碼通道的歸屬和編碼操作時(shí),都需要用到當前比特位的8個(gè)近鄰的顯著(zhù)信息和符號信息。因此,事實(shí)上在編碼每一列數據時(shí),必須訪(fǎng)問(wèn)18bit的顯著(zhù)信息和符號信息,以及當前列的幅度位、訪(fǎng)問(wèn)信息和細化信息各4bit。對于幅度位、訪(fǎng)問(wèn)信息和細分信息,可以將每列的數據作為一個(gè)字存儲,但這種存儲方式對顯著(zhù)信息和符號信息卻效率較低。如圖2所示,如果采用右邊的方案,則對于編碼帶中的每一列,必須讀取12bit的顯著(zhù)和符號信息,其中有6bit是冗余的;如果采用左邊的交錯存儲的方案,即對于32×32的碼塊,在其首行之前和末行之后各添加一行,形成34×32的塊,然后將每?jì)尚凶鳛橐唤M,并采取交錯方式存儲(a,b,c,b,a,b,c,…,b,c,b,a),則讀取信息時(shí)不會(huì )有冗余。 顯然,交錯存儲方案更有效,只是它需要在硬件電路上付出一些代價(jià)。首先,在預處理小波數據時(shí),必須將符號位按照上述交錯方式寫(xiě)入內部RAM,這比處理幅度位復雜一些。其次,在編碼過(guò)程中,需要讀取數據至內部6×4顯著(zhù)或符號寄存器,而對于奇、偶數編碼帶,其讀入順序也是交錯的,對于前者是a、b、c,對于后者則是c、b、a;而且讀取三塊內存區域的地址信號也是不同步的,如表1所示,讀取存儲器b的地址信號始終增長(cháng),而讀取存儲器a和b的地址信號則符號以下規律:前者在從奇編碼帶過(guò)到偶編碼帶時(shí)地址增加,而在從偶編碼帶過(guò)渡到奇編碼帶時(shí)地址保持不變;手者正好相反。 表1 32×32碼塊編碼過(guò)程中,處于各個(gè)編碼帶下讀取內部緩存abc的相應地址信號 c a b c 1 0~31 0~31 0~31 2 32~63 32~63 0~31 3 32~63 64~95 32~63 4 64~95 96~127 32~63 5 64~95 128~159 64~95 6 96~127 160~191 64~95 7 96~127 192~223 96~127 8 128~159 224~255 96~127 因此,必須設計相應的控制電路滿(mǎn)足上述要求,盡管這樣做付出了額外的代價(jià),但卻大大提高了存儲器的讀寫(xiě)效率(提高了50%),這對于需要頻繁訪(fǎng)問(wèn)存儲器的位平面編碼來(lái)說(shuō)是很寶貴的;另外,采用了交錯存儲方式,可以對三塊存儲區域獨立地產(chǎn)生地址信號,一次性讀取6bit,而在常規的存儲方式下,為了讀取12bit信息,必須對同一塊存儲區域訪(fǎng)問(wèn)3次,可見(jiàn)采用交錯存儲的方案同時(shí)也提高了讀寫(xiě)速度。 在JPEG2000的的中,塊編碼器采用兩種編碼模式,即NORAML和VCAUSAL。在VCAUSAL模式下,考慮當前編碼位的周?chē)@著(zhù)的信息時(shí),將下一編碼帶的顯著(zhù)信息看作是不顯著(zhù)的,而在NORMAL模式下則看作是顯著(zhù)。采用VCAUSAL模式,盡管這樣簡(jiǎn)化了對存儲訪(fǎng)問(wèn)的邏輯控制,節省了一些存儲空間,但卻降低了塊編碼器的編碼效率。因此,設計了圖3所示的寄存器組來(lái)配合上面介紹的交錯存儲的方案,這些內部寄存器包括6×4bit的顯著(zhù)和符號信息寄存器,8bit的細化和訪(fǎng)問(wèn)信息寄存器,4bit的幅度寄存器,如圖3所示。 圖3中表示出了各個(gè)寄存器讀入數據和寫(xiě)回更新數據的位置、當前的編碼位置和當前編碼位。這些寄存器都能完成右移一位的功能特別值得注意的是:由于編碼過(guò)程中必須用到18bit的顯著(zhù)和符號信息,因此在每個(gè)編碼帶開(kāi)始處,必須對顯著(zhù)和符號信息寄存器做初始化右移一次,確保在編碼第0列數據時(shí)已經(jīng)有18bit的信息,見(jiàn)圖4的示例。 2 硬件設計 根據本文設計的編碼算法,可用如圖5所示的硬件結構實(shí)現嵌入式塊編碼器。 上述結構中,狀態(tài)機用于控制總體的編碼流程,外部信號START使狀態(tài)機進(jìn)入初始的預處理狀態(tài),表示此時(shí)外部RAM的數據已經(jīng)準備好,然后在編碼過(guò)程中根據計數器的數值進(jìn)行狀態(tài)切換。 設計中用到的計數器共3個(gè),即Countrow(位計數器)、Count(列計數器)、Countloop(編碼帶計數器)。圖6中示出了塊編碼器的總體流程,從中可以看出編碼器的狀態(tài)隨計數器的數值變化的情況。 預處理單元預處理包括部分:碼塊預處理和位平面預處理。其中碼塊預處理包括計算需要編碼的位平面數,撮各個(gè)系數的符號位填充相應的符號緩存,初始化顯著(zhù)信息緩存和細化緩存(全部清0);位平面預處理則提取當前位平面的幅度位填充相應的幅度緩存,初始化訪(fǎng)問(wèn)信息緩存(全部清0)。 讀寫(xiě)控制控制單元負責產(chǎn)生合適的控制信號與外部RAM和內部緩存接口;在預處理時(shí)負責外部RAM和內部緩存的讀寫(xiě)控制,在編碼過(guò)程中則負責內部緩存和寄存器組的讀寫(xiě)控制。 編碼單元分為兩部分(見(jiàn)圖7),判斷邏輯和編碼操作單元。判斷邏輯負責決策當前系數位是否屬于當前的編碼通道,編碼操作單元包括零值編碼、細化編碼和符號編碼,而流程編碼則采用硬連線(xiàn)編碼,不使用獨立的單元。這幾個(gè)編碼操作單元直接采用組合邏輯實(shí)現,而不是采用查表方式。多路選擇器則根據當前執行的編碼操作選擇輸出合適的CX和D。 FIFO單元用于解決塊編碼和算術(shù)編碼邏輯之間的異步問(wèn)題(因為前者產(chǎn)生數據具有間歇性,且算術(shù)編碼處理數據也會(huì )有一定的延遲)。 3 結論與展望 本文通過(guò)對嵌入式塊編碼的算法分析,采用了比較合理的存儲結構來(lái)存儲編碼信息,并設計相應的寄存器組和地址產(chǎn)生控制邏輯,本設計能夠做到讀寫(xiě)操作無(wú)冗余信息。 本編碼器算法采用MODELSIM進(jìn)行功能仿真,圖8是在MODELSIM中截取的部分仿真波形。仿真所采用的時(shí)鐘頻率是50MHz,從圖8中可以看出編碼過(guò)程在1074090ns完成,大約1ms左右完成32×32碼塊的編碼。因此,對于一幀512×512的灰度圖像,估計能夠在0.256s內完成編碼。本設計選用的FPGA芯片最高時(shí)鐘頻率可達到275MHz,估計通過(guò)一定的優(yōu)化,可使工作頻率進(jìn)一步提高;另外,塊編碼的算法本身就蘊含著(zhù)并行的特性,可以在FPGA中實(shí)現多個(gè)塊編碼器單元同時(shí)處理多個(gè)碼塊的數據,這樣編碼一幀圖像的速度可以進(jìn)一步提高。 |