雙線性插值算法的FPGA實現


      本設計預實現720P到1080P的圖像放大,輸入是YUV444數據,分量像素位寬為10bit,采用的算法為雙線性插值法,開發平台是xiinx K7開發板。

      雙線性插值法即雙次線性插值,首先在橫向線性插值,然后在縱向線性插值,如圖1所示。

          

                   圖1 雙線性插值原理                                                      圖2 雙線性插值FPGA結構

  在FPGA中實現主要依靠雙線性插值計算公式,即:

                                                   P_new=(1-dx)(1-dy)P1+dx(1-dy)P2+(1-dx)dyP3+dxdyP4

  為減少乘法的使用,轉換為

                                                   P_new=P1+[(P4-P3)+(P1-P2)]dxdy-(P1-P2)dx+(P3-P1)dy

  其中,P1,P2,P3,P4指的是待插值點周圍4個像素點。根據公式可以將插值計算分為3部分:1.相鄰像素點(2x2像素模板)的求取。

2.插值系數的求取以及插值系數的計算。同時為達到流水線處理,在獲取2x2像素模板后加一級緩存,所以最終的FPGA實現結構如圖2所示。其中,

本次設計是對YUV3個分量分別作插值處理,所以使用了3個雙線性插值模塊。

       image_2x2模塊用於求取像素點2x2模板,使用2級雙口bram級聯實現(如果分辨率低可選擇移位寄存器)。每個bram緩存一行圖像數據,並

在bram輸出端插入寄存器作同步用,按照2x2模板位置取出數據,並拼接成40bit。注意:當像素點在邊緣時,則采取像素復制的方式得到2x2模板,

即有效像素點取不到的位置使用相鄰點替代。

        image_buff模塊用於2x2像素模板的緩存,輸入為40bit(4個像素點),使用兩個bram乒乓操作實現。該模塊的讀地址拉出,供inter_calcu模塊

讀取像素點數據。

        inter_calcu模塊用於插值系數的求取和插值系數的計算,是雙線性插值算法的核心模塊。該模塊主要通過縮放坐標轉換公式反推原始坐標,然后

根據原始坐標取出前一級image_buff模塊數據。轉換公式為:

              srcx=(dstx+0.5)*(src_width/dst_width)-0.5,即dstx=(srcx+0.5)*(dst_width/src_width)-0.5,Y方向同理。

  當前像素點一直流轉,即可反推出原始坐標,同時由於FPGA不善於處理浮點數,將其定點化,左移。在本此設計中,src_width/dst_width = 1280/1920 = 2/3,

最后有公式:

            128srcx = 85.33dstx-21.33,即 2^13*srcx = {7'd85,6'b010101}dstx-{7'd21,6'b010101};

           根據該公式可推算出sryx,srcy的值,其整數為2x2模板的bram坐標({srxy,srcx}),其小數部分即為雙線性插值計算公式中的dx,dy。反推坐標部分代碼如下所示:

//Intermediate coefficient,插值坐標計算
//反推坐標
assign P1=bram_rddata_i[39:30];
assign P2=bram_rddata_i[29:20];
assign P3=bram_rddata_i[19:10];
assign P4=bram_rddata_i[9:0];


assign corx_wire=(dstx==11'd0)?{7'b0010101,6'b010101}:{7'b1010101,6'b010101}*dstx-{7'b0010101,6'b010101};
assign srcx=corx_wire[23:13];
assign dx=corx_wire[12:0];

assign cory_wire=(dsty==11'd0)?{7'b0010101,6'b010101}:{7'b1010101,6'b010101}*dsty-{7'b0010101,6'b010101};
assign srcy=cory_wire[23:13];
assign dy=cory_wire[12:0];

           至此,雙線性插值公式中的dx,dy,P1,P2,P3,P4便全部求出,即可計算雙線性插值。為達到更好的時序,最后選用4級流水線的方式實現該公式:

P_new=P1+[(P4-P3)+(P1-P2)]dxdy-(P1-P2)dx+(P3-P1)dy,即[(P4-P3)+(P1-P2)]為一級,[(P4-P3)+(P1-P2)]dx為一級,[(P4-P3)+(P1-P2)]dxdy為第三級,

總的加法為第四級,最后實現的效果如圖3和圖4所示。

 

圖3 720P SDI視頻源

           圖4 縮放后效果圖  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM