JPEG2000中嵌入式塊編碼的FPGA設(shè)計
隨著多媒體市場的迅猛發(fā)展,百萬像素的數(shù)碼相機(jī)、各種功能強(qiáng)大的彩屏手機(jī)等數(shù)字消費(fèi)產(chǎn)品逐漸普及。這些多媒體應(yīng)用均需要處理高質(zhì)量、高分辨率的大圖像,這對存儲介質(zhì)的容量和傳輸信道的帶寬都提出了新要求。圖像壓縮的國際標(biāo)準(zhǔn)jpeg已不能滿足這些新的要求,而且它在低碼率時還存在著方塊效率。因此,從1997年開始,jpeg委員會就致力于開發(fā)新的靜態(tài)圖像壓縮標(biāo)準(zhǔn)jpeg2000,并在2000年8月形成了最終經(jīng)濟(jì)核草案,在2000年12月使其成為了國標(biāo)標(biāo)準(zhǔn)。
jpeg2000相比jpeg有著更大的靈活性,不僅能對原始圖像高效地壓縮,而且可以對壓縮后的數(shù)據(jù)進(jìn)行處理。這意味著可以從壓縮碼流中提取一部分?jǐn)?shù)據(jù)來重建低分辨率或低碼率的圖像,或者是撮圖像的感興趣區(qū)域。這樣就允許將原始圖像壓縮為單一的碼流以適應(yīng)不同的傳輸信道、存儲或顯示設(shè)備,而不必考慮圖像的大小、分量多少以及樣本的精度。 jpeg2000的一個主要特性就是基于圖像質(zhì)量和分辨率的累進(jìn)傳輸,為了支持這種可分級的壓縮編碼,jpeg2000采用了離散小波變換(dwt)替代jpeg中的離散余弦變換(dct),并采用了taubman提出的具有優(yōu)化截斷點(diǎn)的嵌入式塊編碼(ebcot)算法。 jpeg2000編碼器的框圖如圖1所示。 首先將原始圖像劃分為圖像片,通過dwt將圖像片分解為不同的分辨率級別,獲得多個子帶的頻域系數(shù),將各個子帶劃分為碼塊(典型大小是32×32或64×64),對每個碼塊進(jìn)行嵌入式的塊編碼,生成上下文和待編碼的數(shù)據(jù)位;然后由算術(shù)編碼部分根據(jù)每個數(shù)據(jù)位的上下文自適應(yīng)編碼,產(chǎn)生每個碼塊的子碼流;最后將各個碼塊的子碼流組織成代表碼流質(zhì)量層的分組,并添加相應(yīng)的頭結(jié)構(gòu)信息,幫助解碼器如何解碼。 ebcot作為jpeg2000的核心部分,包含了層1和層2兩部分,其中嵌入式塊編碼的邏輯比較復(fù)雜,是影響編碼速度的瓶頸之一,使用通用處理器很難提高其效率。傳統(tǒng)的編碼方式采用軟件實(shí)現(xiàn),但速度和效率不高,且占用較大的存儲資源;而采用硬件實(shí)現(xiàn)方式則會有更大的靈活性。事實(shí)上采用硬件芯片實(shí)現(xiàn),不但可以提高編碼的速率和效率,而且也能根據(jù)算法本身的特點(diǎn),采用特定的、高效的硬件結(jié)構(gòu)來實(shí)現(xiàn)算法的關(guān)鍵部分,可以較大幅度地提高編碼效率。另外,隨著多媒體的應(yīng)用和網(wǎng)絡(luò)應(yīng)用逐步便攜化,以前多數(shù)可以在pc機(jī)上處理的工作必須轉(zhuǎn)移到便攜產(chǎn)品上,這對便攜產(chǎn)品有限的資源提出了挑戰(zhàn)。因此有必要研究硬件編碼芯片完成編碼過程,本文旨在研究jpeg2000編碼中的關(guān)鍵技術(shù)——嵌入式塊編碼。 1 算法分析及設(shè)計 嵌入式塊編碼其實(shí)是基于位平面的編碼,而每個位平面又被劃分為三個編碼通道,即顯著通道、細(xì)分通道和清除通道。編碼采用固定的掃描方式,每個比特位僅在其中的一個編碼通道中完成編碼。編碼過程可以分為兩個步驟,即差別編碼通道的歸屬和編碼原操作。在顯著通道中,當(dāng)比特位本身不顯著,且周圍8個近鄰至少有一個是顯著時被編碼;在細(xì)分通道中,當(dāng)比特位在上一個位平面就變顯著時被編碼;在清除通道,所有在上面兩個通道中略過的比特位被編碼。編碼原操作共患難個,即零值編碼、符號編碼、細(xì)化編碼和游程編碼。 根據(jù)算法要求,編碼時必須用到一些編碼信息。假設(shè)碼塊的大小是32×32的,則編碼信息立即包括1024個顯著信息位(表示當(dāng)前系數(shù)位是否顯著)、1024個細(xì)化信息位(表示當(dāng)前系數(shù)位是否第一次細(xì)分)、1024個訪問信息位(表示當(dāng)前系統(tǒng)位是否在前面的編碼通道中編過)。當(dāng)然,除此之外,還需要有1024個符號位和幅度位,因此編碼過程中需要存儲的信息為5kbit。由于fpga片內(nèi)ram資源十分有限,因此將碼塊量化后的小波系數(shù)在外部ram中(對于32×32的碼塊,16bit的系數(shù),需要存儲16bit),而在片內(nèi)只存儲5kbit的信息。 塊編碼過程是以一列的4個比特位為單位進(jìn)行編碼,且在判別編碼通道的歸屬和編碼操作時,都需要用到當(dāng)前比特位的8個近鄰的顯著信息和符號信息。因此,事實(shí)上在編碼每一列數(shù)據(jù)時,必須訪問18bit的顯著信息和符號信息,以及當(dāng)前列的幅度位、訪問信息和細(xì)分信息各4bit。對于幅度位、訪問信息和細(xì)分信息,可以將每列的數(shù)據(jù)作為一個字存儲,但這種存儲方式對顯著信息和符號信息卻效率較低。如圖2系數(shù),需要