《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 模擬設(shè)計(jì) > 設(shè)計(jì)應(yīng)用 > 基于ADSP-BF533處理器的濾波器的實(shí)現(xiàn)及優(yōu)化
基于ADSP-BF533處理器的濾波器的實(shí)現(xiàn)及優(yōu)化
莫啟敏 吳啟宗 朱秀昌
摘要: 本文通過系統(tǒng)、算法及匯編3個(gè)級(jí)別優(yōu)化實(shí)現(xiàn)了H.264中的去方塊濾波功能,特別是通過改進(jìn)去方塊濾波的實(shí)現(xiàn)算法,對(duì)待濾波的宏塊進(jìn)行分類以及充分地利用并行指令、向量指令等匯編級(jí)別的優(yōu)化手段,取得了較好的優(yōu)化效果。
Abstract:
Key words :

引言  

在已有的基于塊的視頻編解碼系統(tǒng)中,當(dāng)碼率較低時(shí)都存在方塊效應(yīng),新的視頻編碼標(biāo)準(zhǔn)H.264中亦是如此。產(chǎn)生這種方塊效應(yīng)的主要原因有兩個(gè):一是由于對(duì)變換后的殘差系數(shù)進(jìn)行的基于塊的整數(shù)變換后,以大的量化步長(zhǎng)對(duì)變換系數(shù)進(jìn)行量化會(huì)使得解碼后的重建圖像的方塊邊緣出現(xiàn)不連續(xù);二是在運(yùn)動(dòng)補(bǔ)償中插值運(yùn)算引起的誤差使得編解碼器反變換后的重建圖像會(huì)出現(xiàn)方塊效應(yīng)。如果不進(jìn)行處理,方塊效應(yīng)還會(huì)隨著重構(gòu)幀積累下去,從而嚴(yán)重地影響圖像的質(zhì)量和壓縮效率。為了解決這一問題,H.264中的去方塊濾波技術(shù)采用較為復(fù)雜的自適應(yīng)濾波器" title="濾波器">濾波器來(lái)有效地去除這種方塊效應(yīng)。因此,如何在實(shí)時(shí)視頻解碼中優(yōu)化去方塊濾波算法,降低計(jì)算復(fù)雜度,提高重建圖像質(zhì)量,就成了H.264解碼的一個(gè)關(guān)鍵問題。
  
1 H.264的去方塊濾波
  
1.1 濾波原理
  
大的量化步長(zhǎng)會(huì)造成相對(duì)較大的量化誤差,這就可能將原來(lái)相鄰塊“接壤”處像素間灰度的連續(xù)化變成了“臺(tái)階”變化,主觀上就有”偽邊緣”的方塊效應(yīng)。去方塊效應(yīng)的方法就是在保持圖像總能量不變的條件下,把這些臺(tái)階狀的階躍灰度變化重新復(fù)原成臺(tái)階很小或者近似連續(xù)的灰度變化,同時(shí)還必須盡量減少對(duì)真實(shí)圖像邊緣的損傷。
  
1.2 自適應(yīng)濾波過程
  
在H.264中,去方塊濾波器是按照16×16像素的宏塊為單位順序進(jìn)行的,在宏塊中按照每個(gè)4×4子塊之間的邊緣以先垂直后水平的順序進(jìn)行,從而對(duì)整個(gè)重建圖像中的所有邊緣(圖像邊緣除外)進(jìn)行濾波。具體的邊緣示意圖如圖1所示。對(duì)于16×16像素的亮度宏塊,共有4條垂直邊緣,4條水平邊緣,每條邊緣又分為16條像素邊緣。而對(duì)應(yīng)8×8像素的色度宏塊有垂直邊緣和水平邊緣各2條,每條邊緣分為8條像素邊緣。像素邊緣是進(jìn)行濾波的基本單元。



1.2.1 濾波器在兩個(gè)層次上的自適應(yīng)性" title="自適應(yīng)性">自適應(yīng)性
  
H.264中的去方塊濾波所以有較好的濾波效果,是由于它在以下兩個(gè)層次上的自適應(yīng)性。
  
1) 濾波器在4×4子塊級(jí)別的自適應(yīng)性
  
