文獻(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ì)算速度快,但是沒有考慮周圍像素點(diǎn)帶來的影響,僅僅將距離最近的像素點(diǎn)的值賦給當(dāng)前像素點(diǎn),,簡單地將原圖像放大到指定大小,。同時(shí)該算法硬件可實(shí)現(xiàn)性好,但是容易產(chǎn)生鋸齒狀和馬賽克現(xiàn)象,,放大后的圖像有較明顯的失真,。雙線性插值算法中待插值像素點(diǎn)的像素值由該像素點(diǎn)相鄰的4個(gè)像素點(diǎn)共同決定,由它們的像素值以及它們到插值點(diǎn)的距離加權(quán)求和得到,。該插值算法能很好地解決最近鄰域插值算法帶來的鋸齒現(xiàn)象和馬賽克現(xiàn)象,,顯示效果較好,但該算法具有低通濾波效果,,會(huì)使圖像的邊緣模糊[2],。雙三次插值算法中待插值點(diǎn)的像素值是通過矩形網(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)行線性插值,,通過對(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)的像素值的求解過程如下所示:
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中,,依此類推。將接下來輸入的數(shù)據(jù)存入到其余的RAM中,,當(dāng)N個(gè)RAM存滿時(shí),,就停止往RAM中寫數(shù)據(jù)[4]。當(dāng)數(shù)據(jù)存滿兩行后,,根據(jù)縮放比例計(jì)算出當(dāng)前輸出像素點(diǎn)映射到原圖像中的坐標(biāo)位置,,取計(jì)算結(jié)果的整數(shù)部分和整數(shù)部分加1,然后從存儲(chǔ)這兩行的兩個(gè)相鄰RAM中,分別通過兩個(gè)讀端口同時(shí)讀取相鄰地址的4個(gè)像素點(diǎn)的像素值,,通過這4個(gè)像素值計(jì)算待插值點(diǎn)的像素值,。當(dāng)RAM中的數(shù)據(jù)被讀出以后,就可以往RAM中接著寫新的數(shù)據(jù),。其操作過程與一般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í),首先得確定輸入和輸出的分辨率大小,,通過輸入和輸出的分辨率確定縮放的比例,,其計(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行后開始進(jìn)行縮放,,縮放包括地址映射、插值系數(shù)計(jì)算,、加權(quán)求和等過程,,最后將數(shù)據(jù)取整輸出,設(shè)計(jì)過程中需要保持插值系數(shù)計(jì)算和數(shù)據(jù)讀取的節(jié)拍一致,。
3 仿真與驗(yàn)證
本設(shè)計(jì)選用的主控芯片為Xilinx公司Spartan 6系列的xc6slx100-2fgg767[3],,在ISE13.4開發(fā)平臺(tái)上運(yùn)用Verilog HDL對(duì)各邏輯模塊進(jìn)行設(shè)計(jì),解碼芯片型號(hào)為SIL1161,,編碼芯片的型號(hào)為CH7301,,存儲(chǔ)器DDR2型號(hào)為MT47H32M16-25E,測試顯示器采用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ì)過程中通過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,。通過效果圖可知,,本設(shè)計(jì)方案測試效果良好,適合于大屏幕實(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ù)期效果,畫面清晰穩(wěn)定,,無閃爍現(xiàn)象,,能夠?qū)崿F(xiàn)任意比例縮放,并且具有剪切功能,,能實(shí)現(xiàn)局部放大,。雙線性插值縮放算法處理會(huì)導(dǎo)致邊緣稍有模糊,但滿足人眼視覺需求,,適合于工程應(yīng)用,。該設(shè)計(jì)能夠?yàn)榇笃疗唇印⒁曨l的遠(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)