吳以凱+喻金華+肖鐵軍



摘 要:視頻縮放是視頻處理領域的關鍵問題,可以分為硬件實現和軟件實現。以FPGA作為處理芯片,按照SMPTE協議設計了一種視頻縮放方法。設計采用模塊化思想對系統進行了自上而下的劃分,采用XILINX公司提供的Spartan6系列芯片XC6SLX45T,并使用Verilog HDL語言實現了各模塊功能。該算法使用流水線結構,實驗結果表明,該算法能夠在FPGA上穩定運行,實現了視頻縮放的效果。和原有方法相比,該設計方法減少了5個乘法器的使用,節約了系統資源。
關鍵詞:FPGA;視頻縮放;流水線;DDR3 SDRAM;乘法器
DOIDOI:10.11907/rjdk.171287
中圖分類號:TP319
文獻標識碼:A 文章編號文章編號:1672-7800(2017)008-0083-03
0 引言
實時視頻圖像處理是圖像處理領域的研究熱點之一,廣泛應用于監控、醫療、通信領域等。基于單片機的方案對于高分辨率視頻數據的處理無法滿足實時性要求,近年來現場可編程門陣列(FPGA)由于其自身優勢得到了快速發展,在實時圖像處理中的應用也越來越廣泛。一些FPGA器件不僅提供了豐富的邏輯資源,還提供了RAM塊、乘法器、鎖相環、時鐘資源等,為實現高性能的數字信號處理提供了便利。目前,市場上的數字視頻處理芯片大多是從歐美、日、韓等地的公司進口的,也有一些來自中國臺灣,但這些芯片主要適用于一些高度復雜的系統,不適用于單純進行視頻處理的場合。
圖像插值是圖像處理的基本問題之一。隨著顯示器的分辨率越來越高,原有的視頻源制式越來越跟不上顯示器的發展速度,故需要采用相應的視頻縮放方法將輸入的視頻信號轉變為可以在顯示器中實現點對點顯示的視頻制式。為了實現視頻縮放,以及視頻信號的良好顯示,需要對視頻信號進行插值處理。本文設計了一種基于FPGA的視頻縮放算法,并對算法進行了優化。該算法可占用更少的邏輯資源,且易于硬件實現。
1 算法原理
1.1 常用縮放算法
常用的線性視頻縮放算法有最鄰近插值、雙線性插值、雙三次插值[1]。對3種插值方式采用MATLAB進行檢測的結果如圖1所示,其中原圖是一幅512*384的圖像,分別用3種插值方法對原圖進行4*4倍縮小,再進行4*4倍放大得出的圖像如圖1(b)~(d)所示。無論是采用PSNR[2]方法還是人眼觀察,最終的實現效果都為:雙三次插值>雙線性插值>最鄰近插值。最簡單的插值方式為最鄰近插值,但其實現的效果最差,邊緣容易產生鋸齒現象;雙線性插值具有低通濾波器特性,會使高頻信息受損,邊緣處的過渡比較平滑,計算量比最鄰近插值大;雙三次插值能夠保持較好的圖像細節,精度較高,但其計算量最大。權衡FPGA的邏輯資源與顯示效果,本設計采用雙線性插值算法實現。
1.2 雙線性插值算法描述
雙線性插值采用可分離的線性插值將4個最近的像素組合起來:
I[x,y]=I[xi,yi]*(1-xf)*(1-yf)+I[xi+1,yi]*xf*(1-yf)+I[xi,yi+1]*(1-xf)*yf+I[xi+1,yi+1]*xf*yf(1)
圖2(a) 為插值的坐標定義,下標i和f表示各自坐標的整數部分和小數部分,圖2(b)給了式(1)另外一種解釋。每個像素的位置用一個方框表示,其權值由期望的輸出像素和可用輸入像素之間重疊的面積給出。公式(1)需要8個乘法運算,但對其進行因式分解后,能將乘法運算減少到3個,如式(2)所示:
I[x,yi]=I[xi,yi]+xf*(I[xi+1,yi]-I[xi,yi])
I[x,yi+1]=I[xi,yi+1]+xf*(I[xi+1,yi+1]-I[xi,yi+1])
I[x,y]=Iyi+yf*(Iyi+1-Iyi) (2)
2 實現方案
本設計主要包含DDR3 SDRAM緩存模塊、視頻縮放模塊、輸出顯示模塊和時鐘生成模塊等,如圖3所示。
2.1 緩存模塊
本設計采用兩片片外存儲器DDR3 SDRAM作為幀緩存,型號為MT41J64M16,工作頻率可達到200MHz,數據傳輸速度達到800Mb/s,吞吐量可達12.8Gb/s,可以滿足設計要求,而且具有成本低、功耗小的特點,但是DDR3 SDRAM的設計非常復雜,不僅時鐘頻率很高,而且還需要定時刷新。XILINX公司提供了一個可以用來控制DDR3 SDRAM的IP核MIG[3],不僅可使設計復雜度大為降低,而且縮短了設計時間。由于DDR3與數字視頻流工作在不同的時鐘域,需要解決跨時鐘域處理問題。由于處理的數據位數為多位,故采用異步FIFO來解決,緩存模塊如圖4所示。
2.2 縮放模塊
將視頻數據中的視頻數據以行的形式在vid_clk時鐘下分別送入RAM0和RAM1中,然后分別從RAM0和RAM1中以148.5MHz的時鐘頻率將用到的第一行和緊鄰的第二行數據取出,再分別從兩行數據中以scl_clk的時鐘頻率分別取出待使用的兩個緊鄰像素點,共計4個像素點,如圖5所示。
在判斷待使用的像素點坐標時,水平方向上,利用縮放前和縮放后的相對步長判斷待使用的像素點坐標,提取有效像素點提供給待插值點使用,如圖6所示。
在權值計算過程中可以使用x軸方向和y軸方向系數值相乘的方法,但是該做法特別浪費資源。因此,將乘法計算改為采用LUT[4]的方法,事先將4個待插值點圍成的正方形分為8×8=64個方格,計算每個方格的權重值,存入查找表中。優點是運行時不需要進行復雜的計算,從而減少占用資源,提高了系統運行速度,如圖7所示。
2.3 時鐘模塊
利用Xilinx公司提供的PLL IP核,為了提高時鐘驅動能力,將時鐘信號輸入IBUFG(Input Buffer Global)[2],然后再直接驅動全局緩沖BUFG(Buffer Global)[5],在縮放模塊中實現4種制式的視頻切換。148.5MHz、74.25MHz、27MHz、13.5MHz四個時鐘的比例為11∶5.5∶2∶1,四個時鐘的切換可以通過PLL倍頻和分頻得到,DDR3中需要的200MHz時鐘可以通過晶振的100MHz二倍頻得到。在上述對系統能正常工作所需的全局時鐘設計過程中,用到的IBUFG和BUFG都為本設計中使用的FPGA原語庫,通過原語例化[6]的方式加入設計中使用,所需的IP核由工具CORE Generator生成。仿真圖如圖8所示。endprint
2.4 輸出顯示模塊
根據SMPTE協議[7-8],顯示器正常工作需要相應的行場信號進行同步。在不同的視頻制式下,該模塊產生不同的start_hcnt、start_vcnt控制縮放模塊何時開始縮放,以及產生縮放之后的行同步信號scl_hs、場同步信號scl_vs和數據有效信號de,所需時鐘由時鐘模塊提供。
3 實驗結果
本設計在公司數字視頻信號處理芯片中加以應用,采用Verilog編程語言對算法進行描述,并使用Xilinx公司提供的可編程邏輯器件開發環境ISE Design Suite14.4進行編譯和實現。同時,使用視頻播放盒輸出的HDMI視頻信號,作為公司產品尋像器式監視器1090H的信號源進行驗證,1090H搭載了一片Xilinx公司推出的Spartan6系列XC6SLX45T芯片。本設計實現了兩種功能:
(1)實現幾種常見視頻制式之間的相互轉換。以1 080p和720p之間的轉換為例,使用在線邏輯分析儀Chipscope對該模塊進行采點測試,無論是放大還是縮小都能滿足要求。當輸入視頻源為720p時,縮放模塊系統將其轉換為1 080p。由于720p工作在74.25MHz,而采樣的時鐘信號為148.5MHz,所以當輸入為720p時,捕捉到的有效像素個數為1 280*2=2 560個。輸出制式為1 080p,輸出的像素數據個數為1 920個。當輸入視頻源為1 080p時,縮放系統將其轉換為720p。
(2)實現了視頻畫面的放大顯示。本設計實現了兩種視頻放大比例,“放大1”可實現4/3*4/3倍中間畫面的實時放大,“放大2”可實現2*2倍中間畫面的實時放大。以1 080p為例,原始視頻數據如圖9所示,將視頻有效區域vid_hcnt 240~1680,vid_vcnt 135~945的數據進行放大,得到“放大1”,如圖10所示。將視頻有效區域vid_hcnt 480~1 440,vid_vcnt 270~810的數據進行放大,得到“放大2”,如圖11所示。
4 結語
本文采用先垂直縮放、再水平縮放的雙線性插值算法很好地實現了視頻縮放的要求,迎合了當前高清晰度視頻圖像的發展趨勢。本文對視頻縮放算法進行了相應優化,采用流水線的設計思想,以及適當使用查找表的方法得到了一種復雜度更小、占用邏輯資源更少的設計方法,提高了圖像處理運算速度,滿足了圖像處理對系統實時性的要求。該技術在視頻圖像實時處理中具有廣闊的應用前景。但是本文設計的方法只能實現幾種視頻制式之間的轉換,而不能實現任意比例的實時轉換,需要在后續工作中進一步完善。
參考文獻:
[1] 李益.視頻信號處理芯片中圖像縮放模塊的設計[D].廣州:華南理工大學,2011.
[2] 蘇延平.視頻圖像縮放的FPGA設計與實現[D].西安:西安電子科技大學,2014.
[3] 肖文娟.基于FPGA的多格式視頻信號轉換系統[D].太原:太原理工大學,2010.
[4] 朱艷亮.實時視頻縮放算法及FPGA實現[D].長沙:中南大學,2009.
[5] 李曉明.基于FPGA的多通道視頻縮放研究與設計[D].哈爾濱:哈爾濱工程大學,2013.
[6] 謝敏.任意比例實時圖像縮放IP核的FPGA設計與實現[D].南京:南京理工大學,2012.
[7] 電影電視工程師協會.SMPTE 296M-2001[Z].2001.
[8] 電影電視工程師協會.SMPTE 274M-2008[Z].2008.endprint