濾波是基于各個(gè)子塊中的像素邊緣進(jìn)行的,通過對(duì)每一條像素邊緣定義一個(gè)參數(shù)BS(邊緣強(qiáng)度)來(lái)自適應(yīng)地調(diào)節(jié)濾波的強(qiáng)弱和涉及的像素點(diǎn)。色度塊的像素邊緣強(qiáng)度與相應(yīng)的亮度像素邊緣強(qiáng)度相同。假設(shè)P和Q為兩個(gè)相鄰的4×4子塊,其中的像素邊緣強(qiáng)度通過圖2的步驟獲得。BS的值越大,則對(duì)相應(yīng)的邊緣兩側(cè)進(jìn)行的濾波越強(qiáng),這是根據(jù)產(chǎn)生方塊效應(yīng)的原因來(lái)設(shè)定的,如采用幀內(nèi)預(yù)測(cè)模式的子塊的方塊現(xiàn)象較明顯,則對(duì)該子塊中的對(duì)應(yīng)邊緣設(shè)定較大的像素邊緣強(qiáng)度值來(lái)進(jìn)行強(qiáng)濾波。


2) 濾波器在像素點(diǎn)級(jí)別上的白適應(yīng)性
  
正確區(qū)分由于量化誤差、運(yùn)動(dòng)補(bǔ)償產(chǎn)生的虛假邊緣和圖像中的真實(shí)邊界才能得到好的濾波效果。通常,真實(shí)邊界兩側(cè)的像素梯度差值要比虛假邊界兩側(cè)的像素梯度差值大,因此,濾波器通過對(duì)邊緣兩側(cè)像素點(diǎn)的灰度值的梯度差值設(shè)定門限α、對(duì)同一側(cè)的相鄰像素點(diǎn)的灰度值的梯度差值設(shè)定門限β來(lái)進(jìn)行真?zhèn)芜吔绲呐卸ā?alpha;和β的值主要與量化步長(zhǎng)有關(guān),當(dāng)量化步長(zhǎng)大時(shí),量化誤差也大,方塊效應(yīng)就明顯,易產(chǎn)生虛假邊界,因此門限值隨之變大,放寬濾波條件。反之,量化步長(zhǎng)小時(shí)門限值也變小,體現(xiàn)了自適應(yīng)性。采樣點(diǎn)的設(shè)置見圖3。若條件都滿足,則進(jìn)開始濾波。



除了這兩種自適應(yīng)性,還可以通過設(shè)置位于片級(jí)的系數(shù)LoopFilterAlphaC0Offset、LoopFilterBetaOffset來(lái)調(diào)整濾波 的強(qiáng)度。例如當(dāng)傳輸碼率較低時(shí),方塊效應(yīng)較明顯,接收端想要主觀質(zhì)量相對(duì)較好的圖像,則編碼端可通過設(shè)置位于片頭信息中的濾波偏移量LoopFil-terAlphaC0Offset,LoopFilterBetaOffset為正值,以此增大α和β來(lái)加強(qiáng)濾波,通過去除方塊效應(yīng)來(lái)提高圖像主觀質(zhì)量。或者對(duì)于高分辨率的圖像,可以通過傳送負(fù)值偏移來(lái)減弱濾波,盡量保持圖像的細(xì)節(jié)。
  
1.2.2 依據(jù)各像素邊緣BS值對(duì)相鄰的像素濾波
  
若當(dāng)前像素邊緣符合濾波條件,則根據(jù)其相應(yīng)的BS值選取對(duì)應(yīng)的濾波器進(jìn)行濾波并且進(jìn)行適當(dāng)?shù)募羟胁僮?,以防止圖像的模糊。
  
當(dāng)BS值是1,2,3時(shí),采用一個(gè)4抽頭的線性濾波器,對(duì)輸入的P1、P0、Q0、Q1進(jìn)行濾波調(diào)整得到新的Q0、P0,如果內(nèi)部有虛假邊界,則進(jìn)一步調(diào)整Q1、P1的值。
  
