陳志杰,凌朝東,魏騰雄
(華僑大學(xué) 信息科學(xué)與工程學(xué)院,福建 廈門(mén)361008)
在很多的場(chǎng)合需要高分辨率的大圖像顯示,現(xiàn)在受限于液晶和信號(hào)傳輸,單個(gè)液晶屏并不能做的非常大,所以現(xiàn)在一般采用多個(gè)液晶屏進(jìn)行拼接來(lái)實(shí)現(xiàn)大分辨率大圖像的顯示,為了使不同的原始輸入圖像的分辨率能夠在拼接大屏幕上匹配顯示,就必須對(duì)輸入的視頻圖像進(jìn)行縮放以匹配輸出的分辨率,滿足拼接屏幕的要求[1]。這是插值算法在縮放上的一個(gè)應(yīng)用實(shí)例,插值算法的應(yīng)用很廣泛,除視頻圖像縮放,視頻圖像的旋轉(zhuǎn)也會(huì)用到插值算法。
現(xiàn)代的插值算法包括線性和非線性插值、有理插值、曲面重構(gòu)和自適應(yīng)區(qū)域插值等,但很多算法都由于過(guò)于復(fù)雜難于在硬件上實(shí)現(xiàn),在硬件上實(shí)現(xiàn)常用的插值算法有最鄰近插值算法,雙線性插值算法,雙三次插值算法等[2]。最鄰近插值簡(jiǎn)單且直觀,但得到的圖像質(zhì)量不高。雙線性內(nèi)插值法計(jì)算量大,具有低通濾波器的性質(zhì),使高頻分量受損,所以可能會(huì)使圖像輪廓在一定程度上變得模糊[3]。雙三次插值法用16個(gè)相鄰點(diǎn)做插值,它消除了最鄰近插值的階梯狀邊界問(wèn)題,解決了雙線性插值模糊的問(wèn)題能夠克服以上兩種算法的不足,計(jì)算精度高,但計(jì)算量大[4-7]。本設(shè)計(jì)采用雙三次插值算法,但為提高計(jì)算效率,對(duì)雙三次插值計(jì)算進(jìn)行了離散化處理,變實(shí)數(shù)運(yùn)算為整數(shù)運(yùn)算[8]。有效克服雙三次插值算法計(jì)算量大的問(wèn)題。提出了實(shí)現(xiàn)雙三次卷積模板算法的硬件電路的實(shí)現(xiàn)方法,避免三次方的計(jì)算,使次算法能夠在沒(méi)有顯著增加硬件資源的同時(shí)得到令人滿意的圖像縮放效果。
在數(shù)值分析中,插值算法可用通式表示為
其中:h(x-xk)為插值基函數(shù),ck為第k 個(gè)原函數(shù)的值。不同的插值算法只是基函數(shù)及選取的插值點(diǎn)個(gè)數(shù)n不同。如果基函數(shù)的最高次冪為三次且在定義域內(nèi)基函數(shù)的一階、二階導(dǎo)數(shù)連續(xù),則稱該算法為三次插值算法,若在二維方向上應(yīng)用該算法即雙三次插值算法。
系統(tǒng)采用Keys提出的三次插值基函數(shù),雙三次插值算法基函數(shù)是利用三次多項(xiàng)式h(ω)來(lái)逼近理論上最佳插值函數(shù)sin(π×ω)/(π×ω),其基函數(shù)h(ω)的表達(dá)式如下:
圖像為二維信號(hào),所以,圖像縮放的插值算法要在二維方向應(yīng)用上述算法。先在水平方向,假設(shè)所求插值像素點(diǎn)為F,首先,每一行依據(jù)上述插值原理,得到4 個(gè)臨時(shí)插值像素點(diǎn)的像素值F0,F(xiàn)1,F(xiàn)2,F(xiàn)3。
其中:Fk+4i為輸入圖像鄰近16個(gè)點(diǎn)的像素值,兩像素點(diǎn)的距離為單位1。然后,以Fi為原函數(shù),在垂直方向依據(jù)同樣的原理求得所需插值點(diǎn)F 的值,即
由上述可知計(jì)算時(shí)需要h(Δx)和h(Δy)這兩個(gè)值,如果Δx 和Δy 直接代入基函數(shù)進(jìn)行計(jì)算,需要大量的乘法和浮點(diǎn)運(yùn)算,會(huì)占用大量的系統(tǒng)資源,這里采用將h 的值離散化,模板化進(jìn)行計(jì)算。計(jì)算每一目標(biāo)像素灰度值,需要計(jì)算出目標(biāo)像素點(diǎn)和源像素點(diǎn)的水平、垂直距離,然后根據(jù)距離帶入公式算出相應(yīng)的加權(quán)系數(shù)。
將水平距離和垂直距離Δx,Δy 平均分割為4份,Δx,Δy 都在[0,1]的范圍內(nèi),分為[0,1/4],[1/4,1/2],[1/2,3/4],[3/4,1],如果Δx,Δy 的值落入到這4個(gè)范圍中的一個(gè),將Δx,Δy 都取這個(gè)范圍內(nèi)的平均值,即如果在[0,1/4]則取1/8,如果在[1/4,1/2]則取3/8,如果在[1/2,3/4]則取5/8,如果在[3/4,1]則取7/8。
在進(jìn)行水平方向的卷積時(shí)需要用到
這個(gè)為加權(quán)系數(shù),計(jì)算一個(gè)點(diǎn)的時(shí)候需要4個(gè)像素的點(diǎn)和這個(gè)加權(quán)系數(shù)進(jìn)行卷積。按上面的范圍進(jìn)行計(jì)算加權(quán)系數(shù),得到水平方向加權(quán)系數(shù)的4個(gè)目標(biāo)(每個(gè)數(shù)左移18位,用移位計(jì)算在硬件里方便實(shí)現(xiàn)):
同理垂直方向
FPGA 采用的是Lattice的ECP3 系列的芯片,其框圖如圖1所示。
圖1 FPGA 實(shí)現(xiàn)的原理圖Fig.1 Block diagram of FPGA implementation
如圖1所示,數(shù)據(jù)進(jìn)入到FPGA 后進(jìn)行水平方向的插值計(jì)算,水平方向計(jì)算完,由于計(jì)算垂直插值時(shí)需要用到圖像相鄰的4行數(shù)據(jù),所以將水平方向插值計(jì)算結(jié)果的數(shù)據(jù)送入外部的存儲(chǔ)器進(jìn)行存儲(chǔ),然后從外部存儲(chǔ)器中讀出數(shù)據(jù)進(jìn)行垂直方向的插值。
根據(jù)上面的分析,行卷積的實(shí)現(xiàn)為取相鄰的4個(gè)像素點(diǎn)與相應(yīng)的模板進(jìn)行卷積計(jì)算得到結(jié)果。所以行卷積的計(jì)算就是如何取得相鄰的4個(gè)像素點(diǎn)和如何取得相應(yīng)的模板。在一行上4個(gè)相鄰的像素點(diǎn)需要同時(shí)取得,這樣才能提高計(jì)算速度,為了同時(shí)得到4個(gè)相鄰的像素點(diǎn),輸入緩存用4個(gè)雙口RAM,在視頻圖像進(jìn)入FPGA 時(shí),將一行的數(shù)據(jù)同時(shí)寫(xiě)入4個(gè)RAM 中,同時(shí)讀取時(shí)4個(gè)RAM取相鄰地址的數(shù)據(jù),就得到了一行中4個(gè)相鄰的像素點(diǎn)。而相應(yīng)的模板需要根據(jù)縮放的比例來(lái)進(jìn)行計(jì)算得到。圖2為行卷積實(shí)現(xiàn)的框圖。
需要根據(jù)縮放比例計(jì)算出目標(biāo)像素點(diǎn)對(duì)應(yīng)到源像素點(diǎn)的位置,這個(gè)用scale factor 模塊來(lái)實(shí)現(xiàn),知道目標(biāo)像素點(diǎn)對(duì)應(yīng)到源像素點(diǎn)的位置就能得出需要的模板??s放比例用一個(gè)16.16的定點(diǎn)小數(shù)來(lái)實(shí)現(xiàn),高16位表示整數(shù)部分,低16位表示小數(shù)部分。計(jì)算時(shí)采用累加來(lái)實(shí)現(xiàn),每一次都加上縮放比例,這樣就能得到相鄰的4個(gè)像素點(diǎn)和相應(yīng)的模板。其modelsim 的仿真結(jié)果如圖3所示,仿真時(shí)采用放大1.6 倍時(shí)一行圖像數(shù)據(jù)的情況。
圖2 行卷積實(shí)現(xiàn)原理圖Fig.2 Block diagram of line convolution implementation
圖3 scale_factor的仿真波形Fig.3 Waveform of scale_factor simulation
其中l(wèi)ine為目標(biāo)圖像對(duì)應(yīng)到源圖像的整數(shù)部分的值,x_distance為對(duì)應(yīng)到源圖像的小數(shù)的值,這樣根據(jù)整數(shù)部分可以得到相鄰的4個(gè)像素點(diǎn),根據(jù)距離可以得到相應(yīng)的模板。其中x_distance小數(shù)部分為左移16 位的結(jié)果。根據(jù)上面的計(jì)算可以得到卷積的像素點(diǎn)和模板,然后將得到的數(shù)據(jù)送入乘加器就能得到行卷積的計(jì)算結(jié)果。乘加器用Lattice芯片上的硬件乘加器進(jìn)行實(shí)現(xiàn),硬件乘加器的速度能夠滿足要求。
對(duì)行卷積整體仿真時(shí),利用matlab采集一整幅圖片的像素點(diǎn),將圖片的像素點(diǎn)轉(zhuǎn)化成RGB的格式,用十六進(jìn)制存在文本中,然后利用modelsim 對(duì)文本的讀寫(xiě)功能,產(chǎn)生一個(gè)模擬的VGA時(shí)序視頻信號(hào),信號(hào)包括時(shí)鐘信號(hào)、行同步信號(hào)、場(chǎng)同步信號(hào)、數(shù)據(jù)使能信號(hào)和數(shù)據(jù)信號(hào)。將這幾個(gè)信號(hào)在testbeach中生成,給行卷積的模塊,將行卷積的計(jì)算結(jié)果通過(guò)modelsim 對(duì)文本的操作寫(xiě)入到文本當(dāng)中,將得到的仿真文本的數(shù)據(jù)和matlab仿真數(shù)據(jù)進(jìn)行比對(duì),做到兩個(gè)仿真結(jié)果的數(shù)據(jù)是一樣的,說(shuō)明硬件描述語(yǔ)言對(duì)算法的行卷積能夠?qū)崿F(xiàn)。
系統(tǒng)支持1 080p高清視頻,1 080p視頻的分辨率為1 920×1 080,如果當(dāng)視頻的幀率為60 Hz時(shí),RGB每位采用8bit,這樣一幀圖像的大小為1 920×1 080×24bit約為2M×24bit,進(jìn)行處理時(shí)為了提高計(jì)算效率采用乒乓操作,所以一幀需要的存儲(chǔ)為4M×24bit,所以采用一片512M 的,數(shù)據(jù)寬度為16bit的DDR3 就能滿足圖像緩存的需要。DDR3的寫(xiě)入速度非???,比視頻的像素流快,所以,我們不可能來(lái)一個(gè)像素寫(xiě)入一個(gè)值,這樣操作繁瑣,這就有必要在前面做一個(gè)像素的緩存器,如果視頻圖像的一行像素?cái)?shù)據(jù)存入到緩存中時(shí),將緩存中的數(shù)據(jù)一起寫(xiě)入到DDR3。
DDR3控制器利用現(xiàn)有的IP 核來(lái)實(shí)現(xiàn)。其實(shí)現(xiàn)框圖如圖4所示。
圖4 DDR3控制器實(shí)現(xiàn)框圖Fig.4 Block diagram of DDR3controller
主要包括4個(gè)FIFO,4個(gè)FIFO 分別為發(fā)生請(qǐng)求讀寫(xiě)DDR 時(shí),將請(qǐng)求讀寫(xiě)ddr的地址放入fifo中。ddr_init模塊主要是負(fù)責(zé)ddr的初始化,ddr_ctrl_state主要負(fù)責(zé)處理DDR 進(jìn)行讀寫(xiě)的狀態(tài)控 制,ddr3_sdram_mem_top 是Latticed 的DDR3的IP核。
其中ddr_ctrl_state的內(nèi)部是設(shè)計(jì)一個(gè)狀態(tài)機(jī),來(lái)實(shí)現(xiàn)ddr的讀寫(xiě)控制狀態(tài),其狀態(tài)轉(zhuǎn)移圖如圖5所示。
以下是各個(gè)狀態(tài)所表示的含義:
上電相關(guān)狀態(tài):
S_POWER_UP表示上電開(kāi)始狀態(tài)。
圖5 DDR 的狀態(tài)轉(zhuǎn)移圖Fig.5 State diagram of DDR ctroller
S_CHIP_CONFIG 表示芯片配置狀態(tài)。
S_CONIG_END 表示等待芯片配置完成狀態(tài)。
S_IDLE表示系統(tǒng)空閑等待狀態(tài)。
讀DDR 相關(guān)狀態(tài):
S_RD_RQ0表示讀DDR,讀取FIFO 得到位置數(shù)據(jù)。
S_RD_RQ1表示讀DDR,讀取FIFO 得到位置數(shù)據(jù)。
S_RD_RQ2表示讀DDR,讀取FIFO 得到位置數(shù)據(jù)。
S_RD_RQ3表示讀DDR,讀取FIFO 得到位置數(shù)據(jù)。
S_WAIT_RD_RQ 表示需要幾個(gè)時(shí)鐘(m2~m4),從FIFO 中讀出位置參數(shù)。
S_DDR_RD_CMD 表示位置參數(shù)準(zhǔn)備好,對(duì)DDR IP寫(xiě)入讀命令和相應(yīng)地址。
S_WAIT_RD_END 表示等待DDR 將數(shù)據(jù)讀完。
寫(xiě)DDR 相關(guān)狀態(tài):
S_WR_RQ0表示寫(xiě)1端口數(shù)據(jù)狀態(tài)。
S_WR_RQ1表示寫(xiě)2端口數(shù)據(jù)狀態(tài)。
S_WR_RQ2表示寫(xiě)3端口數(shù)據(jù)狀態(tài)。
S_WAIT_WR_RQ 表示需要幾個(gè)時(shí)鐘(m2~m4),從FIFO 中讀出位置參數(shù)。
S_DDR_WR_CMD 表示位置參數(shù)準(zhǔn)備好,對(duì)DDR IP寫(xiě)入讀命令和相應(yīng)地。
S_WAIR_WR_END 表示等待DDR 將數(shù)據(jù)寫(xiě)完。
列卷積的計(jì)算方法和行卷積的計(jì)算方法相同,其實(shí)現(xiàn)框圖如圖6所示。只是列卷積時(shí)需要得到相鄰四列的像素值,這個(gè)可以通過(guò)每次從DDR3中讀出相鄰的四列放入4 個(gè)RAM 中,這樣從每一個(gè)RAM 中可以得到相鄰四列的4個(gè)像素值。
其中DDR 數(shù)據(jù)讀取控制模塊主要是根據(jù)圖像插值算法的需要從DDR 中讀出相鄰的4 行,分別放入到4 個(gè)RAM 中,然后通過(guò)控制RAM的地址來(lái)讀取列相鄰的4 個(gè)像素點(diǎn)。同時(shí)系數(shù)讀取控制器也根據(jù)需要讀出相應(yīng)的列插。
圖6 列卷積實(shí)現(xiàn)框圖Fig.6 Block diagram of column convolution implementation
此算法是在Lattice ECP3-17EA 來(lái)實(shí)現(xiàn)的,圖7為實(shí)現(xiàn)此算法的資源的情況,從圖片中可以看出這個(gè)算法占用的資源不是很多,所以在此FPGA 芯片上實(shí)現(xiàn)此算法還是可行的。
做試驗(yàn)時(shí),先用matlab 將算法用軟件來(lái)實(shí)現(xiàn),將仿真得到的結(jié)果保存。通過(guò)硬件描述語(yǔ)言實(shí)現(xiàn)后,用modelsim 仿真,同樣利用modelsim的讀寫(xiě)功能,對(duì)一張圖片進(jìn)行仿真,結(jié)果保存在文件里,將matlab得到的結(jié)果和modelsim 得到的仿真結(jié)果進(jìn)行比較,可以發(fā)現(xiàn)兩個(gè)結(jié)果是完全一樣的。說(shuō)明用硬件語(yǔ)言實(shí)現(xiàn)了該算法。
圖7 FPGA 資源的使用情況Fig.7 Use of FPGA resources
將雙三次插值算法改成模板方法實(shí)現(xiàn),省去了很多的浮點(diǎn)計(jì)算,使其在硬件上耗費(fèi)更少的資源。將圖像看成二維的,先計(jì)算水平的插值,再算垂直的插值,這樣在硬件上也可以減少資源,水平和垂直同時(shí)計(jì)算,一次要取臨近的16個(gè)點(diǎn),然后進(jìn)行16個(gè)乘加運(yùn)算,而先水平后垂直,一次只需取4個(gè)點(diǎn),需要4個(gè)乘加運(yùn)算,相當(dāng)于需要兩次的4個(gè)乘加運(yùn)算。這樣可以減少乘加器的數(shù)量。
雙三次插值算法能夠得到令人滿意的圖像縮放效果,但因其算法復(fù)雜,硬件上實(shí)現(xiàn)很少應(yīng)用,而本文通過(guò)分析雙三次插值的基本原理,提出了將圖像分為二維來(lái)進(jìn)行計(jì)算,先水平后垂直實(shí)現(xiàn)雙三次插值算法的硬件實(shí)現(xiàn)思路。同時(shí)將計(jì)算過(guò)程離散化,化浮點(diǎn)計(jì)算為整數(shù)計(jì)算,避免了三次方的計(jì)算。通過(guò)實(shí)驗(yàn)可以發(fā)現(xiàn),利用FPGA 實(shí)現(xiàn)雙三次卷積模板算法可以比實(shí)現(xiàn)雙三次插值算法節(jié)約硬件資源。同時(shí)可以得到不錯(cuò)的圖像效果,適合工程的應(yīng)用。
[1] Xiang Z Q,Zou X C,Liu Z L.An high quality image scaling engine for large-scale LCD[C].ICSP2006 Proceedings,Wuhan,China:ICSP,2006.
[2] 王增發(fā),孫麗娜.CFA 圖像實(shí)時(shí)插值在FPGA 上的應(yīng)用[J].液晶與顯示,2013,28(4):615-619.Wang Z F,Sun L N.Application of CFA images interpolation algorithm in FPGA real-time system [J].Chinese Journal of Liquid Crystals and Displays,2013,28(4):615-619.(in Chinese)
[3] 孫紅進(jìn).FPGA 實(shí)現(xiàn)的視頻圖像縮放顯示[J].液晶與顯示,2010,25(1):130-133.Sun H J.FPGA realization of video lmage zooming display[J].Chinese Journal of Liquid Crystals and Displays,2010,25(1):130-133.(in Chinese)
[4] 張阿珍,劉政林,鄒雪城,等.基于雙三次插值算法的圖像縮放引擎的設(shè)計(jì)[J].微電子學(xué)與計(jì)算機(jī),2007,24(1):49-51.ZHANG A Z,LIU Z L,ZOU X C,et al Design of image scaling engine based bicubic interpolation algorithm[J].Microelectronics &Computer,2007,24(1):49-51.(in Chinese)
[5] 王會(huì)鵬,周利莉,張杰.一種基于區(qū)域的雙三次圖像插值算法[J].計(jì)算機(jī)工程,2010,36(19):216-218.Wang H P,Zhou L L,Zhang J.Region-based bicubic image interpolation algorithm [J].Computer Engineering,2010,36(19):216-218.(in Chinese)
[6] Li Y H,Zhen J,Li J H,et al.The hardware realization of the bicubic interpolation enlargement algorithm based on FPGA[C]//Third International Symposium on Information Processing,Qingdao,China:ISIP,2010:277-281.
[7] Nuno-Maganda M A,Arias-Estrad M O.Real-time FPGA-based architecture for bicubic interpolation:An application for digital image scaling[C]//Proceedings of the 2005 International Conference on Reconfigurable Computing and FPGAs,Puebla City,Mexico:Computer Society,2005:31-42.
[8] 高成敏,陳良,林永和.雙三次卷積模板算法[J].計(jì)算機(jī)工程與應(yīng)用,2009,45(17):151-154.Gao C M,Chen L,Lin Y H.Bicubic convolution template algorithm[J].Computer Engineering and Applications,2009,45(17):151-154.(in Chinese)
[9] 樊博,王延杰,孫宏.FPGA 實(shí)現(xiàn)高速實(shí)時(shí)多端口圖像處理系統(tǒng)的研究[J].液晶與顯示,2013,28(4):620-625.Fan B,Wang Y J,Sun H.High speed real-time multiport image algorithm in FPGA real-time system[J].Chinese Journal of Liquid Crystals and Displays,2013,28(4):620-625.(in Chinese)