文獻(xiàn)標(biāo)識碼: A
文章編號: 0258-7998(2014)08-0034-04
中文引用格式:楊大偉,李健.基于FPGA的實時視頻縮放算法設(shè)計實現(xiàn)[J].電子技術(shù)應(yīng)用,2014,40(08):34-37.
視頻縮放系統(tǒng)大多采用視頻縮放的專業(yè)芯片設(shè)計,,應(yīng)用單一,靈活性差且成本較高[1],。視頻圖像是將豐富海量信息有效展示給大家的一種重要途徑,。圖像的縮放是數(shù)字圖像處理中的基本操作,在視頻圖像傳輸,、電影制作等有非常廣泛的應(yīng)用,。這項技術(shù)經(jīng)常應(yīng)用于匹配顯示器的分辨率,完整地顯示視頻圖像,。本設(shè)計是在FPGA的平臺上以RAM_FIFO架構(gòu)應(yīng)用雙線性差值算法實現(xiàn)視頻圖像的任意比例的縮放,,具有實行性好、處理速度快等特點,。
目前1 雙線性算法的硬件的可行性
1.1 縮放算法的選取
典型的線性縮放算法有最近鄰域插值法、雙性插值縮放算法和雙三次插值縮放算法,。最近領(lǐng)域插值法的計算復(fù)雜度較低,,是以離待插值點最近的點的像素值作為待插值點的像素值。該算法計算量小,,計算速度快,,但是沒有考慮周圍像素點帶來的影響,僅僅將距離最近的像素點的值賦給當(dāng)前像素點,,簡單地將原圖像放大到指定大小,。同時該算法硬件可實現(xiàn)性好,但是容易產(chǎn)生鋸齒狀和馬賽克現(xiàn)象,,放大后的圖像有較明顯的失真,。雙線性插值算法中待插值像素點的像素值由該像素點相鄰的4個像素點共同決定,由它們的像素值以及它們到插值點的距離加權(quán)求和得到,。該插值算法能很好地解決最近鄰域插值算法帶來的鋸齒現(xiàn)象和馬賽克現(xiàn)象,,顯示效果較好,但該算法具有低通濾波效果,,會使圖像的邊緣模糊[2],。雙三次插值算法中待插值點的像素值是通過矩形網(wǎng)格中最近的16個采樣點的加權(quán)平均得到,在這里需要使用兩個多項式插值三次函數(shù),。該算法考慮了相鄰16個像素點的直接作用以及各點像素值的變化率等因素,,效果比前兩種方式有大幅提升,,改善了前兩種方式的不足,但是該算法的計算復(fù)雜度也大幅提升,。
綜上所述,,因為FPGA內(nèi)部的邏輯資源有限,算法的復(fù)雜度越高,,占用的邏輯資源就越多,,硬件實現(xiàn)性差。因此綜合考慮顯示效果和硬件可實現(xiàn)性,,實際工程中通常選用雙線性插值縮放算法,。
1.2 雙線性差值算法原理
雙線性插值的本質(zhì)是在兩個相互垂直的方向上分別進(jìn)行線性插值,通過對兩個變量的插值函數(shù)進(jìn)行擴展得到[3],。如圖1所示,,設(shè)(u,v)是4個相鄰點(i,,j),、(i+1,j),、(i,,j+1)和(i+1,j+1)所圍成空間里的任意一點,。在雙線性插值中,,(u,v)點的像素值是由周圍4個相鄰點的像素值加權(quán)求和得出,,假設(shè)g(i,,j)、g(i+1,,j),、g(i,j+1)和g(i+1,,j+1)分別為4個相鄰像素點的像素值,,則任意點(u,v)的像素值的求解過程如下所示:
g(i,,j+u)=(g(i,,j)-g(i,j+1))×u+g(i,,j)(1)
g(i+1,,j+u)=(g(i+1,j)-g(i+1,j+1))×u+g(i+1,,j)(2)
g(i+v,,j+u)=(g(i,j+u)-g(i+1,,j+u))×v+g(i,,j+u)(3)
2 雙線性插值縮放算法的硬件實現(xiàn)
雙線性插值縮放算法硬件實現(xiàn)總體框圖如圖1所示,該設(shè)計主要包括三大部分,,分別為數(shù)據(jù)存儲,、系數(shù)產(chǎn)生以及整體控制。
圖1 FPGA實現(xiàn)雙線性插值算法的結(jié)構(gòu)框圖
2.1 數(shù)據(jù)存儲
由于該算法最少需要兩行數(shù)據(jù)才能進(jìn)行運算,,因此必須首先將輸入的視頻信號進(jìn)行緩存,,且至少緩存兩行以上的數(shù)據(jù),才能運用待插值點所在位置的相鄰兩行中4個像素點的像素值算出待插值點的像素值,。本設(shè)計采用了RAM_FIFO架構(gòu)的存儲器進(jìn)行數(shù)據(jù)緩存,,該架構(gòu)由多個雙口RAM構(gòu)成(本設(shè)計中設(shè)為N個),每個RAM至少能存儲一行數(shù)據(jù),,將輸入的第一行,、第二行視頻數(shù)據(jù)依次存入到第一個和第二個RAM中,依此類推,。將接下來輸入的數(shù)據(jù)存入到其余的RAM中,,當(dāng)N個RAM存滿時,就停止往RAM中寫數(shù)據(jù)[4],。當(dāng)數(shù)據(jù)存滿兩行后,,根據(jù)縮放比例計算出當(dāng)前輸出像素點映射到原圖像中的坐標(biāo)位置,取計算結(jié)果的整數(shù)部分和整數(shù)部分加1,,然后從存儲這兩行的兩個相鄰RAM中,分別通過兩個讀端口同時讀取相鄰地址的4個像素點的像素值,,通過這4個像素值計算待插值點的像素值,。當(dāng)RAM中的數(shù)據(jù)被讀出以后,就可以往RAM中接著寫新的數(shù)據(jù),。其操作過程與一般FIFO的先進(jìn)先出相似,。另外,不同分辨率的刷新率不盡相同,,為了實現(xiàn)任意比例的縮放并保證縮放前與縮放后數(shù)據(jù)同步,,需要使用外部存儲器將輸入數(shù)據(jù)進(jìn)行幀存儲,將輸入/輸出數(shù)據(jù)進(jìn)行隔離,,然后根據(jù)縮放算法的需要從外部存儲器中讀取數(shù)據(jù)進(jìn)行縮放,。
2.2 系數(shù)產(chǎn)生
在進(jìn)行縮放算法時,首先得確定輸入和輸出的分辨率大小,,通過輸入和輸出的分辨率確定縮放的比例,,其計算如式(4)所示,,式中xscale為水平方向縮放比例,yscale為垂直方向的縮放比例,,inputxres,、inputyres分別表示輸入視頻圖像水平方向和垂直方向的像素點個數(shù)。outputxres和outputyres分別表示縮放后輸出圖像的水平方向和垂直方向的像素點個數(shù),。
雙線性插值縮放算法的計算公式如下:
Dout=c1×x1+c2×x2+c3×x3+c4×x4(5)
式中,,x1、x2,、x3,、x4分別為相鄰4個像素點(左上、右上,、左下,、右下)的像素值,可從存儲部分的RAM中讀出,。因此只需求得插值系數(shù)c1,、c2、c3,、c4即可算出插值點的像素值,,其計算公式如下:
c1=u×v
c2=(1-u)×vc3=u×(1-v)c4=(1-u)×(1-v) (6)
式中,u,、v分別表示待插值點與原圖像中像素值為x1的像素點的水平距離和垂直距離,。分別按照水平方向和垂直方向縮放比例計算出當(dāng)前像素點在原圖像中的位置,分別取其計算結(jié)果的小數(shù)部分即為u和v,,假設(shè)待插值點在縮放后的圖像中的坐標(biāo)為(x,,y),則u,、v的計算公式如下:
u=x×xscale-[x×xscale]
v=y×yscale-[y×yscale] (7)
將式(4)帶入式(7)可以得出u,、v的值,再將u,、v代入式(6)中即可求得插值系數(shù),。最后將插值系數(shù)代入式(5)即可算出待插值點的像素值。
2.3 整體控制
縮放算法設(shè)計實現(xiàn)的流程如圖2所示,,
圖2 FPGA實現(xiàn)雙線性插值算法的設(shè)計流程
整個縮放算法模塊采用較高分辨率的像素時鐘作為模塊的主控時鐘,,采用輸出分辨率的幀同步信號作為模塊的復(fù)位信號。本模塊帶有裁剪功能,,能夠?qū)植繄D像進(jìn)行放大,,將數(shù)據(jù)存入RAM。本設(shè)計設(shè)定存滿2行后開始進(jìn)行縮放,縮放包括地址映射,、插值系數(shù)計算,、加權(quán)求和等過程,最后將數(shù)據(jù)取整輸出,,設(shè)計過程中需要保持插值系數(shù)計算和數(shù)據(jù)讀取的節(jié)拍一致,。
3 仿真與驗證
本設(shè)計選用的主控芯片為Xilinx公司Spartan 6系列的xc6slx100-2fgg767[3],在ISE13.4開發(fā)平臺上運用Verilog HDL對各邏輯模塊進(jìn)行設(shè)計,,解碼芯片型號為SIL1161,,編碼芯片的型號為CH7301,存儲器DDR2型號為MT47H32M16-25E,,測試顯示器采用AOC 173P,。
本設(shè)計輸入為實時的DVI接口,輸入分辨率為800×600,,輸出分辨率為1 280×1 024,,相對應(yīng)的縮放比例xscale=1.60,yscale=1.71,,刷新率為60 Hz,。此設(shè)計適合切屏,若輸入的分辨率不同,,則縮放比例,、輸入的橫縱向點數(shù)均發(fā)生變化。當(dāng)N=6時,,適合全部輸入,,相應(yīng)的參數(shù)不發(fā)生變化。
經(jīng)驗證得到本設(shè)計占用FPGA內(nèi)部主要邏輯資源情況如表1所示,,支持的像素時鐘頻率高達(dá)108 MHz,,對應(yīng)分辨率為1 280×1 024。
圖3 縮放算法的仿真波形
圖3為在設(shè)計過程中通過ISE自帶仿真工具ISIM進(jìn)行仿真得到的雙線性插值縮放算法的仿真圖,。仿真圖中,,iSiI1161_one_odck_G為輸入分辨率時鐘,iSiI1161_one_
qe[23:0]為輸入數(shù)據(jù),,calib_done 為DDR校準(zhǔn)信號, clk_
scale為縮放核縮放時鐘,,c1[50:0]為加權(quán)系數(shù),,inputXRes[10:0]、inputYRes[10:0]為輸入的橫,、縱向像素點數(shù),,xScale[17:0]、yScale[17:0]為橫、縱向的縮放比例,。
圖4 圖像切割放大拍攝效果圖
圖4為拍攝的實物效果圖,,圖4(a)和4(b)將800×600的左半部份和右半部份分別放大到1 280×1 024。通過效果圖可知,,本設(shè)計方案測試效果良好,,適合于大屏幕實時拼接使用。
本文首先對常用的視頻圖像縮放算法進(jìn)行介紹,,綜合考慮硬件可實現(xiàn)性和縮放后顯示效果,,最終選擇將雙線性插值縮放算法在FPGA上進(jìn)行實現(xiàn)。本設(shè)計采用RAM_FIFO架構(gòu)作為該算法硬件實現(xiàn)的核心思想,,設(shè)計主要包括數(shù)據(jù)存儲,、系數(shù)產(chǎn)生以及整體控制三大模塊。硬件實現(xiàn)結(jié)果表明,,該設(shè)計達(dá)到了預(yù)期效果,,畫面清晰穩(wěn)定,無閃爍現(xiàn)象,,能夠?qū)崿F(xiàn)任意比例縮放,,并且具有剪切功能,能實現(xiàn)局部放大,。雙線性插值縮放算法處理會導(dǎo)致邊緣稍有模糊,,但滿足人眼視覺需求,適合于工程應(yīng)用,。該設(shè)計能夠為大屏拼接,、視頻的遠(yuǎn)程傳輸?shù)雀咚僖曨l信號處理提供必要的預(yù)處理裝置。
參考文獻(xiàn)
[1] 趙艷軍,,何其銳,,施錫濤.基于DVI和FPGA的視頻疊加器設(shè)計[J].電子技術(shù)應(yīng)用,2011,,37(6):31-34.
[2] 許錄平.數(shù)字圖像處理[M].北京:科學(xué)出版社,,2007.
[3] Xilinx Inc.Spartan-6 family overview[EB/OL].(2010-03) [2014-04].http://www.xilinx.com.
[4] 徐文超,于意仲,,柴耀龍,,等.基于spartan-6 FPGA的DDR2控制器接口設(shè)計[J].數(shù)據(jù)采集與處理2012(27):167-171.
(收稿日期:2014-04-21)