當(dāng)BS值是4時(shí),則對(duì)應(yīng)的是采用幀內(nèi)編碼模式的宏塊邊緣,應(yīng)采用較強(qiáng)的濾波以達(dá)到增強(qiáng)圖像質(zhì)量的目的。對(duì)于亮度分量,若條件(| P0~Q0 | <((α》2)+2))&abs(P2-P0)成立,則選擇5拙頭濾波器對(duì)P0、P2進(jìn)行濾波,使用較強(qiáng)的4抽頭濾波器對(duì)P1進(jìn)行濾波;若條件不成立,則只使用較弱的3抽頭濾波器對(duì)P0進(jìn)行濾波,而P1、P2的值保持不變。對(duì)于色度分量,若上述條件滿足,則對(duì)P0進(jìn)行3抽頭濾波,若條件不滿足,則所有的像素值都不修改。對(duì)Q0、Q1、Q2的濾波操作與P0、P1、P2的濾波操作相同。

2 BF533的特點(diǎn)和結(jié)構(gòu)
  
我們的H.264去方塊濾波是在ADI公司的Blackfin ADSP-BF533" title="ADSP-BF533">ADSP-BF533處理器上實(shí)現(xiàn)的。Blackfin系列DSP主要具有以下特點(diǎn):
  
a) 高度并行的計(jì)算單元。Blackfin系列DSP體系架構(gòu)的核心是DAU(數(shù)據(jù)算術(shù)單元),包括2個(gè)16位的MAC(乘法累加器)、2個(gè)40位的ALU(算術(shù)邏輯單元),1個(gè)40位單桶形的移位器,4個(gè)8位視頻ALU。每個(gè)MAC能在單一時(shí)鐘周期內(nèi)對(duì)4個(gè)獨(dú)立的數(shù)據(jù)操作數(shù)執(zhí)行16位乘16位的乘法運(yùn)算。40位的ALU可累加2個(gè)40位的數(shù)字或者4個(gè)16位的數(shù)字。這種體系架構(gòu)可靈活地進(jìn)行8值、16位、32位的數(shù)據(jù)運(yùn)算。
  
b) 動(dòng)態(tài)電源管理。處理器可以通過改變電壓和工作頻率,消耗比其他DSP更少的功耗。Blackfin系列DSP體系架構(gòu)的允許電壓和頻率獨(dú)立調(diào)整,使得每一項(xiàng)任務(wù)的消耗能量最小,在性能和功耗間有較好的平衡,適合實(shí)時(shí)視頻編/解碼器的開發(fā),特別是對(duì)功耗有嚴(yán)格要求的實(shí)時(shí)運(yùn)動(dòng)視頻處理。
  
c) 高性能的地址產(chǎn)生器。具有2個(gè)DAG(數(shù)據(jù)地址產(chǎn)生器),用于產(chǎn)生支持高級(jí)DSP濾波運(yùn)算的地址的復(fù)合裝入或存儲(chǔ)單元。支持位倒序?qū)ぶ泛脱h(huán)緩沖以及其他多種尋址方式,提高了編程的靈活性。
  
d) 分層結(jié)構(gòu)的內(nèi)存。分層結(jié)構(gòu)的內(nèi)存縮短了內(nèi)核對(duì)內(nèi)存的訪問時(shí)間,以獲得最大的數(shù)據(jù)吞吐量、較少的延遲和縮短的處理空載時(shí)間。
  
e) 特有的視頻操作指令。提供適合DCT(離散余弦變換)、霍夫曼編碼等視頻壓縮標(biāo)準(zhǔn)中常用的操作指令,這些視頻指令還消除了主處理器與一個(gè)獨(dú)立的視頻編解碼器之間的復(fù)雜和易混和通信問題。這些特點(diǎn)有助于為終端應(yīng)用縮短產(chǎn)品上市時(shí)間,同時(shí)降低了系統(tǒng)的總體成本。
  
我們使用的ADSP-BF533可以實(shí)現(xiàn)600 MHz的持續(xù)工作,具有:4 GB的統(tǒng)一尋址空間;80 kB SRAM的L1指令指令存儲(chǔ)器,其中16 kB可配置成4路的聯(lián)合Cache;2個(gè)32 kB SRAM的L1數(shù)據(jù)存儲(chǔ)器,其中一半可配置為Cache;集成豐富的外圍設(shè)備和接口。
  
3 基于BF533的H.264去方塊濾波優(yōu)化實(shí)現(xiàn)
  
