關 閉

新聞中心

EEPW首頁 > 工控自動化 > 設計應用 > 基于ADSP-BF533處理器的去方塊濾波器的實現(xiàn)及優(yōu)化

基于ADSP-BF533處理器的去方塊濾波器的實現(xiàn)及優(yōu)化

作者: 時間:2008-03-20 來源:網絡 收藏
 a) 算法中的函數邏輯關系復雜,判斷、跳轉、函數調用等情況特別多;

  b) 最耗時的部分,即函數循環(huán)的內部存在大量的重復計算,造成劇增;

  c) 算法中用到的不少數據,例如運動矢量、圖像的亮度和色度數據等存放在速度較慢的片外SDRAM中,但在濾波過程中的頻繁調用,使數據搬運時間劇增。

  針對耗時的原因,對算法進行了以下改進:

  3.2.1 將原程序中復雜的函數及循環(huán)簡單化

  指令長度和運算速度是相互制約的,往往將代碼通過條件判斷可以進行高度精簡,但由于增加了機器的判斷工作量而使得速度變慢;反之,將代碼中的判斷去除,程序進行展開,往往可以減少耗費的,但代碼長度會增加。JM8.6中的去方塊濾波代碼較短,將其中的函數間關系簡單化,以代碼長度增加換取執(zhí)行速度的增加。

  對于系統(tǒng)運行最耗時的循環(huán)體,采取適當改寫循環(huán)形式、多重循環(huán)體展開等方法有效地減少運算的復雜度。此外,減少調用函數次數,改寫if-else語句也是有效的優(yōu)化手段。

  3.2.2 去除參考代碼中的大量冗余代碼和重復計算

  a) 因為使用的參考代碼是JM8.6中的去方塊濾波模塊,該模塊可以對H.264的各種擋次和級別的碼流進行濾波,而解碼器是基于基本擋次的,僅僅涉及到I幀、P幀的濾波操作,因此可以將參考代碼中的關于B幀、SP/SI幀、場模式和幀場自適應模式的相關濾波部分去除。

  b) 程序在獲取濾波強度BS和進行亮度/色度的濾波過程中,都要獲取當前所在的宏塊的相鄰宏塊的可達性的信息(即這個宏塊能否被使用,通過調用GetNeighbour 函數實現(xiàn)),由于濾波是按照宏塊中的邊緣先垂直后水平進行的,對于一條邊緣獲取的信息是相同的,因此這個操作可以對每條邊緣獲取一次即可,不必在循環(huán)內部反復判斷。同時在濾波算法中,僅需要獲取在當前宏塊上面和左邊的宏塊的可達性信息,可將獲取當前宏塊的左上及右上角宏塊信息的冗余操作去除。同時,獲取水平方向的濾波強度的函數調用getNeighbour時,getNeighbour參數的取值分別是luma為定值1,xN是[-1,3,7,11],yN是[0-15],此時函數getNeighbour中的很多if-else語句是無效的判斷,這些冗余判斷占用了大量的時鐘周期。此外,對各個分支的概率進行分析,將概率最大的判斷分支放在前面執(zhí)行,也提高了函數執(zhí)行的速度。

  以下是精簡后的GetNeighbour函數代碼,僅有數條語句,大大減少了運算量。

  

  

  c) 在JM86參考代碼中對于一個亮度宏塊的16×4共64條像素邊緣的BS值逐條獲取,而通過對BS獲取條件進行分析可知,處于兩個間垂直邊緣或水平邊緣的4條像素邊緣的BS值分別是相等的。因此,對一條邊緣僅要進行獲取第1、5、9、13條像素邊緣的BS值,再賦給相應的其他像素邊緣即可,由于獲取BS值的操作位于循環(huán)中,需要經過許多判斷及運算,通過這一改進,大大簡化了

  d) 參考代碼中的循環(huán)內部有很多語句與循環(huán)參數無關,可以將這些語句調整至循環(huán)外部,避免了冗余計算。

  3.2.3 利用BPP分塊處理技術解決片外數據頻繁調用的問題

  針對頻繁調用片外數據影響了程序的運行速度的問題,采用BPP分塊技術進行優(yōu)化。在片內的L1緩存中開辟3塊空間分別存放待濾波的亮度分量、色度U分量、色度V分量。根據每個宏塊進行濾波時可能涉及的像素范圍,在對CIF圖像進行濾波時,將一幀的396個宏塊分成4類:A類為第1個宏塊,其上邊緣和左邊緣都是圖像邊緣,對其濾波前讀入的亮度數據是16×16,色度數據是2個8×8;B類為第1個宏塊行中除去第1個宏塊的其余宏塊,其上邊緣是圖像邊緣,對其濾波前讀入的亮度數據是16×20,色度數據是兩個8×12;C類是第1個宏塊列中除去第1個宏塊的其余宏塊,其左邊緣是圖像邊緣,對其濾波前讀人的亮度數據是20×16,色度數據是2個12×8;D類是除掉A、B、C這3類宏塊的其余宏塊,也就是上邊緣和左邊緣都在當前圖像內的宏塊,對其濾波前讀入的亮度數據是20×20,色度數據是2個12×12。

  進行濾波時,首先按宏塊的類型以不同的數量從片外的數據緩存中整塊地讀入亮度和色度數據到片上的3塊濾波緩存,然后進行濾波處理,并將結果數據重新存儲到片外存儲空間中。通過這種方法,一方面在一定程度上減少了頻繁調用片外數據的時間,提高了運行速度;另一方面通過對待濾波宏塊的細分,減少了參考代碼中的判斷引起的流水線中斷,也在一定程度上提升了程序速度。

  3.3 匯編級別的優(yōu)化

  BlackfinBF533處理器的內核支持C或C++語言,但由系統(tǒng)自動將C程序翻譯成匯編語言效率比較低下,因此對一些系統(tǒng)調用比較頻繁、耗時較多的模塊,可以用人工將其轉化成高效率的匯編語言來提高運行速度。主要通過以下幾個方面來提高程序的速度:

  a) 以寄存器變量代替。在C語言中,子程序和函數中往往使用來暫時存放數據。當程序運行時,編譯器為聲明的所有開辟臨時內存空間,對于局部變量的存取操作都涉及到內存的存取,而內存訪問的速度相對于寄存器訪問是很慢的。因此,可以利用系統(tǒng)中的數據寄存器、指針寄存器來替代僅僅起暫存作用的局部變量,從而大大節(jié)省系統(tǒng)訪問內存帶來的時間延遲。但由于系統(tǒng)中的寄存器數量對于局部變量來說相當有限,因此必須合理高效地使用寄存器。

  b) 以硬件循環(huán)代替軟件循環(huán)。軟件循環(huán)是指在for或while等循環(huán)的開始或結尾處設置判斷條件來控制循環(huán)的開始、繼續(xù)、結束。軟件循環(huán)的條件判斷指令會動態(tài)地選擇分支,一旦發(fā)生跳轉,會阻塞流水線,而保持流水線的暢通是保持高效運行的關鍵因素。Blackfin處理器有專用的硬件支持兩級嵌套的零開銷硬件循環(huán),這種方式不需要判斷條件轉移,DSP硬件根據預定的循環(huán)次數自動執(zhí)行循環(huán)并結束循環(huán),從而保證了流水線的暢通,提高速度。

  c) 充分利用。Blackfin533外部32位,一次可存取4字節(jié)。因此,充分利用數據總訪問寬度,特別在操作大量數據時,保持一次存取4字節(jié),可減少數,從而提高執(zhí)行速度。

  d) 高效使用并行指令和向量指令。并行指令和向量指令是Blackfin系列DSP的一大特點。通過對并行指令的使用,可以充分發(fā)揮Blackfin處理器的SIMD系統(tǒng)結構的優(yōu)點及硬件資源的并行處理能力,減少指令數,從而提高程序執(zhí)行效率。往往通過對程序的合理安排可以做到使用1條并行指令來替代2條或3條非并行指令。向量指令則充分利用指令寬度,同時對多個數據流進行相同操作,如要進行2個16位的算術或移位操作,完全可以通過1個32位的向量指令來實現(xiàn),從而以1個時鐘周期來實現(xiàn)原來2個周期的工作。例如R3=abs R1(V)就用1個同時實現(xiàn)2個16位數據的求絕對值操作。

  e) 合理配置數據存儲空間。限于DSP片內和片外數據存儲空間的訪問速度和容量特點,片內空間存取速度快但容量很小,而片外空間較大但訪問速度慢,因此,合理地分配數據存放位置對于提高程序的運行速度是十分關鍵的。對于使用頻率高的數據盡量放在片內空間中,而不常用的數據放在片外空間中。若要存取位于片外的數據時,應將待存取的數據盡量安排成連續(xù)分布,一次將大塊的片外數據讀進片內緩存,避免頻繁讀取片外數據帶來的時間浪費。

  4 優(yōu)化實現(xiàn)的結果

  測試優(yōu)化效果的方法是將參考代碼JM8.6中的去方塊濾波C程序模塊加到原有的解碼器中進行測試,并與經過系統(tǒng)、算法、匯編3個級別優(yōu)化的去方塊濾波匯編程序模塊的測試周期進行對比。選擇的測試圖像序列為Clarie.cif、Paris.cif、Mobile.cif,測試數據見表1。

  

  

  由表1可以看出,與未優(yōu)化前的JM8.6中的C程序代碼相比,經過優(yōu)化后的去方塊濾波匯編模塊效率提高了7倍左右。

  5 結束語

  本文通過系統(tǒng)、算法及匯編3個級別優(yōu)化實現(xiàn)了H.264中的去方塊濾波功能,特別是通過改進去方塊濾波的,對待濾波的宏塊進行分類以及充分地利用并行指令、向量指令等匯編級別的優(yōu)化手段,取得了較好的優(yōu)化效果。



評論


相關推薦

技術專區(qū)

關閉