視頻跟蹤算法在Davinci SOC上的實現(xiàn)與優(yōu)化
算法在Davinci SOC上的實現(xiàn)
本文引用地址:http://www.ex-cimer.com/article/269186.htmDSP平臺的選擇
DM6446采用ARM與DSP 雙核結構,其中ARM子系統(tǒng)搭載297 MHz主頻的ARM926 核,DSP部分則采用594 MHz的C64x+DSP核,外圍存儲均支持256 MB DDR2 RAM和各類存儲卡,另外使用了VPSS 子系統(tǒng)豐富的視頻前后處理功能,且都配備了完善的外設接口。目標跟蹤算法需要做大量運算,DM6446 DSP核強大的運算處理能力保證了算法的實時處理。同時DM6446的ARM核可以進行系統(tǒng)管理,數(shù)據(jù)讀寫,網(wǎng)絡傳輸?shù)忍幚怼?/p>
我們使用Spectrum Digital公司的DVEVM平臺進行算法仿真、原型制作和軟件優(yōu)化。DVEVM?還可實現(xiàn)視頻輸入/輸出連接、網(wǎng)絡接口、存儲器接口以及標準的子卡連接等。
系統(tǒng)軟件框架
整個系統(tǒng)的軟件框架如圖2如示。DM6446的ARM核運行基于Linux操作系統(tǒng)的應用程序,所用的外圍設備都由ARM負責控制。ARM端的HTTP服務器通過Linux網(wǎng)絡協(xié)議棧來處理HTTP請求,并發(fā)送壓縮視頻數(shù)據(jù)。視頻跟蹤的應用程序由五個POSIX線程組成,分別是視頻捕捉線程,視頻跟蹤線程,視頻壓縮線程,顯示線程,系統(tǒng)控制線程。視頻捕捉線程通過V4L2接口設備驅動從攝像頭讀取原始視頻數(shù)據(jù)。視頻跟蹤線程把視頻數(shù)據(jù)送到ARM和DSP的共享緩沖內(nèi)存,并通知DSP執(zhí)行跟蹤算法。壓縮線程負責控制DSP側的壓縮算法并從共享內(nèi)存中讀取壓縮數(shù)據(jù)。視頻顯示線程從視頻緩存中讀取視頻數(shù)據(jù)幀,并疊加目標跟蹤框,最后通過Frame Buffer設備驅動輸出顯示。系統(tǒng)控制線程負責響應遙控器和鼠標并執(zhí)行相應操作。
DM6446的DSP核上運行DSP/BIOS實時操作系統(tǒng)和目標檢測,跟蹤算法,視頻壓縮算法。所有的算法的接口都符合TI xDAIS標準,由Codec Engine調(diào)用。除了算法,DSP核上還集成了管理內(nèi)存和DMA的Framework Component。
ARM核和DSP核的通信由TI提供的Codec Engine軟件框架負責。Codec Engine是介于應用程序和具體算法之間的軟件模塊,其中的VISA API通過stub和skeleton訪問Engine SPI最終調(diào)用算法。ARM和DSP的所用共享緩沖內(nèi)存都是通過CMEM模塊在DDR中分配的,緩沖內(nèi)存地址連續(xù)且與DSP核Cache對齊。
圖 2 軟件結構圖
跟蹤算法在DSP上的優(yōu)化
為了充分發(fā)揮出Davinci SOC強大的視頻處理能力,滿足實時跟蹤的需要,我們通過算法優(yōu)化和編程優(yōu)化相結合的方法對Codec程序進行了大量的優(yōu)化。
算法優(yōu)化
算法優(yōu)化是指在不降低算法性能的情況下,采用等效算法來降低計算量,我們的工作主要集中在“歸一化互相關系數(shù)”的計算例程的簡化上。根據(jù)均值和方差的性質(zhì),我們可以將(1)式化簡為:
上式與式(1)比較,減少了大量的加減法計算,而且將方差和協(xié)方差的計算轉化為大量的乘加運算,這為我們后面的編程優(yōu)化也提供了極大的便利。例如M=64, N=64時,加法次數(shù)從36864減少到12288。
編程優(yōu)化
編程優(yōu)化是在計算量不變的情況下,根據(jù)Davinci處理器DSP核心的特點,通過優(yōu)化存儲器的存取效率和提高程序的并行化程度來縮短程序運行所需要的指令周期數(shù),以使程序運行得更快。我們的編程優(yōu)化工作主要包含使用dsplib、使用線性匯編、使用內(nèi)聯(lián)函數(shù)以及循環(huán)展開等五個方面,下面將一一加以介紹。
* dsplib的使用
在優(yōu)化過程中,我們還采用了CCS中提供的庫函數(shù)來對代碼進行優(yōu)化。CCS中針對c64x+ DSP提供了高度優(yōu)化的dsplib庫函數(shù)供用戶使用,這些庫函數(shù)提供了數(shù)字信號處理中常見的處理例程,而且由匯編語言寫成,具有極高效的代碼效率。特別是用于計算向量內(nèi)積的DSP_dotprod和DSP_vecsumsq函數(shù)正好滿足了我們的計算需求。在計算尺寸為32x32的“歸一化互相關系數(shù)”時,優(yōu)化后計算
* 線性匯編
對于uf和ug的計算,如果使用for循環(huán)實現(xiàn),將會大大拖累整個“歸一化互相關系數(shù)”計算例程的執(zhí)行效率。我們用手工編寫線性匯編代碼的方式實現(xiàn)了dspsum函數(shù),利用C64x + DSP中的8個并行計算單元,在每個DSP時鐘周期內(nèi)同時進行4個16位加16位的加法操作,對于尺寸為32x32的求和計算而言,該函數(shù)只需要258個DSP時鐘周期。
評論