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