基于FPGA的四通道視頻縮放引擎的研究及設(shè)計
數(shù)字視頻縮小和放大(簡稱縮放)是視頻處理的一個重要分支,是基于對數(shù)字視頻每幀圖像的處理來實現(xiàn)的。常見的縮放算法有最近鄰域法、雙線性插值法、拋物線插值法、雙三次插值法和牛頓插值法等基于多項式的插值算法[1],較容易在FPGA硬件上實現(xiàn);也有B樣條插值法、基于小波插值和有理插值等比較復雜的算法,難以在FPGA上實現(xiàn)。
近年來隨著液晶平板顯示器件的廣泛應(yīng)用,對于定標器的研究越來越多且研究成果也很豐富。但定標器的縮放比例有限,一般在0.5~4之間,在這個范圍內(nèi)采用2階或3階多點插值算法,圖像的邊緣和細節(jié)可以較好保存。但是采用定點插值法,當文字縮小比例較大時,會丟失較多的細節(jié),出現(xiàn)字體筆畫斷裂或者鋸齒現(xiàn)象。而采用低階算法(例如多點均值插值),參與運算的點較多,可以有效提高文字的顯示質(zhì)量。
1 系統(tǒng)架構(gòu)
系統(tǒng)架構(gòu)如圖1所示,先對輸入視頻的分辨率進行檢測,將檢測值送至MCU,MCU用其確定縮放步長;然后對視頻進行縮小操作。如果要對信號進行放大,則繞過該模式;接著將視頻數(shù)據(jù)送至IFIFO緩存,由仲裁器和DDR2控制器實現(xiàn)4個通道數(shù)據(jù)的幀率變換后,視頻數(shù)據(jù)送至OFIFO模塊;接著數(shù)據(jù)被送至放大模塊,完成放大操作。如果要對視頻信號進行縮小,則繞過該模式;最后將完成處理的RGB視頻信號輸出。整個縮放過程所需要的縮放步長、通道選擇等配置信號全部由MCU通過本地總線配置FPGA。
其中,f(x,y)為縮小圖像某點的像素值,f(xi,yi)為圖像子塊中各點的像素值。
實現(xiàn)結(jié)果如圖5所示,較好地保證了文字的正常顯示。
4 幀率變換
4.1 輸入緩存 IFIFO
每一路IFIFO都需要在FIFO中數(shù)據(jù)量大于1/2 FIFO深度時向仲裁模塊發(fā)送占用DDR2總線的請求信號REQ,應(yīng)答信號AGREE有效時,向DDR2控制器發(fā)送數(shù)據(jù)。當完成一定量的讀出數(shù)據(jù)時,往仲裁模塊發(fā)送一個發(fā)送結(jié)束信號END,仲裁模塊接收到END信號后將DDR2總線控制權(quán)收回,IFIFO等待下一次應(yīng)答。
4.2 輸出緩存OFIFO
其實現(xiàn)原理與IFIFO類似,只是該模塊的輸入端工作在DDR2工作時鐘域,輸出模塊工作在幀率變換后的視頻圖像的像素時鐘域。
4.3 仲裁
共有4路輸入和4路輸出占用DDR2帶寬,需要劃分時間片來保證各個通道能夠順暢地顯示,優(yōu)先級依次為第1、2、3、4通道讀,第1、2、3、4通道寫。本模塊采用狀態(tài)機控制,狀態(tài)機在上述8個狀態(tài)中循環(huán)跳轉(zhuǎn),然后跳回IDEL狀態(tài),開始下一輪循環(huán)。
仲裁模塊的另一個任務(wù)就是讀寫DDR2地址的生成。將DDR2的存儲空間劃分為4個部分,每個部分存儲一路視頻信號,每路視頻信號存儲3幀。同時讀DDR2時,命令設(shè)置為讀操作;寫DDR2時,命令設(shè)置為寫操作。
現(xiàn)就一路視頻實現(xiàn)幀率變換討論如下:創(chuàng)建3個指針分別指向3幀數(shù)據(jù)的DDR2空間基地址,系統(tǒng)啟動時,讀指針rd_pointer、當前寫指針current_wr_pointer和之前寫指針pre_wr_pointer分別按照圖6所示的狀態(tài)圖在3個基地址之間跳轉(zhuǎn)。
最近鄰域插值法存在很強的波瓣,頻率響應(yīng)較差。當圖像中包含像素值有變化的細微結(jié)構(gòu)時,最近鄰插值會在圖像中產(chǎn)生人為的痕跡,造成圖像模糊或產(chǎn)生人為噪聲點。
線性插值法頻譜的旁瓣遠小于主瓣,帶阻特性較好。但通帶內(nèi)高頻成分衰減過快,會使得插值后的圖像變模糊。
四點立方插值通帶內(nèi)高頻成分衰減明顯變慢,且旁瓣不超過1%,具有較好的高頻響應(yīng)特性,縮放后的圖像能夠保持更多細節(jié)。
六點立方插值算法的頻率響應(yīng)特性更加優(yōu)越,通帶內(nèi)高頻成分衰減更慢且旁瓣更低。
四點立方插值較好地保持了圖像的細節(jié),實現(xiàn)難度和占用邏輯資源適中。六點立方插值雖然實現(xiàn)效果更好,但是占用的邏輯資源較多。故本設(shè)計采用四點立方插值算法實現(xiàn)視頻的放大操作。
5.2 插值基函數(shù)
圖像插值縮放具有二維可分解的特點,可以將二維圖像的插值分解為分別沿x和y方向的一維信號插值[3]。一維方向上,利用插值點的四個臨近像素點進行三次插值, Keys將sinc離散函數(shù)進行泰勒級數(shù)展開后,使三次分段多項式和原始信號的泰勒級數(shù)展開式盡可能多項吻合,以此推導出插值基函數(shù)表達式[4]。
5.3.1 抽頭系數(shù)的產(chǎn)生
將插值的系數(shù)存在ROM中,這樣雖然使用三次方插值,但是不用在FPGA中實現(xiàn)三次方的運算,提高了運算速度。例如原圖像一行有3個像素,要求插值后的圖像一行有8個像素,則新圖像一行的第5個點在原圖像中映射的坐標為[(5-1)×2/7]+1=15/7=2+1/7≈
′b0010.1001,整數(shù)2為其原圖像中左邊臨近的像素點坐標為2,1/7表示其與坐標為2的原圖像像素的距離為1/7。此時將小數(shù)部分1001作為地址讀出存儲在該地址的抽頭系數(shù),將其送給卷積器。
5.3.2 插值參考點控制
放大時,對縮放步長進行累加,當小數(shù)向個位數(shù)進位時,開始讀取一個新的數(shù)據(jù)。例如計算插值后圖像某個點時,采用原圖像的x4、x5、x6、x7作為插值參考點,則當步長累加器有進位時,讀取下一個像素值x8,同時將x5、x6、x7移到x4、x5、x6的寄存器位置,而x8則存入之前x7的位置,這樣就可以實現(xiàn)從原圖像向目標圖像的地址映射,避免從目標圖像到原圖像地址映射過程出現(xiàn)的乘法運算。
5.4 行緩存
行緩沖存儲器的主體為若干個存儲容量相同的雙口隨機存儲器(DRAM),每個DRAM存儲一行的有效像素數(shù)據(jù)。
為了確保行緩存不溢出,開辟6個行緩存器,存儲時按順序1-2-3-4-5-6-1循環(huán)存放,讀取時按循環(huán)次序讀取。
5.5 垂直方向放大
垂直方向放大濾波器架構(gòu)和水平方向一樣,只是插值參考點來自于不同的行緩存空間里相同地址的數(shù)據(jù)。
本文采用Xilinx公司的Virtex-5系列XC5VLX50T-1FFG1136C型號的FPGA實現(xiàn),可用用戶IO管腳480個,滿足4路視頻信號輸入、4路視頻信號輸出和一路16 bit本地總線需求。內(nèi)部可用Slice 7 200個, Block RAM Blocks最大為2 160 KB,滿足4路視頻信號每路緩存6行數(shù)據(jù)需求。輸入DVI視頻信號用Silicon Image公司的SiI 1161解碼成并行RGB數(shù)據(jù)送至FPGA,輸出的并行RGB視頻信號用SiI 1160編碼成DVI視頻信號輸出顯示。實驗結(jié)果表明,在4個通道輸入均為352×288(CIF格式)分辨率、均放大為1 920×1 080輸出顯示時,無方塊效應(yīng),輸出穩(wěn)定順暢;在4個通道輸入均為1 920×1 080分辨率、均縮小為352×288輸出顯示時,畫面質(zhì)量良好,且文字筆畫圓潤,無筆畫斷裂或者模糊不清的現(xiàn)象。
評論