去方塊濾波器在Blackfin BF533優(yōu)化實(shí)現(xiàn)主要分為系統(tǒng)級(jí)別的優(yōu)化、算法級(jí)別的優(yōu)化、匯編級(jí)別的優(yōu)化3個(gè)級(jí)別。
  
3.1 系統(tǒng)級(jí)別的優(yōu)化
  
打開DSP平臺(tái)中編譯器的優(yōu)化選項(xiàng)并將優(yōu)化速度設(shè)置為最快,打開Automatic Inlining開關(guān)(自動(dòng)內(nèi)聯(lián)開關(guān))以及Interprocedural optimization開關(guān)(優(yōu)化過程開關(guān)),通過以上的一些設(shè)置充分發(fā)揮Blackfin BF533的硬件性能。
 
3.2 算法級(jí)別的優(yōu)化
  
將JM8.6參考模型中的去方塊濾波部分進(jìn)行適當(dāng)?shù)南到y(tǒng)修改,移植到原有的基于Blackfin BF533的H.264基本擋次的解碼器中,并通過圖像序列對(duì)其進(jìn)行耗時(shí)分析。選用碼率為400 kbit/s左右的Paris.cif、Mobile.cif、Foreman.cif、Claire.cif序列,去方塊濾波所耗費(fèi)的時(shí)鐘周期約為1 600 MHz~1 800 MHz,即使在經(jīng)過系統(tǒng)優(yōu)化后,計(jì)算復(fù)雜度仍然相當(dāng)大,效率很低,對(duì)于Blackfin BF533處理器600 MHz的持續(xù)工作頻率是相當(dāng)大的負(fù)擔(dān)。
  
通過分析JM8.6中去方塊濾波程序,其效率低下的主要原因是:
  
a) 算法中的函數(shù)邏輯關(guān)系復(fù)雜,判斷、跳轉(zhuǎn)、函數(shù)調(diào)用等情況特別多;
  
b) 最耗時(shí)的部分,即函數(shù)循環(huán)的內(nèi)部存在大量的重復(fù)計(jì)算,造成計(jì)算復(fù)雜度劇增;
  
c) 算法中用到的不少數(shù)據(jù),例如運(yùn)動(dòng)矢量、圖像的亮度和色度數(shù)據(jù)等存放在速度較慢的片外SDRAM中,但在濾波過程中的頻繁調(diào)用,使數(shù)據(jù)搬運(yùn)時(shí)間劇增。
  
針對(duì)耗時(shí)的原因,對(duì)算法進(jìn)行了以下改進(jìn):
  
3.2.1 將原程序中復(fù)雜的函數(shù)及循環(huán)簡(jiǎn)單化
  
指令長(zhǎng)度和運(yùn)算速度是相互制約的,往往將代碼通過條件判斷可以進(jìn)行高度精簡(jiǎn),但由于增加了機(jī)器的判斷工作量而使得速度變慢;反之,將代碼中的判斷去除,程序進(jìn)行展開,往往可以減少耗費(fèi)的指令周期,但代碼長(zhǎng)度會(huì)增加。JM8.6中的去方塊濾波代碼較短,將其中的函數(shù)間關(guān)系簡(jiǎn)單化,以代碼長(zhǎng)度增加換取執(zhí)行速度的增加。
  
對(duì)于系統(tǒng)運(yùn)行最耗時(shí)的循環(huán)體,采取適當(dāng)改寫循環(huán)形式、多重循環(huán)體展開等方法有效地減少運(yùn)算的復(fù)雜度。此外,減少調(diào)用函數(shù)次數(shù),改寫if-else語(yǔ)句也是有效的優(yōu)化手段。
  
3.2.2 去除參考代碼中的大量冗余代碼和重復(fù)計(jì)算
  
a) 因?yàn)槭褂玫膮⒖即a是JM8.6中的去方塊濾波模塊,該模塊可以對(duì)H.264的各種擋次和級(jí)別的碼流進(jìn)行濾波,而解碼器是基于基本擋次的,僅僅涉及到I幀、P幀的濾波操作,因此可以將參考代碼中的關(guān)于B幀、SP/SI幀、場(chǎng)模式和幀場(chǎng)自適應(yīng)模式的相關(guān)濾波部分去除。
 
