摘 要:由于小波變換算法的復雜性,直接計算小波變換耗時較長,微機和通用的微處理器在運算速度上難以實現小波變換的實時性要求。定點DSP具有低功耗、高性能的特點,本文結合TI公司的16位定點DSP,將小波變換快速算法用C語言開發,詳細說明了小波變換快速算法在定點DSP上的具體實現,解決了小波變換實時、高精度處理的要求,大大提高了小波變換的運算效率。
關鍵詞:小波變換;數字信號處理器;快速算法;圓周卷積
中圖分類號:TP301.6 文獻標識碼:B
文章編號:1004-373X(2008)09-132-03
Implementation of Long Sequence Wavelet Transform Based on DSP
LV Xinhua,HE Chuanping,LI Zaohua,PAN Mingzhong
(Naval 91669 Unit,Haikou,571100,China)
Abstract:Due to the complexity of the wavelet transformation algorithm,the processing velocity of computer and general microprocessor can hardly meet its real-time requirements.Based on the 16-bit fixed point DSP who has low power consumption and high performance presented by TI Company,this article explains the detailed realization process of the wavelet transformation algorithm so as to meet the real-time and high resolution processing requirement in the wavelet transformation algorithm.
Keywords:wavelet transform;digital signal processor;fast algorithm;cyclic convolution
1 引 言
由于小波變換具有良好的時頻分析特性,已經廣泛應用于各種信號分析領域。由于小波變換算法的復雜性,如果直接計算小波變換,所需內存較大,耗時較長。盡管當今處理器芯片運算速度得到了大幅度的提高,但仍然在實時性上不能滿足要求。為了簡化計算過程,人們相繼設計了一系列的快速算法來計算小波變換,以降低其運算次數[1]。
小波變換在大多數具體應用中主要是在線信號的實時分析處理,微機和通用的微處理器在運算速度上難以適應信號實時、高精度處理的要求。數字信號處理器(DSP)就是為了適應這種需求而開發的。美國TI公司是全球最大的DSP供應商,其生產的TMS320C55x系列16位定點DSP芯片具有低功耗、高性能等特點,具有廣泛的應用領域,本文應用該系列DSP芯片,將文獻[2]提出的小波變換快速算法用C語言開發加以實現,解決了小波變換實時、高精度處理的要求。
2 小波分解過程的DSP實現
小波分解過程中算法實現的數據結構存儲和尋址方式如圖1所示。
圖1 算法實現的數據結構存儲和尋址方式
小波分解過程中C語言算法實現的偽代碼如下:
for(LayerID=1;LayerID<=LAYER_NUM;LayerID++)//小波多層分解
{數據邊界延拓程序模塊;
pTemp1=pSrc-M+1;//臨時指針指到延拓后數據的源頭
/*應用長序列快速卷積的重疊保留法計算擴展后數據和分解濾波器組的卷積*/
for(i=1;i<=SegNum;i++)//開始分段
{從源數據區搬送數據到計算區的程序模塊;
用圓周卷積計算線性卷積的程序模塊;
將計算區的結果保存到目標區的程序模塊;
pTemp1=pTemp1-M+1;//臨時指針指向下一個分段的數據起始點}
SrcLen=(SrcLen+M-1)/2;//下一級分解的源數據長度
/*為下一層分解做準備*/
pTemp2=pSrc; pSrc=pDest; pDest=pTemp2;//交換數據指針,即交換數據源區和目標區
pSrcEnd=pSrc+SrcLen+M-1; }
下面分別對偽代碼中各個子程序模塊的具體實現進行分析。
2.1 邊界延拓模塊
數據邊界延拓程序模塊的實現[3]:
定義一個數據地址指針pSrc始終指向載入的源數據頭地址,即pSrc=Layer1Data+M-1,在源數據的首尾各對稱延拓M-1個點。該模塊的C語言實現代碼如下:
for(i=M-1;i>=1;i--)
*(pSrc-i)=*(pSrc+i-1);//前導數據擴展M-1個
pTemp1=pSrc+SrcLen;//臨時指針指到最后一個數據并出界一個
for(i=0;i *(pTemp1+i)=*(pTemp1-i-1);//尾部數據擴展M-1個 2.2 數據搬移模塊 從源數據區搬送數據到計算區的程序模塊實現:定義一個臨時地址指針pTemp1指向擴展后的數據首地址,即:pTemp1=pSrc-M+1,SegNum為長序列分段數,將數據從數據源區分段搬送到計算區,并將16 b數據擴展為32 b,通過對虛部填零,組成復數輸入數據數組signal,該模塊C語言實現代碼如下(i為分段標記,N為分段圓周卷積長度): if(i!=SegNum)//除最后一段外的每一段 {for(j=0;j {signal[j]=*(pTemp1++);signal[j+1]=0;//實部擴展為32bit signal[j+2]=0;signal[j+3]=0;}//虛部為0,也擴展為32bit} else //最后一段后面不足的補0 {for(j=0;j {if(pTemp1==pSrcEnd) //沒數據了,臨時指針不動 {signal[j]=0;signal[j+1]=0; } else//還有數據,臨時指針繼續向后移動 {signal[j]=*(pTemp1++);signal[j+1]=0;} signal[j+2]=0;signal[j+3]=0;} //虛部為0,并擴展為32bit 2.3 基于圓周卷積的線性卷積模塊 用圓周卷積計算signal和分解濾波器組dec_filter的線性卷積out_buffer,該模塊的C語言實現代碼如下[4]: cfft32_SCALE((LDATA *)signal,N); cbrev32((LDATA *)signal,(LDATA *)signal,N);//計算分段信號的FFT for (j=0;j<2*N;j=j+2)//計算復數的點乘運算 {x1=((long)signal[2*j]*(long)dec_filter[j])1; x2=((long)signal[2*j+2]*(long)dec_filter[j+1])1; x3=((long)signal[2*j+2]*(long)dec_filter[j])1; x4=((long)signal[2*j]*(long)dec_filter[j+1])1; out_buffer[j]=x1-x2; out_buffer[j+1]=x3+x4;} cifft32_NOSCALE(out_buffer,N); cbrev32(out_buffer,out_buffer,N);[JY]//計算分段輸出的IFFT 2.4 結果保存模塊 將計算區的結果保存到目標區的程序模塊實現:將out_buffer去掉前面M-1個復數,后面N-M+1個復數只取實部,即只取低頻分量,對取出的實部乘以比例系數,這里采用的是小數乘法,然后再取前16 b,將結果存到數據存儲目標區Layer2Data2,定義目標區存儲的首地址指針為pDest=Layer2Data+M-1,然后定義臨時數據指針pTemp2=pDest,該模塊C語言實現代碼如下: for(j=(M-1)*2;j {LTemp1=out_buffer[j];//實部 LTemp2[WB]=((LTemp116)*Factor1[LayerID-1])2;//計算高16 b,乘比例系數再乘2,加上小數乘法 [DW] 左移1位,共移2位 LTemp3=(long)(((unsigned long)(LTemp1 0x0000ffffL) * Factor1[LayerID-1])(16-1));//計算低16位,無符號乘法 *(pTemp2++)=(LTemp2+LTemp3)16;//往目標區保存結果 } 將保存在目標區內的數據減采樣一半,仍舊保存在目標區內,該模塊的C語言代碼如下: pTemp2=pDest;//臨時指針回復到目標區的源頭 for(L=1;L *(pTemp2++)=*(pDest+L); 3 小波重構過程的DSP實現 首先對數據源區要重構的低頻、高頻數據分量進行上采樣,將上采樣后的數據存到另外一個目標數據緩沖區,該模塊的C語言程序代碼如下: pTemp2=pDest;//臨時指針指向目標區,作為重構數據的起點 for(L=0;L {*(pTemp2++)=0;//奇數位置插入0值 *(pTemp2++)=*(pSrc+L);} *(pTemp2)=0;//尾部多補一個0 交換數據指針,將計算結果存到另一區,對上采樣后的數據進行邊界延拓,然后應用重疊保留法計算擴展后的數據和重構濾波器組的線性卷積,這兩個模塊的實現同分解過程。惟一有所區別的是,在保存數據時,每一層重構時的第一個分段前面要去掉的個數要多一點,模塊的C語言代碼如下: if(i==1) //i為分段標記 SaveBegin=(M-1+Trim)*2;//第一個分段要多丟掉一些 else SaveBegin=(M-1)*2;//其他分段丟掉的數據(16bit)個數 for(j=SaveBegin;j { …… } 4 結 語 由于小波變換算法的復雜性,微機和通用的微處理器在運算速度上難以實現小波變換的實時性要求。定點DSP具有低功耗、高性能的特點,本文結合TI公司的16位定點DSP說明了小波變換快速算法的具體實現,解決了小波變換實時、高精度處理的要求。 參 考 文 獻 [1]Mallat S.A Theory for Multi-resolution Signal Decomposition:The Wavelet Representation[J].IEEE Transaction on Pattern Analysis and Machine Intelligence,1989,11(4): 674-693. [2]呂新華.一種長序列小波變換的快速實現方法[J].數據采集與處理,2006,21(1):86-89. [3]呂新華.小波變換Mallat算法實現中的邊界延拓研究[J].天津理工大學學報,2006,22(2):14-17. [4]虞湘賓.長序列信號快速相關與卷積的算法研究[J].電路與系統學報,2001,6(4):78-83. 作者簡介 呂新華 男,1976年出生,湖北十堰人,碩士。主要從事數字信號處理研究。 注:本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文。