摘要:基于TI公司的TMS320DM642高性能DSP芯片,實現了一種新的針對高光譜圖像數據特點提出的基于三維自適應預測的高光譜圖像無損壓縮算法,并通過對算法在語言和結構上的優化,大大提高了算法的執行效率,為高光譜技術的推廣和發展提供了重要的經驗。實驗結果表明,優化后的代碼執行速度是優化前的18.72倍,是PC機上運行速度的2.281倍。
關鍵詞:高光譜圖像; 無損壓縮; 自適應預測; 數字信號處理器
中圖分類號:TP391文獻標志碼:A
文章編號:1001-3695(2008)01-0178-03
隨著具有數百波段的成像光譜儀的迅速發展,其信號采樣分辨率和光譜分辨率不斷提高,記錄的遙感數據海量增加,而且對于某些應用,常常需要對遙感平臺上拍攝的原始圖像進行實時計算和處理,這就帶來了對遙感圖像進行高效和高速無損壓縮的雙重挑戰[1]。因此有必要找到一種適合遙感圖像的無損壓縮算法,并將該算法在遙感平臺上快速地實現,以滿足遙感技術發展的新需要。
在以往的工作中,針對高光譜圖像數據特點提出的一種基于三維自適應預測的無損壓縮算法具有良好的壓縮性能,在壓縮效率上相對于國際標準中最優的JPEG LS算法仍有一定的優勢,并且算法復雜度適中,適于硬件實現。
DSP系統具有極快的運算速度、驚人的處理能力,能滿足對圖像進行實時處理的要求;并且體積小、功耗低,能實現脫機運行,特別適合遙感平臺的應用特點,因此成為實現系統方案的最佳選擇。本文利用TDS642EVM圖像處理平臺,實現了基于三維自適應預測的無損壓縮算法,取得了良好的效果。
1基于三維自適應預測的高光譜圖像無損壓縮算法原理
在無損壓縮編碼的研究中,基于預測的方法特別適用于數據樣本表示連續變化的自然物理過程。該方法是最古老也是最成功的壓縮方法之一,是無損壓縮編碼的一個重要方向。傳統的預測方法中,預測系數一般是固定的,但是不同圖像的特點不同,不同的相關系數對應不同的最佳預測系數[2]。
本文實現的三維自適應預測算法正是從這點出發,通過具有自學習能力的感知器神經網絡模型,在對高光譜圖像的編碼過程中,根據預測誤差的大小自適應地調整預測系數,從而提高壓縮效率[3]。此外,由于算法采用如圖1所示的預測模型,并且在預測前進行了波段排序,對去除高光譜圖像的譜間冗余同樣有很好的效果。經實驗證明,該算法能有效地去除高光譜圖像的空間和譜間相關性;對128波段的OMIS I高光譜圖像進行無損壓縮,算法的平均比特率為2.97 bpp,與JPEG LS算法相比,降低了約0.37 bpp[4]。圖2是三維自適應預測算法的基本框圖。首先讀入全波段的高光譜圖像;然后根據各波段之間相關系數的大小確定合理的預測順序,并根據預測順序對各波段的圖像進行三維預測編碼,得到輸出碼流。在完成每一個像素點的預測后,根據預測殘差調整下一個點的預測系數。
2硬件平臺簡介
本文所用的TDS642EVM圖像處理平臺是基于TI的TMS320DM642 DSP芯片設計的評估開發板(EVM板)的系列產品。板上DSP的主頻為600 MHz,計算能力最高可達到4 800 MIPS[5]。它包括了DSP處理、A/V接口、通信接口、擴展同步接口、PCI總線接口、電源和LED等功能模塊,適于對實時視頻和音頻的采集、壓縮和播放等。其在網絡攝像機、數字機頂盒、網絡視頻電話等領域有著廣泛的應用。
3算法的DSP實現和優化
3.1算法的實現
算法的實現過程首先要對源C++程序進行C語言的改寫,在CCS仿真平臺上運行,證明其功能的正確性;然后再用CCS的調試工具,如debug 和profiler等,分析確定代碼中可能存在的、影響性能的低效率段,以便于以后的代碼優化。圖3是算法的具體流程圖。
3.2存儲空間的分配
在運行程序前,先要對DSP內部的存儲空間進行合理的分配。這對于提高代碼的運行效率是至關重要的。
DM642的地址空間映射如表1所示。
在圖像處理系統中,由于所需處理的圖像數據量相對較大,256 KB的內部RAM很難滿足要求,如果內部數據RAM被圖像數據占用,可能會與程序執行過程中動態分配的一些變量產生內存分配沖突。鑒于以上原因,一般把數據量大的圖像數據放在外部存儲空間中,而將頻繁使用的數據放入內部RAM中。
3.3優化方法
在算法實現后,下一步的工作則需要對程序的結構和語言進行改進。由于DSP和PC機的CPU結構不同,將PC機上的C程序直接在DSP上運行時,運行效率很低,不可能達到實時處理的要求。所以必須對程序進行優化。
1)編譯參數的選擇
CCS里可供選擇的優化選項眾多,經過反復測試,提出以下兩種最優的方案:
a)適于調試的編譯選項
g q o3 mt
其中: g使能符號調試和匯編源語句調試;
q取消了banner,使程序運行更順暢,有一定的優化效果;
o3簡化控制流程圖、分配變量給寄存器、執行循環轉換、去掉無用代碼、簡化表達式和陳述語句并使調用擴展到定義為內嵌小程序的函數;
mt使能編譯器假設沒有數據存儲混淆,對代碼優化有一定的作用[6]。
b)最終在硬件上運行時的編譯選項
q o3 mt
禁止調試后,去掉所有的符號和行號信息,輸出的out文件較小,能對文件進行最強的優化。
2)Cache 優化
本文通過芯片支持庫(CSL)開啟了cache。當程序和數據存儲在外部存儲器中時,cache可以自動地將需要頻繁調用的部分存入其中供CPU直接調用,從而節省數據搬移的時間。本程序優化時,在內部RAM中將二級cache空間設置為32 KB。實驗表明,打開cache后,耗時減少到原來的75%左右。Cache的命中率越高,其優化效果越明顯,因此cache的設置對系統性能有著至關重要的作用。具體設置方法如下:
CSL_init();
CACHE_enableCaching(CACHE_EMIFA_CE00);
CACHE_setL2Mode(CACHE_32KCACHE);
3)C代碼優化
(1)對初始化和賦值語句的優化
初始化和賦值語句在算法的改寫過程中,所占的比重是不能忽視的。因為它們經常處在循環的內部,能對代碼的執行效率產生較大的影響。由于灰度圖像的數據為8 bit,在對上述兩種程序改寫時,方法都是充分利用DM642一次能處理32 bit長數據的特點,即將優化前一次讀取8 bit數據,改成一次讀取32 bit。局部優化效果提高了四倍。
(2)判斷跳轉語句的優化
判斷跳轉語句是C程序員在編程時經常使用的一種語句。因為它能使整個程序的結構看起來很清楚,便于其他程序員閱讀。但大量判斷跳轉語句的使用是非常影響程序在DSP上的運行速率的。如果在循環內部出現判斷跳轉語句,由于每個跳轉指令都會帶來五個延遲間隙,將導致程序執行時間延長;另外,循環內跳轉也將使軟件的軟流水受到阻塞,影響代碼的并行執行。因此盡可能用邏輯判斷語句來代替判斷跳轉語句,可以避免不必要的跳轉,從而提高代碼的執行效率。
源程序中以下代碼:
if(a>=32)C=4;
else if(a>=16)C=1;
else if(a<=-32)C=-4;
else if(a<=-16)C=-1;
elseC=0;
可優化為
C=(3*(a>=32)+(a>=16)-(a<=-16)-3*(a<=-32))。
實際算法中由于預測殘差a的值大多集中在[-16,16],收到了很明顯的效果。該段代碼的指令周期從優化前的44個降為24個。
(3)乘法語句的優化這
是整個程序優化的關鍵,因為它往往處在最內層循環中,在整個程序的執行過程中,所占的比重最大。由于DM642一次能處理32 bit數據,可以同時完成兩組16 bit數據的乘法運算,讓乘法并行執行,效率提高近一倍。例如:
int W[14];
int xd[14];
for(k=0;k<=13;k++)
v+=W[k]*xd[k];
優化后的程序:
sum=0;
sum1=0;
sum2=0;
for(k=0;k<14;k+=2)
{ sum1 += W[k]*xd[k];
sum2 += W[k+1]*xd[k+1]; }
sum=sum1+sum2;
(4)關于變量類型
對于程序的全局變量,編譯后被存儲在內部存儲器中,那么在運算調用時需要先將其值賦予寄存器。而數據搬移的操作很耗時,因此對于很多函數都要用到的變量,通過先將全局變量傳遞給一個臨時變量,計算完后再將臨時變量的值回傳能有效地減少數據搬移的操作,提高運行效率。
此外,CCS在優化過程中,并不一定開辟的內存越小執行的速度就越快,如char型數據在內存中只占8 bit,int數據占32 bit,但int數據的執行速度卻經常比char型要快。這是因為DSP的寄存器和數據總線都是32 bit的,刻意地使用char型數據,反而使編譯器在編譯過程中生成一些不必要的語句,影響代碼的執行效率。在變量不參與到具體的計算時,盡量使用int型的變量。
(5)inline語句的使用它
是程序優化關鍵字的一種。對函數使用inline語句后,可以讓編譯器在編譯時將子函數的代碼插入到調用位置,從而有效減少函數跳轉的時間開銷。對于函數體較小且調用頻繁的函數,這個方法可以有效地優化程序性能。但使用inline關鍵字后,會使編譯后的程序增大,因此要注意的是,如果堆棧的體積過大,即存在很多的局部變量,則不適合使用inline語句。不過在本算法的優化過程中,由于源程序的代碼較少,而DM642的程序存儲器也足夠大,使用inline關鍵字后取得了較好的優化效果。
(6)浮點運算的優化
對于定點DSP來說,浮點運算會占用大量的時間,大大地降低了代碼的執行效率。因此要想盡一切辦法避免浮點運算,Q值法是方法之一。但Q值法的缺點是會降低運算的精度,對于運算精度要求較高的算法,Q值法要慎用。在本算法的優化過程中,由于對精度要求較高,采用了在運算前后擴大和縮小同樣倍數的方法,雖然較Q值法的移位運算來說效率受到了一定的影響,但同樣獲得了很好的優化效果。
(7)關于代碼長度
在進行C語言改寫時,要注意盡可能地縮短代碼長度。因為過長的代碼可能會影響編譯器的軟件流水的效果。有些對語句進行展開的優化方法對于單個函數執行效率的提高可能有一定的作用,但用到整體程序的優化中,反而會起到適得其反的效果。所以一切優化方法都要以實驗為主,不能憑著主觀經驗隨便改動。
4)線性匯編優化
在對C代碼優化后,對于耗時嚴重的部分,還可以使用線性匯編將其重寫。然而在本程序最終的優化代碼中并沒有使用到線性匯編。這是因為源代碼中循環體的內部大都是點乘運算,而CCS中自帶的C語言優化器對點乘的優化效果是最好的。在對循環體內部進行了C語言級的優化后,再嘗試對函數體進行了線性匯編的改寫,運行效率都沒能超過編譯器自動生成的匯編代碼。因此匯編代碼的應用在本算法的優化過程中受到了限制。
4實驗數據及結果
經過將C++語言改寫成C代碼,再到C語言級的優化,最后通過線性匯編語言嘗試改寫關鍵的C語言代碼,取得了明顯的優化效果。實驗圖像為上海技術物理研究所研制的OMIS I(operational modular image spectrometer,實用型模塊化成像光譜儀)獲得的128波段高光譜圖像,每個波段圖像大小為512×512。為了便于計算,像素深度量化為8 bit。
4.1優化前后DSP運行速度比較
實驗證明,經過優化后在提高處理效率上確實取得了很好的效果,平均優化比達到了18.72倍。表2列出了優化前后部分波段的編碼時間以及平均編碼時間。
4.2與PC機處理速度比較
優化后的程序在DSP上的運行速度與PC機相比,具有明顯的優勢,平均編碼時間為PC機的2.281倍。編碼時間具體對比如圖4所示。其中PC機測試平臺為P4 2.2 GHz,256 MB內存,Windows XP SP2,Visual C++ 6.0。
圖4DSP與PC編碼時間比
5結束語
本文以高光譜圖像的無損壓縮技術為背景,在TMS320DM642 DSP平臺上實現了一種新的針對高光譜圖像自身特點提出的三維自適應預測無損壓縮算法,并針對DSP的硬件特點,對算法在語言和結構上分別進行了深入的優化,使代碼執行速度有了顯著的提高。在壓縮效率和壓縮速率兩項指標上均達到了較好的結果,適應了高光譜技術發展的趨勢,有著可觀的實用前景。
參考文獻:
[1]彭望碌.遙感概述[M].北京:高等教育出版社,2002:11 13.
[2]AIAZZI B,AIBA P,ALPARONE L,et al.A distributed implementation of fuzzy clustering and switching of linear regression models for lossless compression of imagery and 3D data[C]//Proc of the 2nd IEEE Workshop on Multimedia Signal Processing.1998:382-387.
[3]張曉玲,毋立芳,沈蘭蓀.基于感知器的遙感圖像無損壓縮編碼[J].電子信息學報,2001,23(7):712-715.
[4]張曉玲,沈蘭蓀,張培強.基于三維自適應預測的高光譜圖像無損壓縮算法[J].電子學報,2004,32(6):957-959.
[5]TMS320C6000 programmer’s guide[K].[S.l.]:Texas Instruments Incorporated,2000:78-79.
[6]TMS320C6000 optimizing compiler user’s guide[K].[S.l.]:Texas Instruments Incorporated,2002:262-264.
“本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文”