b) 程序在獲取濾波強(qiáng)度BS和進(jìn)行亮度/色度的濾波過程中,都要獲取當(dāng)前子塊所在的宏塊的相鄰宏塊的可達(dá)性的信息(即這個(gè)宏塊能否被使用,通過調(diào)用GetNeighbour 函數(shù)實(shí)現(xiàn)),由于濾波是按照宏塊中的邊緣先垂直后水平進(jìn)行的,對(duì)于一條邊緣獲取的信息是相同的,因此這個(gè)操作可以對(duì)每條邊緣獲取一次即可,不必在循環(huán)內(nèi)部反復(fù)判斷。同時(shí)在濾波算法中,僅需要獲取在當(dāng)前宏塊上面和左邊的宏塊的可達(dá)性信息,可將獲取當(dāng)前宏塊的左上及右上角宏塊信息的冗余操作去除。同時(shí),獲取水平方向的濾波強(qiáng)度的函數(shù)調(diào)用getNeighbour時(shí),getNeighbour參數(shù)的取值分別是luma為定值1,xN是[-1,3,7,11],yN是[0-15],此時(shí)函數(shù)getNeighbour中的很多if-else語(yǔ)句是無(wú)效的判斷,這些冗余判斷占用了大量的時(shí)鐘周期。此外,對(duì)各個(gè)分支的概率進(jìn)行分析,將概率最大的判斷分支放在前面執(zhí)行,也提高了函數(shù)執(zhí)行的速度。
  
以下是精簡(jiǎn)后的GetNeighbour函數(shù)代碼,僅有數(shù)條語(yǔ)句,大大減少了運(yùn)算量。


c) 在JM86參考代碼中對(duì)于一個(gè)亮度宏塊的16×4共64條像素邊緣的BS值逐條獲取,而通過對(duì)BS獲取條件進(jìn)行分析可知,處于兩個(gè)子塊間垂直邊緣或水平邊緣的4條像素邊緣的BS值分別是相等的。因此,對(duì)一條邊緣僅要進(jìn)行獲取第1、5、9、13條像素邊緣的BS值,再賦給相應(yīng)的其他像素邊緣即可,由于獲取BS值的操作位于循環(huán)中,需要經(jīng)過許多判斷及運(yùn)算,通過這一改進(jìn),大大簡(jiǎn)化了計(jì)算復(fù)雜度。
  
d) 參考代碼中的循環(huán)內(nèi)部有很多語(yǔ)句與循環(huán)參數(shù)無(wú)關(guān),可以將這些語(yǔ)句調(diào)整至循環(huán)外部,避免了冗余計(jì)算。
  
3.2.3 利用BPP分塊處理技術(shù)解決片外數(shù)據(jù)頻繁調(diào)用的問題
  
針對(duì)頻繁調(diào)用片外數(shù)據(jù)影響了程序的運(yùn)行速度的問題,采用BPP分塊技術(shù)進(jìn)行優(yōu)化。在片內(nèi)的L1緩存中開辟3塊空間分別存放待濾波的亮度分量、色度U分量、色度V分量。根據(jù)每個(gè)宏塊進(jìn)行濾波時(shí)可能涉及的像素范圍,在對(duì)CIF圖像進(jìn)行濾波時(shí),將一幀的396個(gè)宏塊分成4類:A類為第1個(gè)宏塊,其上邊緣和左邊緣都是圖像邊緣,對(duì)其濾波前讀入的亮度數(shù)據(jù)是16×16,色度數(shù)據(jù)是2個(gè)8×8;B類為第1個(gè)宏塊行中除去第1個(gè)宏塊的其余宏塊,其上邊緣是圖像邊緣,對(duì)其濾波前讀入的亮度數(shù)據(jù)是16×20,色度數(shù)據(jù)是兩個(gè)8×12;C類是第1個(gè)宏塊列中除去第1個(gè)宏塊的其余宏塊,其左邊緣是圖像邊緣,對(duì)其濾波前讀人的亮度數(shù)據(jù)是20×16,色度數(shù)據(jù)是2個(gè)12×8;D類是除掉A、B、C這3類宏塊的其余宏塊,也就是上邊緣和左邊緣都在當(dāng)前圖像內(nèi)的宏塊,對(duì)其濾波前讀入的亮度數(shù)據(jù)是20×20,色度數(shù)據(jù)是2個(gè)12×12。
  
