文獻標識碼: A
文章編號: 0258-7998(2011)07-144-04
隨著我國物聯網籌備和建設的推進,高速圖像處理技術的應用領域不斷擴大,對圖像處理的要求也越來越高。由于未經壓縮圖像的數據量非常龐大,對存儲空間和通信帶寬的需求是無限的,這就要求對圖像進行壓縮處理。JPEG圖像壓縮標準憑著其高壓縮率和靈活的應用形式得到了廣泛的應用。
Avalon總線是Altera公司開發的用于Nios嵌入式處理器的參數化接口總線,由一組預定義的信號組成,是一種相對簡單的總線結構,主要用于連接片內存儲器和外設,以構成SOPC系統。本文在研究JPEG算法的基礎上,設計了一種基于Avalon總線的圖像解壓縮IP核,以提高圖像解碼的速度,滿足實時性要求。
1 JPEG解壓縮原理
JPEG(Joint Photographic Expert Group)是第一個適用于連續色調、多灰度、彩色或黑白靜止圖像的國際標準[1]。JPEG解碼的目的是將編碼后的壓縮數據轉換成適合于顯示器顯示的RGB信號。其解碼流程如圖1所示。
解碼流程的主要功能模塊包括:(1)頭文件解析;(2)熵解碼,包括直流系數解碼、交流系數解碼和差分解碼; (3)反量化與反Z變換(掃描);(4)IDCT變換;(5)顏色空間轉換。將每個模塊用Verilog HDL語言進行設計[2],編譯后,利用Modelsim軟件對其進行功能仿真和時序仿真,最終完成各個單元的設計和IP核的實現。
1.1 頭文件解析單元
在JPEG解碼模塊啟動后,頭碼流解析單元首先讀入JPEG文件的包頭,根據JPEG文件數據的存儲方式依次檢測數據流中包含的各種段的標識符,把要解碼的文件信息從數據流中解析出來并存儲到相應的存儲單元,為后面壓縮數據的解碼做準備。
頭碼流解析單元由頭碼流解析狀態機和一系列存儲單元組成。狀態機主要有Idle空閑狀態、ReadMarker讀取標志位狀態和ReadSegment讀取段內信息三個狀態。該單元模塊初始狀態為Idle狀態,當外部發出解碼開始信號時,模塊跳轉到ReadMarker狀態,讀完標識符后,模塊進入ReadSegment狀態。在這個狀態下,模塊對每個標志段內的信息進行解析,并對其中的重要信息如當前圖像的寬度、高度以及解碼需要的量化表和解碼表存儲到相應的存儲單元。當所有的標記段解碼完成后,模塊又跳轉到Idle(空閑)狀態。其狀態轉移圖如圖2所示。
頭文件解析單元模塊的輸入輸出信號分別為:復位信號(rst)、系統時鐘(clk)、輸入數據有效(DataInEnabe),輸入數據(DataIn)、狀態機狀態(state),讀取段內信息時的狀態(process)。該模塊在Modelsim仿真軟件下的頂層仿真如圖3所示。由仿真圖可知,該單元可以每2個時鐘處理1 B的數據。
1.2 熵解碼單元
JPEG圖像熵解碼由Huffman編碼、行程編碼和變長編碼三部分組成。其解碼過程為:對輸入的數據流進行Huffman解碼,解碼成功后得到一個變長的碼字,根據解析的Huffman解碼表尋址得到該碼字對應的解碼信息。該解碼信息為8 bit,高4 bit代表在該頻域系數之前0的個數,而低4 bit表示該頻域系數的二進制bit長度。最后,根據系數所占用的二進制bit長度,確定該頻域系數的值。
從解碼過程可知,Huffman解碼步驟比較耗時,這是因為Huffman算法為變長編碼,壓縮后產生的碼字長度不固定,需要逐個bit地讀入數據。根據范式哈夫曼編碼的一個很重要特性:長度為i的碼字的前j位的數值大于長度為j的碼字的數值,即i>j[3]。因此可以構造出一種并行結構的huffman快速解碼算法。將N(N=1,2,3…15)bit長度的最小碼字低位補0擴充到16 bit,得到f(N)。對輸入的16 bit JPEG碼流code與f(N)和f(N+1)進行比較,如果f(N)<code<f(N+1),則可以確定待解碼碼字長度為N。在確定碼字長度后,定義offset=code-f(N)。若f(N)對應的解碼信息的存儲地址為addr(N),則code的解碼信息的地址為offset+addr(N)。以該地址作為Huffman解碼表的讀地址,就可以得到對應的Run/szie解碼信息。快速Huffman解碼算法結構如圖4所示。
熵解碼單元包括Huffman解碼及變長解碼和行程解碼。Huffman解碼完成后,再進行變長解碼和行程解碼。在該部分中,主要根據解碼出來的Run/size進行幅值的確定和0行程的解碼,同時設置了計數器counter用來記錄當前解碼符號在8×8數據塊中的位置。如果Run/size為00,則表示該圖像塊已解碼完成;如果Run/size為F0,則將counter加上16。否則,將counter加上Run,從碼流中讀取size位,判斷最高位,如果為0,則表示當前系數為負數,將該bit以及后面讀入的bit全部取反;為1表示當前系數為正數,將當前系數的剩余bit讀出,輸出到外部模塊。
熵解碼單元模塊的輸入輸出信號有:復位信號(rst)、系統時鐘(clk)、輸入數據有效(DataInEnabe)、輸入數據(DataIn)、解碼出來的哈夫曼碼字(TableCode)、Huffman解碼表的尋址地址(DhtNumber)、行程0的個數(DhtZero),該頻域系數的二進制bit數(DhtWidth)、頻域系數的幅值(OutCode)。該模塊在Modelsim仿真軟件下的仿真如圖5所示。由仿真圖可知,該單元可以每1個時鐘解碼出一個哈夫曼碼字,每5個時鐘完成一個頻域數據的熵解碼。
1.3 反量化與反Z變換單元
量化是圖像壓縮中最重要的部分。DCT變換并沒有壓縮圖像數據,而是將能量聚集在低頻系數部分。DCT 的低頻系數包含了圖像的主要信息, 而其高頻系數是反映圖像較次要的信息。因此,結合人類視覺系統的特點,采用特定的量化表,忽略部分高頻分量,從而達到壓縮的目的,故量化也就是進行除法操作。相應地,反量化過程就是將Huffman解碼后的64個頻域數據分別與對應的量化表中量化系數相乘。而對0系數進行相乘沒有任何意義,因此,在該單元的設計中,僅對非0頻域系數進行相乘。在Huffman解碼模塊中,counter用于記錄已經解碼的頻域數據的個數,Run記錄0行程的個數,將兩個數值相加作為量化表存儲單元的尋址地址,查到當前非0頻域系數對應的量化系數。反Z變換則按照對應關系輸出反量化后的數據,處理起來比較簡單,本文不作討論。
反量化與反Z變換單元模塊的輸入輸出信號有:復位信號(rst)、系統時鐘(clk)、輸入數據有效(DataInEnabe)、解碼出來的哈夫曼碼字(NumberCode)、解碼出來的非0頻域系數(OutCode)、量化表尋址地址(DqtNumber)、量化系數(DqtData)、輸出使能(DecodeEnable)、反量化后的數據(DecodeCode)。該模塊在Modelsim仿真軟件下的仿真如圖6所示。由仿真圖可知,通過對量化單元尋址,每個時鐘就可以完成一個數據的反量化過程。
1.4 IDCT變換單元
對量化過的像素進行反Z變換,得到8×8的數據塊。圖像數據是編碼時通過正向離散余弦變換得到的結果,解碼時必須將其反向余弦變換,將數值c向時域轉換。目前,用硬件實現的快速算法的普遍思想[4]是把2D-IDCT分解成兩個1D-IDCT,再在1D-DCT做快速算法,但是這種方法會占用過多的芯片資源。本文采用分時復用的方法,用一個1D-IDCT模塊實現二維余弦變換,其總體結構如圖7所示。
對于1D-IDCT,本文采用經典的陳氏算法。由于其算法具有清楚的分級結構,可以采用流水線結構的設計方法來提高解碼速度。對于陳氏算法,采用4級流水線可以實現1D-IDCT算法。每級都有兩組寄存器,一組用于存放中間結果,另一組用于寄存運算結果,同時也作為下一級的輸入。該設計利用狀態機產生變換矩陣,通過共用乘法器來減少乘法器的使用,由原來的22個減少到6個,大大節約了邏輯資源。
IDCT模塊的輸入輸出信號有:復位信號(rst)、系統時鐘(clk)、輸入數據有效(DataInEnabe)、反量化后的頻域系數(Data00In)、輸出使能(DataOutEnable)、IDCT變換行數(DataOutPage)、IDCT變換流水線級數(DataOutCount)、IDCT變換完成后的時域系數(Data0Out, Data10Out)。該模塊在Modelsim仿真軟件下的仿真如圖8所示。
1.5 顏色空間轉換單元
在JPEG圖像進行編碼時,為了便于壓縮,需要將圖像數據由RGB色彩空間轉換到YCbCr色彩空間。而在解碼時,為了便于終端顯示,則需要將圖像數據由YCbCr色彩空間轉換到RGB色彩空間。其變換關系如下:
顏色空間轉換單元的輸入輸出信號有:復位信號(rst)、系統時鐘(clk)、輸入數據有效(DataInEnabe)、色彩空間信號(DataY、DataCb、DataCr)、變換后的RGB信號(OutR、OutG、OutB)。該模塊在Modelsim仿真軟件下的仿真如圖9所示,由仿真圖可知,在輸入一組信號后,3個時鐘周期可以得到對應的一組RGB信號,直至完成色彩空間轉換算法。
2 基于Avalon總線的JPEG IP核設計
Avalon總線是一種協議較為簡單的片內總線,Nios通過Avalon總線與外界進行數據交換。Avalon總線的特點有:(1)所有外設的接口與Avalon總線時鐘同步,不需要復雜的握手/應答機制。(2)所有的信號都是高電平或低電平有效,便于信號在總線中高速傳輸。(3)為了方便外設的設計,地址、數據和控制信號使用分離的、專用的端口。
JPEG解碼時,前一個模塊的輸出是下一個模塊的輸入。根據Avalon總線協議,該解碼模型需要設置一組Avalon接口,控制部分由Nios完成。Avalon接口設置如下:clk為全局同步時鐘,DataInRead是握手信號,當為高時,向外設發送數據請求;DataInEnable為輸入數據有效信號,有效時,表示當前傳送的是有效的數據,IP核開始接收圖像碼流DataIn;為了提高圖像的解碼速度,數據寬度設計為32 bit;當頭文件分析完成后,IP發送ImageEnable信號,為1時,表示開始正式圖像解碼,接下來進行Huffman解碼、IQ和IDCT變換,最終輸出3個8 bit的RGB數據。輸出數據只有在OutEnable為高時有效,當最后一個碼流結束后,輸出JPEGIDLE信號。JPEG解碼IP核的輸入輸出時序仿真圖分別如圖10、圖11所示。
完成設計和驗證后,該IP核可以通過SOPC Builder工具加入到系統中。基于SOPC的JPEG解碼系統如圖12所示。圖中,SDRAM控制器實現處理器、VGA控制器和SDRAM之間的圖像數據存取。由于VGA直接從SDRAM中讀取數據,所以將VGA的avalon_master接口連接到SDRAM上, 當VGA控制器發出讀有效信號到SDRAM時,SDRAM直接將圖像數據傳送給VGA控制器,VGA控制器同時產生行場同步信號,與RGB數據一起傳送到顯示器。SDRAM采用ICSI公司的數據寬度為16 bit、存儲容量為64 MB的IS42S8800來存儲解碼后的圖像數據。
針對軟件解碼圖片速度慢的問題,本文設計了一種基于Avalon總線的JPEG解碼IP核。系統時鐘設置為50 MHz,在Quartus下進行綜合和仿真,采用CycloneII EP2C8Q208C8硬件芯片驗證了IP的正確性,極大地提高了圖片解碼的速度。同時,利用IP核的可重用性,可以將其用于其他需要實時圖像解碼的系統中,可降低系統設計的復雜度。
參考文獻
[1] 何東健.數字圖像處理(第1版)[M].西安:西安電子科技大學出版社,2003.
[2] 夏宇聞.Veriong數字系統設計教程(第2版)[M].北京:北京航空航天大學出版社,2008.
[3] 邵天增,尚冬娟.哈夫曼編碼應用的一種改進[J]. 科技創新導報,2008,21:29,31.
[4] 鐘文榮,陳建發.二維DCT算法的高速芯片設計[J].廈門大學學報自然科學版,2005,43(3):198-201.