無分裂結(jié)構(gòu)的二維小波變換圖片處理芯片設計與驗證
摘要:5/3小波變換硬件實現(xiàn)常用結(jié)構(gòu)是先完成分裂,再依照分裂后的數(shù)據(jù)完成預測部分和更新部分的變換,這需要復雜的控制結(jié)構(gòu)。在此采用JPEG2000推薦的5/3小波變換公式,在基于行的列變換基礎上提出了一種全新的無數(shù)據(jù)分裂的結(jié)構(gòu)。該結(jié)構(gòu)放棄地址尋址的數(shù)據(jù)讀取模式,采用讀取一維數(shù)據(jù)流節(jié)點的輸入方式,從時應的寄存器中讀取在多個寄存器中依次流動的數(shù)據(jù),省略了數(shù)據(jù)輸入的地址控制模塊。由于減少了數(shù)據(jù)分裂步驟,并且無需控制預測及更新步驟的交替進行,因此簡化了小波變換控制系統(tǒng)的結(jié)構(gòu)。在此運用軟硬件協(xié)同的驗證方法,利用計算機軟件和FPGA結(jié)合,完成圖片從計算機端輸入,在FPGA中完成小波變換,并輸出到計算機顯示器上顯示的步驟。
關鍵詞:小波變換;軟硬件協(xié)同驗證;FPGA;JPEG 2000
0 引言
小波分析是當前應用數(shù)學和工程學科中一個迅速發(fā)展的新領域,而近年來基于小波變換的圖像壓縮技術(shù)以硬件方式推向市場,圖片壓縮已成為小波變換極其重要的應用領域。而在原有的小波變換的理論基礎上發(fā)展的基于小波變換的更新算法,不采用Fourier變換作為主要的分析工具,這與經(jīng)典小波變換相比具有小波構(gòu)造簡單、反變換容易實現(xiàn)、運算速度快和節(jié)省存儲空間等優(yōu)點。但其在硬件應用開發(fā)上,對中間數(shù)據(jù)量要求較大,占用較多寄存器,因而通過硬件結(jié)構(gòu)的探索來減小寄存器的開銷,成為小波變換圖片處理的一個重要分支。
本文提出了無分裂步驟的5/3小波變換結(jié)構(gòu),完成了該結(jié)構(gòu)的FPGA硬件實現(xiàn),并結(jié)合計算機端Matlab軟件,正確完成圖片變換驗證。
1 硬件結(jié)構(gòu)
1.1 算法實現(xiàn)結(jié)構(gòu)
本文采用JPEG2000推薦的5/3小波變換算法,算法公式如下:
常見的小波變化實現(xiàn)結(jié)構(gòu)如圖1所示,先完成分裂,再進行預測,最后完成更新步驟。分裂步驟是指通過對數(shù)據(jù)地址n的奇偶進行判斷,將數(shù)據(jù)分裂為奇地址部分和偶地址部分。輸入奇地址部分數(shù)據(jù),進行預測部分運算,并輸出細節(jié)數(shù)據(jù);輸入偶地址部分數(shù)據(jù),完成更新部分運算,輸出平滑數(shù)據(jù)。因此需要根據(jù)輸入數(shù)據(jù)的地址,對數(shù)據(jù)進行分裂,或控制預測部分和更新部分交替工作。
本文提出一種全新的運算結(jié)構(gòu),以一維數(shù)據(jù)流輸入數(shù)據(jù),無需數(shù)據(jù)分裂步驟,并且不需要控制預測部分和更新部分的運行和停止,通過對數(shù)據(jù)流固定節(jié)點取值,分別完成預測和更新步驟,并根據(jù)數(shù)據(jù)地址的變換,利用數(shù)據(jù)選擇器從2個端口交替讀取數(shù)據(jù)即能控制預測和更新步驟的運行。
1.2 數(shù)據(jù)存取結(jié)構(gòu)
本文采用基于行的列變化和流水線結(jié)構(gòu),完成二維小波變化數(shù)據(jù)處理。輸入數(shù)據(jù)以一維數(shù)據(jù)流形式逐一輸入,變化模塊讀取數(shù)據(jù)流中的數(shù)據(jù)進行數(shù)據(jù)計算,產(chǎn)生變化結(jié)果。
1.2.1 行變換數(shù)據(jù)存取結(jié)構(gòu)
行變換模塊輸入數(shù)據(jù)讀取方式,是用讀取寄存器中數(shù)據(jù)流的方式代替地址尋址的數(shù)據(jù)讀取模式。
數(shù)據(jù)依照輸入順序,在寄存器A,B,C,D中依次流動。變換模塊在不同的時間分別從A,C和D中讀取數(shù)據(jù),進行預測和更新的變化步驟。變換后輸出的數(shù)據(jù)存放在列變換模塊的寄存器D1和FIFO-A中。行變換模塊結(jié)構(gòu)圖如圖2所示。
1.2.2 列變化數(shù)據(jù)存取結(jié)構(gòu)
在進行列變換時,需要讀取變換數(shù)據(jù)點臨近行的同列數(shù)據(jù)。而完成該數(shù)據(jù)點變換后,進行的是同一行下一列的數(shù)據(jù)點的列變換。因此需要依次讀出相鄰4行的同列數(shù)據(jù),行數(shù)不變,列數(shù)依次遞增。
為了簡單的實現(xiàn)該數(shù)據(jù)讀取的順序,本文使用3個FIFO來保存連續(xù)3行的數(shù)據(jù):當輸入新一行的第1個數(shù)據(jù)時,3個FIFO釋放出第1個數(shù)據(jù)(即之前3行每1行的第1個數(shù)據(jù)),剛好組成完成列變換的相鄰4行的同列數(shù)據(jù)。同時,數(shù)據(jù)的新1行的數(shù)據(jù)進入FIFO-A,F(xiàn)IFO-A釋放出的數(shù)據(jù)進入FIFO-B,F(xiàn)IFO-B釋放出的數(shù)據(jù)進入FIFO-C。之后,釋放出第2列的數(shù)據(jù),并重復上述步驟。
因此在完成數(shù)據(jù)變換的同時,數(shù)據(jù)在FIFO-A,F(xiàn)IFO-B,F(xiàn)IFO-C中依次流動。完成該行的所有列數(shù)據(jù)的變換后,F(xiàn)IFO-A中的數(shù)據(jù)依次寄存在FIFO-B中,F(xiàn)IFO-B的數(shù)據(jù)寄存在FIFO-C中,而FIFO-A則寄存了新1行的數(shù)據(jù)。當下1行的數(shù)據(jù)輸入時,又依照上述順序,開始下1行的列變換。
1.3 變換模塊結(jié)構(gòu)
常見的小波變換結(jié)構(gòu)是當輸入奇數(shù)地址數(shù)據(jù)時完成預測步驟,當輸入偶數(shù)地址數(shù)據(jù)時完成更新步驟。而本文提出的結(jié)構(gòu)不進行數(shù)據(jù)分裂,直接對數(shù)據(jù)進行預測和更新,并同時輸出到數(shù)據(jù)選擇器。數(shù)據(jù)選擇器對地址奇偶進行判斷,選擇輸出數(shù)據(jù),可以得到和常用結(jié)構(gòu)相同的結(jié)果。列變換模塊結(jié)構(gòu)圖如圖3所示。
1.3.1 行變換結(jié)構(gòu)
本文提出了無分裂步驟的結(jié)構(gòu)中,行變換時數(shù)據(jù)流輸入后依次寄存在寄存器D1,D2,D3,D4中。如圖4(a),寄存器D1,D2,D3,D4中已分別寄存了輸入數(shù)據(jù)X4,X3,X2,X1,而寄存器D5,D6,D7則分別寄存了數(shù)據(jù)Y2,Y1,Y0。此時利用寄存器D1,D2,D3中的數(shù)據(jù)X4,X3,X2經(jīng)過預測步驟,得到預測結(jié)果y3=x3-(x2+x4)/2;此前已在寄存器D5,D6,D7中分別寄存了前3個時鐘分別完成計算的結(jié)果Y2,Y1,Y0,則經(jīng)過更新步驟可得y1=x1+(y0+y2+2)/4。此時通過數(shù)據(jù)選擇器輸出的值Y1是奇數(shù)地址,因此僅需要完成預測步驟運算的結(jié)果(即寄存器D6中的數(shù)據(jù)),也就是說輸出寄存器D6中的Y1值,放棄更新步驟產(chǎn)生的Y1值。
在下一個時鐘沿來臨時,X4,X3,X2依次取代X3,X2,X1的位置,輸入的X5則寄存在X4的位置,同理Y2,Y1依次取代Y1,Y0的位置,預測產(chǎn)生的Y3值則寄存在Y2,則下一次計算時,寄存器中的值如圖4b,預測步驟產(chǎn)生Y4,更新步驟產(chǎn)生Y2,由于是偶數(shù)地址,所以通過數(shù)據(jù)選擇器輸出經(jīng)過更新步驟的Y2值。
1.3.2 列變換結(jié)構(gòu)
列變換時,假設第m行的第n列完成行變換后的數(shù)據(jù)為X(m,n),將該數(shù)據(jù)寄存在寄存器D1中,下個時鐘沿來臨時,F(xiàn)IFO-A和FIFO-B中分別釋放出第m-1和m-2行的第n列的數(shù)據(jù)X(m-1,n)和X(m-2,n),同D1中X(m,n)數(shù)據(jù)共同完成預測步驟生成Y(m,n)并寄存在D2中,同時從D1和FIFO-A,F(xiàn)IFO-B中釋放出的數(shù)據(jù)X(m,n),X(m-1,n)和X(m-2,n)分別寄存進FIFO-A,F(xiàn)IFO-B,F(xiàn)IFO-C。再下一個時鐘沿來臨時,完成第m行第n+1列的行變換,并寄存在D1中,之后即可按照上述步驟完成第m行第n+1列數(shù)據(jù)的預測和更新,得出結(jié)果Y(m,n+1)。當FIFO把第m行數(shù)據(jù)完全釋放出時,已在該FIFO寄存了第m+1行的完整數(shù)據(jù),可以開始下一行的列變換。同理,完成預測步驟的數(shù)據(jù)寄存在D2,F(xiàn)IFO-D,F(xiàn)IFO-E中,依據(jù)預測步驟相似的原理完成更新步驟。之后依據(jù)數(shù)據(jù)的列地址的奇偶,選擇不同的Y值輸出。
1.4 控制結(jié)構(gòu)
一般的變化模塊,均采用狀態(tài)機的控制方法,利用狀態(tài)的跳轉(zhuǎn),來控制行變化和列變化之間的關系,完成預測和更新步驟。
而本文提出了全新的、更為靈活的直角坐標系控制法,即利用行坐標(row-c)和列坐標(col-c)形成一個二維直角坐標系,并將圖片映射到直角坐標系上,每一對坐標(row-c,col-c)對應直角坐標系上圖片的一個點,也對應該點的變換時刻。通過row-c,col-c的值來判斷正在進行變換的行列值,來決定FIFO和變化模塊的動作。利用row-c,col-c的末位來判斷進行變換的行和列地址分別是奇數(shù)地址還是偶數(shù)地址,決定是進行預測步驟還是更新步驟。結(jié)合計數(shù)器,通過輸入的圖片的行像素值M和列像素值N,分別控制row-c和col-c的跳變。因而可以簡單的通過改變M,N值的大小來改變進行變換的圖片的大小。
2 結(jié)果驗證
2.1 采用軟硬件協(xié)同驗證的結(jié)構(gòu)
本文采用軟硬件協(xié)同工作的結(jié)構(gòu),如圖5所示。利用計算機端的Matlab軟件從FPGA芯片中讀取變換后的RGB數(shù)據(jù),并顯示在計算機顯示器上。
具體結(jié)構(gòu)是將圖片數(shù)據(jù)通過北翰科技公司的Verilink插件,從Matlab軟件中送入FPGA芯片中的FIFO,小波變換模塊從FIFO中依次讀取數(shù)據(jù),并進行變換,完成變換的數(shù)據(jù)通過FIFO送回Matlab軟件,并顯示在計算機的顯示器上。
2.2 驗證結(jié)果
本文采用128×128像素RGB圖片作為變換圖像源,在計算機的Matlab軟件中,將圖片轉(zhuǎn)換成一維數(shù)據(jù)流,并依次通過Verilink插件送入FPGA芯片的FIFO中,在送入數(shù)據(jù)的同時,F(xiàn)PGA中的變換模塊從FIFO中讀出數(shù)據(jù)進行變換,并將變換結(jié)果通過輸出的FIFO送至計算機端的Mat lab軟件。在完成全部數(shù)據(jù)變換后,在計算機端將獲得的數(shù)據(jù)重新排列,并轉(zhuǎn)換成128×128×3的RGB圖片格式,并對比顯示變換前和變換后的圖片效果。變換前圖片如圖6(a),變換并重排后圖片如圖6(b),圖片數(shù)據(jù)高頻分量和低頻分量分離正確無誤。
3 結(jié)語
本文提出了無分裂步驟的小波變換結(jié)構(gòu),簡化了變換模塊的控制系統(tǒng),采用數(shù)據(jù)流模式輸入數(shù)據(jù),并且和軟硬件協(xié)同的工作方式良好配對,利用FPGA和計算機完成了二維小波變換的板級驗證。本文提出的結(jié)構(gòu)在5/3小波變換中有效運行,并起到簡化結(jié)構(gòu)的關鍵作用,下一步將嘗試把該結(jié)構(gòu)運用于9/7小波變換的硬件結(jié)構(gòu)實現(xiàn)中,并提出適合9/7小波變換硬件實現(xiàn)的結(jié)構(gòu)。