進(jìn)行濾波時(shí),首先按宏塊的類型以不同的數(shù)量從片外的數(shù)據(jù)緩存中整塊地讀入亮度和色度數(shù)據(jù)到片上的3塊濾波緩存,然后進(jìn)行濾波處理,并將結(jié)果數(shù)據(jù)重新存儲(chǔ)到片外存儲(chǔ)空間中。通過這種方法,一方面在一定程度上減少了頻繁調(diào)用片外數(shù)據(jù)的時(shí)間,提高了運(yùn)行速度;另一方面通過對(duì)待濾波宏塊的細(xì)分,減少了參考代碼中的判斷引起的流水線中斷,也在一定程度上提升了程序速度。
  
3.3 匯編級(jí)別的優(yōu)化
  
BlackfinBF533處理器的內(nèi)核支持C或C++語(yǔ)言,但由系統(tǒng)自動(dòng)將C程序翻譯成匯編語(yǔ)言效率比較低下,因此對(duì)一些系統(tǒng)調(diào)用比較頻繁、耗時(shí)較多的模塊,可以用人工將其轉(zhuǎn)化成高效率的匯編語(yǔ)言來(lái)提高運(yùn)行速度。主要通過以下幾個(gè)方面來(lái)提高程序的速度:
  
a) 以寄存器變量代替局部變量。在C語(yǔ)言中,子程序和函數(shù)中往往使用局部變量來(lái)暫時(shí)存放數(shù)據(jù)。當(dāng)程序運(yùn)行時(shí),編譯器為聲明的所有局部變量開辟臨時(shí)內(nèi)存空間,對(duì)于局部變量的存取操作都涉及到內(nèi)存的存取,而內(nèi)存訪問的速度相對(duì)于寄存器訪問是很慢的。因此,可以利用系統(tǒng)中的數(shù)據(jù)寄存器、指針寄存器來(lái)替代僅僅起暫存作用的局部變量,從而大大節(jié)省系統(tǒng)訪問內(nèi)存帶來(lái)的時(shí)間延遲。但由于系統(tǒng)中的寄存器數(shù)量對(duì)于局部變量來(lái)說(shuō)相當(dāng)有限,因此必須合理高效地使用寄存器。
  
b) 以硬件循環(huán)代替軟件循環(huán)。軟件循環(huán)是指在for或while等循環(huán)的開始或結(jié)尾處設(shè)置判斷條件來(lái)控制循環(huán)的開始、繼續(xù)、結(jié)束。軟件循環(huán)的條件判斷指令會(huì)動(dòng)態(tài)地選擇分支,一旦發(fā)生跳轉(zhuǎn),會(huì)阻塞流水線,而保持流水線的暢通是保持高效運(yùn)行的關(guān)鍵因素。Blackfin處理器有專用的硬件支持兩級(jí)嵌套的零開銷硬件循環(huán),這種方式不需要判斷條件轉(zhuǎn)移,DSP硬件根據(jù)預(yù)定的循環(huán)次數(shù)自動(dòng)執(zhí)行循環(huán)并結(jié)束循環(huán),從而保證了流水線的暢通,提高速度。
  
c) 充分利用數(shù)據(jù)總線寬度。Blackfin533外部數(shù)據(jù)總線寬度32位,一次可存取4字節(jié)。因此,充分利用數(shù)據(jù)總訪問寬度,特別在操作大量數(shù)據(jù)時(shí),保持一次存取4字節(jié),可減少指令周期數(shù),從而提高執(zhí)行速度。

