基于ADSP2189常用圖像處理方法
近幾年來,Analog Devices公司的ADSP系列數(shù)字信號處理器以其優(yōu)異的性能和簡單易學(xué)的語言逐漸受到人們的青睞,其中的ADSP218X定點系列更是得到廣泛的應(yīng)用。ADSP2189片內(nèi)有192KB的RAM,因此更多地應(yīng)用于圖像領(lǐng)域。本文就圖像處理壓縮過程中常用到的算法及其在ADSP2189上的實現(xiàn)進行了分析,如何充分利用ADSP系列數(shù)字信號處理器特殊的硬件結(jié)構(gòu)和功能強大的指令集實現(xiàn)各種算法是本文討論的重點。然而作為通用定點處理器,處理過程中如何避免可能出現(xiàn)的問題以及如何解決問題也是本文所要討論的。
本文引用地址:http://butianyuan.cn/article/257396.htm1 ADSP2189及EZ-KIT簡介
ADSP2189是指令執(zhí)行速度最高可達75MIPS的16位定點數(shù)字信號處理器,主要具有以下特點:單周期指令執(zhí)行,片內(nèi)的程序控制器不會附加循環(huán)和條件指令的執(zhí)行周期;三總線的體系結(jié)構(gòu)允許在單指令周期中進行雙操作數(shù)傳遞;片內(nèi)192KB的存儲器可被配置成32K×24bit的程序區(qū)(PM Program Memory)和48K×16bit的數(shù)據(jù)區(qū)(DM: Data Memory),而PM中還可同時存放數(shù)據(jù)。除了具有優(yōu)異的計算能力外,ADSP2189還具有強大的系統(tǒng)接口:8位的BDMA端口尋址可達4MB,用來提供片內(nèi)外存儲器的高速存取;16位的IDMA(Internal Direct Memory Access)端口可實現(xiàn)主系統(tǒng)對片內(nèi)存儲器的高速存取;2048個I/O地址,支持并行的外設(shè);兩個雙緩沖串口,帶自動壓擴。
ADSP-2189M EZ-KIT Lite是一塊可用來演示驗證DSP基本算法的仿真板,也是本文所有算法的測試平臺。它主要由以下器件組成:
·ADSP-2189M 75 MIPS DSP
·AD73322立體聲編譯碼器
·RS-232接口
·FLASH存儲器
EZ-KIT Lite的FLASH存儲器中帶有監(jiān)控程序,這段程序可完成仿真板與PC機間的串行通信,并允許用戶下載、執(zhí)行和調(diào)試ADSP2189程序。EZ-KIT Lite可與EZ-ICE仿真器相連,通過EZ-ICE仿真器,用戶可以單步執(zhí)行程序、觀察和改變寄存器和內(nèi)存值以及完成其它調(diào)試工作[1]。
2 模板運算
在圖像處理時,模板運算有著廣泛的應(yīng)用。例如,在邊沿檢測時,通過將像素矩陣與邊沿檢測矩陣即模板相卷積來實現(xiàn)檢測功能;在圖像平滑時,通過模板運算來濾除噪聲。模板運算的數(shù)學(xué)涵義就是卷積(或互相關(guān))運算[2],它是一項非常耗時的運算。以模板1/16[1 2 1 2 4 2 1 2 1]為例,每個像素完成一次模板操作要用9個乘法、8個加法和1個除法。對于一幅N×N的圖像,就是9N2個乘法,8N2個加法和N2個除法,算法復(fù)雜度為0(N2)。一幅較大的圖像計算量是很大的,所以很多專用的圖像處理系統(tǒng),用硬件來完成模板運算,這樣可以大大提高速度。在ADSP2189上快速實現(xiàn)模板運算需要充分利用ADSP2189的結(jié)構(gòu)特點和功能強大的指令集。由于ADSP的哈佛結(jié)構(gòu)允許同時訪問程序和數(shù)據(jù)存儲器,而ADSP的多功能指令(Multifunction Instructions)在執(zhí)行算術(shù)操作的同時還可以并行進行數(shù)據(jù)傳輸,因此在單周期內(nèi)可以完成取指、譯碼、讀數(shù)、執(zhí)行和調(diào)整寄存器。例如,MR=MR+MX0*MY0(SS)、MX0=DM(I0,M0)、MY0=PM(I4,M4),MX0和MY0分別從數(shù)據(jù)和程序存儲區(qū)以間接尋址方式取得操作數(shù)相乘,乘積與結(jié)果寄存器中數(shù)值相加后放回結(jié)果寄存器,數(shù)值計算的同時地址指針寄存器I0、I4中的地址自動與調(diào)整寄存器中M值進行相加更新。雖然ADSP2189支持除法指令,但為了提高速度,可在程序中將除法改為乘以除數(shù)的倒數(shù)。另外,在程序中將2維模板運算轉(zhuǎn)換成1維模板運算,可極大地降低運算量。需要注意的是,由于ADSP2189中CNTR寄存器為14bit,所以在單循環(huán)處理中輸入像素個數(shù)必須小于16383。模板運算程序的流程如圖1所示。
以3×3模板為例,通過在Visual DSP環(huán)境下設(shè)置PROFILE選項,可以得到以下結(jié)論:對于一個100×100的數(shù)組,完成模板運算共需要96445個指令周期;對于一個640×480的數(shù)組,共需要3052205個指令周期,遠遠低于直接計算。
3 DCT變換
許多圖像壓縮算法采用DCT(Discrete Cosine Transform,即離散余弦變換)來消除像素間冗余,例如JPEG 、H.261以及MPEG。采用DCT是因為它具有以下優(yōu)點:DCT不同于DFT(Discrete Fourier Transform,即離散傅立葉變換),它屬于實域運算;DCT變換矩陣的基向量很接近于托波列茲矩陣的特征向量,所得變換系數(shù)具有弱相關(guān)性,可以單獨處理各系數(shù)而不損失壓縮效率。
一維DCT表達式如下:
二維DCT表達式如下:
式中
由上面的表達式可以看出DCT屬于可分離變換,所以二維DCT通常不采用直接計算的方式,而是對原始圖像數(shù)據(jù)的行和列分別做一維DCT,即將圖像數(shù)據(jù)的各行做一維DCT,然后將結(jié)果矩陣各列再做一次一維DCT。以8×8的圖像塊為例,進行行列一維DCT需要1024次乘法和896次加法,難以滿足實時要求。因此人們研究了許多DCT的快速算法,如何選取一種適合ADSP結(jié)構(gòu)的算法是提高運算速度的關(guān)鍵。計算DCT的快速算法大體上可以歸納為三類[3~6]:(1)間接計算法。利用FFT和Walsh-Hadamard變換計算DCT,這類算法包含許多多余的過程,降低了運算速度;(2)直接矩陣分解法。利用稀疏矩陣直接分解,使計算速度優(yōu)于其它算法,僅需較少的乘法和加法,但需對余弦系數(shù)進行求反和除法,因而數(shù)值不穩(wěn)定;(3)遞歸算法。Kashef提出的遞歸算法[4]需要計算N階三角矩陣,而Hou[5]提出的算法不僅具有規(guī)則的遞歸結(jié)構(gòu),并且具有穩(wěn)定的數(shù)值特性,適合于在DSP上實現(xiàn),因為它通過少量的乘加運算就可實現(xiàn)DCT,并且對DSP的片內(nèi)存儲區(qū)占用少。這一算法的基本思想類似于Cooley- Tukey FFT算法,它用兩個相同的低階DCT來構(gòu)成一個高階DCT。以8點一維DCT為例,其信號流程圖如圖2所示。
由圖2可以看出,利用這種方法計算8×8的DCT僅僅需要計算192次乘法和464次加法,計算量遠遠小于標(biāo)準(zhǔn)算法。由于算法的遞歸性以及對各行各列做同樣的處理,所以將分解計算過程以子程序方式調(diào)用可以大大降低對存儲區(qū)的要求。另外,如果采用同址計算的方式,即把運算結(jié)果放回到參加運算的輸入數(shù)據(jù)的原存儲地址,還可以節(jié)省存儲空間。以8×8的數(shù)據(jù)塊為例,應(yīng)用這種算法的程序流程圖如圖3所示。
在Visual DSP++2.0環(huán)境下編譯執(zhí)行,可以得到8×8數(shù)據(jù)塊快速算法和標(biāo)準(zhǔn)算法的指令周期數(shù)和執(zhí)行時間,如表1所示。
很明顯,采用快速算法將大大減少處理時間,因此對于實時圖像處理選取合適的算法很重要。
在圖像編碼中,DCT本身并不減少數(shù)據(jù)。真正的數(shù)據(jù)量減少出現(xiàn)在將DCT的結(jié)果也就是DCT系數(shù)進行量化,量化后大部分系數(shù)接近于零,最后把經(jīng)之字形掃描的系數(shù)進行熵編碼,就達到了壓縮效果。之字形掃描在ADSP2189上實現(xiàn)起來簡單方便,因為對于8×8的數(shù)據(jù)塊進行之字形掃描僅需要四個地址調(diào)整變量。而ADSP2189的數(shù)據(jù)內(nèi)存和程序內(nèi)存各有4個用于產(chǎn)生地址的指針寄存器,每個指針寄存器都可以被四個調(diào)整寄存器調(diào)整進行更新,即被I0~I3和M0~M3以任何組合進行調(diào)整,因此定義M0~M3分別為1、-7、7和8,就可以方便地進行之字掃描。在這個過程中,間接尋址和其它數(shù)值計算并行進行,因此不會增加指令執(zhí)行時間和代碼大小。所以在ADSP2189上實現(xiàn)JPEG編碼,可以在量化的同時進行之字掃描,無需額外開銷。
4 常見問題和解決方法
在ADSP218X上實現(xiàn)各種處理時,算法本身或者某型號的處理器會出現(xiàn)各種各樣的問題,常見原因主要有:
(1)內(nèi)存問題 對于ADSP218X系列處理器來講,其主要區(qū)別就在于內(nèi)部存儲區(qū)大小的不同。但由于受內(nèi)部總線的限制,無論程序存儲區(qū)還是數(shù)據(jù)存儲區(qū)每次只能處理16K,因此在編譯程序的過程中,應(yīng)預(yù)先估算一下占用內(nèi)存的情況,以避免運行錯誤,尤其是C語言源程序在使用默認的LDF(Linker Description File)文件時很容易發(fā)生超出內(nèi)存范圍的情況。在Visual DSP編譯環(huán)境下可利用MAP文件查看存儲區(qū)的分配。由于DSP采用數(shù)據(jù)區(qū)與程序區(qū)分離的哈佛結(jié)構(gòu),所以可利用這一特點將較大的數(shù)據(jù)塊放在不同的區(qū)域,充分利用片內(nèi)資源。其次是采用原址運算,即輸出變量和輸入變量占用同樣的存儲區(qū),從而節(jié)省空間,或者通過LDF文件使用內(nèi)存重疊區(qū)。
(2)溢出問題 在ADSP2189中通常采用1.15數(shù)據(jù)格式,而它屬于定點DSP,動態(tài)范圍有限,兩個1.15格式的數(shù)相乘后,結(jié)果字長變成了2.30格式,在多次相乘累加后,32位的MAC(乘加器)有可能溢出。如果用舍位方法使結(jié)果仍然保持為預(yù)定的位數(shù),則會引入誤差。多次舍位可能造成嚴(yán)重的誤差積累。因此在存放運算結(jié)果的字長一定的情況下,需要防止計算結(jié)果特別是中間結(jié)果的溢出。如果這個溢出能夠預(yù)期的話,可以預(yù)先確定運算的標(biāo)度,即預(yù)先確定應(yīng)空出的高位位數(shù)(稱為預(yù)定標(biāo)度)。預(yù)定標(biāo)度防止了數(shù)據(jù)溢出,但是以丟失精度為代價的,同時這樣又增加了運算量。為了保證結(jié)果不溢出,預(yù)先空出來的位數(shù)不僅與待處理數(shù)據(jù)有關(guān),還與處理數(shù)據(jù)的函數(shù)和該函數(shù)的實現(xiàn)過程有關(guān)。在實際圖像處理應(yīng)用中,要從精度和溢出兩方面綜合考慮,選擇一個最佳的定標(biāo)方案,在保證不產(chǎn)生溢出的情況下盡量降低誤差。另外還有一種輸入溢出,此時輸入值被截取為可表示數(shù)據(jù)的最大或最小值,從而使得輸入失真。解決方法同樣是對輸入值進行預(yù)定標(biāo)處理。
(3)量化效應(yīng) 對于定點的處理器ADSP2189,量化效應(yīng)對某些算法有較大影響。例如在數(shù)字濾波器的設(shè)計當(dāng)中,傳輸函數(shù)的系數(shù)必須用固定長度的二進制表示,這樣的量化處理就會引起量化誤差,使得濾波器實際系數(shù)偏離原來設(shè)計系數(shù),造成極零點位置偏離理論設(shè)計位置,從而使濾波性能變差。嚴(yán)重時極點移到單位圓上,破壞了濾波器的穩(wěn)定性。因此在DSP上進行濾波處理時,應(yīng)合理選擇算法和運算字長。
(4)延時問題 當(dāng)DSP需要對每個輸入信號進行順序處理時,輸入信號頻率就對處理器的執(zhí)行速度提出了要求。通常的處理延時主要由DSP的速度和所執(zhí)行算法的復(fù)雜程度來決定,也與外圍邏輯及存儲器件的時間特性有關(guān)。所以要想提高系統(tǒng)的實時性,必須選用高速的器件,并盡量簡化處理算法。
從以上討論可以看出,即使是很常用的算法,在DSP上的實現(xiàn)過程與在PC機上的實現(xiàn)過程也會有很大不同,如何針對不同的芯片選取合適的算法,充分利用各芯片所支持指令集是保證高速處理圖像的關(guān)鍵
評論