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