d) 高效使用并行指令和向量指令。并行指令和向量指令是Blackfin系列DSP的一大特點(diǎn)。通過對(duì)并行指令的使用,可以充分發(fā)揮Blackfin處理器的SIMD系統(tǒng)結(jié)構(gòu)的優(yōu)點(diǎn)及硬件資源的并行處理能力,減少指令數(shù),從而提高程序執(zhí)行效率。往往通過對(duì)程序的合理安排可以做到使用1條并行指令來(lái)替代2條或3條非并行指令。向量指令則充分利用指令寬度,同時(shí)對(duì)多個(gè)數(shù)據(jù)流進(jìn)行相同操作,如要進(jìn)行2個(gè)16位的算術(shù)或移位操作,完全可以通過1個(gè)32位的向量指令來(lái)實(shí)現(xiàn),從而以1個(gè)時(shí)鐘周期來(lái)實(shí)現(xiàn)原來(lái)2個(gè)周期的工作。例如R3=abs R1(V)就用1個(gè)指令周期同時(shí)實(shí)現(xiàn)2個(gè)16位數(shù)據(jù)的求絕對(duì)值操作。
  
e) 合理配置數(shù)據(jù)存儲(chǔ)空間。限于DSP片內(nèi)和片外數(shù)據(jù)存儲(chǔ)空間的訪問速度和容量特點(diǎn),片內(nèi)空間存取速度快但容量很小,而片外空間較大但訪問速度慢,因此,合理地分配數(shù)據(jù)存放位置對(duì)于提高程序的運(yùn)行速度是十分關(guān)鍵的。對(duì)于使用頻率高的數(shù)據(jù)盡量放在片內(nèi)空間中,而不常用的數(shù)據(jù)放在片外空間中。若要存取位于片外的數(shù)據(jù)時(shí),應(yīng)將待存取的數(shù)據(jù)盡量安排成連續(xù)分布,一次將大塊的片外數(shù)據(jù)讀進(jìn)片內(nèi)緩存,避免頻繁讀取片外數(shù)據(jù)帶來(lái)的時(shí)間浪費(fèi)。
  
4 優(yōu)化實(shí)現(xiàn)的結(jié)果
  
測(cè)試優(yōu)化效果的方法是將參考代碼JM8.6中的去方塊濾波C程序模塊加到原有的解碼器中進(jìn)行測(cè)試,并與經(jīng)過系統(tǒng)、算法、匯編3個(gè)級(jí)別優(yōu)化的去方塊濾波匯編程序模塊的測(cè)試周期進(jìn)行對(duì)比。選擇的測(cè)試圖像序列為Clarie.cif、Paris.cif、Mobile.cif,測(cè)試數(shù)據(jù)見表1。


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

5 結(jié)束語(yǔ)
  
本文通過系統(tǒng)、算法及匯編3個(gè)級(jí)別優(yōu)化實(shí)現(xiàn)了H.264中的去方塊濾波功能,特別是通過改進(jìn)去方塊濾波的實(shí)現(xiàn)算法,對(duì)待濾波的宏塊進(jìn)行分類以及充分地利用并行指令、向量指令等匯編級(jí)別的優(yōu)化手段,取得了較好的優(yōu)化效果。優(yōu)化實(shí)現(xiàn)的去方塊濾波模塊,基于原有的H.264解碼器上對(duì)一個(gè)25幀約400 kbit/s的圖像序列進(jìn)行濾波,大概需要250 MHz的時(shí)鐘周期,而解碼器的總周期約為700 MHz的時(shí)鐘周期,從而使得解碼器的解碼速度達(dá)到約20幀/s,基本達(dá)到準(zhǔn)實(shí)時(shí)解碼的要求。
  
該實(shí)現(xiàn)方法相對(duì)于參考模塊進(jìn)行了較好的優(yōu)化,但通過對(duì)程序進(jìn)行耗時(shí)分析,在讀取待濾波數(shù)據(jù)和重新寫入已濾波的數(shù)據(jù),獲取BS值的GetBs函數(shù)和進(jìn)行濾波的EdgeLoop函數(shù)方面都還有進(jìn)一步提升的空間。對(duì)于片外片內(nèi)數(shù)據(jù)的交互可以采用DMA技術(shù),在濾波的同時(shí)進(jìn)行數(shù)據(jù)讀寫,從而抵消數(shù)據(jù)搬移消耗的時(shí)鐘周期;對(duì)于GetBs和EdgeLoop中的匯編代碼實(shí)現(xiàn)效率還有進(jìn)一步改進(jìn)的空間;這兩方面也是下一步的改進(jìn)方向。

 

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。