摘 要:由于小波變換算法的復(fù)雜性,直接計算小波變換耗時較長,微機和通用的微處理器在運算速度上難以實現(xiàn)小波變換的實時性要求。定點DSP具有低功耗、高性能的特點,本文結(jié)合TI公司的16位定點DSP,將小波變換快速算法用C語言開發(fā),詳細(xì)說明了小波變換快速算法在定點DSP上的具體實現(xiàn),解決了小波變換實時、高精度處理的要求,大大提高了小波變換的運算效率。
關(guān)鍵詞:小波變換;數(shù)字信號處理器;快速算法;圓周卷積
中圖分類號:TP301.6 文獻(xiàn)標(biāo)識碼: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 引 言
由于小波變換具有良好的時頻分析特性,已經(jīng)廣泛應(yīng)用于各種信號分析領(lǐng)域。由于小波變換算法的復(fù)雜性,如果直接計算小波變換,所需內(nèi)存較大,耗時較長。盡管當(dāng)今處理器芯片運算速度得到了大幅度的提高,但仍然在實時性上不能滿足要求。為了簡化計算過程,人們相繼設(shè)計了一系列的快速算法來計算小波變換,以降低其運算次數(shù)[1]。
小波變換在大多數(shù)具體應(yīng)用中主要是在線信號的實時分析處理,微機和通用的微處理器在運算速度上難以適應(yīng)信號實時、高精度處理的要求。數(shù)字信號處理器(DSP)就是為了適應(yīng)這種需求而開發(fā)的。美國TI公司是全球最大的DSP供應(yīng)商,其生產(chǎn)的TMS320C55x系列16位定點DSP芯片具有低功耗、高性能等特點,具有廣泛的應(yīng)用領(lǐng)域,本文應(yīng)用該系列DSP芯片,將文獻(xiàn)[2]提出的小波變換快速算法用C語言開發(fā)加以實現(xiàn),解決了小波變換實時、高精度處理的要求。
2 小波分解過程的DSP實現(xiàn)
小波分解過程中算法實現(xiàn)的數(shù)據(jù)結(jié)構(gòu)存儲和尋址方式如圖1所示。
圖1 算法實現(xiàn)的數(shù)據(jù)結(jié)構(gòu)存儲和尋址方式
小波分解過程中C語言算法實現(xiàn)的偽代碼如下:
for(LayerID=1;LayerID<=LAYER_NUM;LayerID++)//小波多層分解
{數(shù)據(jù)邊界延拓程序模塊;
pTemp1=pSrc-M+1;//臨時指針指到延拓后數(shù)據(jù)的源頭
/*應(yīng)用長序列快速卷積的重疊保留法計算擴展后數(shù)據(jù)和分解濾波器組的卷積*/
for(i=1;i<=SegNum;i++)//開始分段
{從源數(shù)據(jù)區(qū)搬送數(shù)據(jù)到計算區(qū)的程序模塊;
用圓周卷積計算線性卷積的程序模塊;
將計算區(qū)的結(jié)果保存到目標(biāo)區(qū)的程序模塊;
pTemp1=pTemp1-M+1;//臨時指針指向下一個分段的數(shù)據(jù)起始點}
SrcLen=(SrcLen+M-1)/2;//下一級分解的源數(shù)據(jù)長度
/*為下一層分解做準(zhǔn)備*/
pTemp2=pSrc; pSrc=pDest; pDest=pTemp2;//交換數(shù)據(jù)指針,即交換數(shù)據(jù)源區(qū)和目標(biāo)區(qū)
pSrcEnd=pSrc+SrcLen+M-1; }
下面分別對偽代碼中各個子程序模塊的具體實現(xiàn)進(jìn)行分析。
2.1 邊界延拓模塊
數(shù)據(jù)邊界延拓程序模塊的實現(xiàn)[3]:
定義一個數(shù)據(jù)地址指針pSrc始終指向載入的源數(shù)據(jù)頭地址,即pSrc=Layer1Data+M-1,在源數(shù)據(jù)的首尾各對稱延拓M-1個點。該模塊的C語言實現(xiàn)代碼如下:
for(i=M-1;i>=1;i--)
*(pSrc-i)=*(pSrc+i-1);//前導(dǎo)數(shù)據(jù)擴展M-1個
pTemp1=pSrc+SrcLen;//臨時指針指到最后一個數(shù)據(jù)并出界一個
for(i=0;i *(pTemp1+i)=*(pTemp1-i-1);//尾部數(shù)據(jù)擴展M-1個 2.2 數(shù)據(jù)搬移模塊 從源數(shù)據(jù)區(qū)搬送數(shù)據(jù)到計算區(qū)的程序模塊實現(xiàn):定義一個臨時地址指針pTemp1指向擴展后的數(shù)據(jù)首地址,即:pTemp1=pSrc-M+1,SegNum為長序列分段數(shù),將數(shù)據(jù)從數(shù)據(jù)源區(qū)分段搬送到計算區(qū),并將16 b數(shù)據(jù)擴展為32 b,通過對虛部填零,組成復(fù)數(shù)輸入數(shù)據(jù)數(shù)組signal,該模塊C語言實現(xiàn)代碼如下(i為分段標(biāo)記,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) //沒數(shù)據(jù)了,臨時指針不動 {signal[j]=0;signal[j+1]=0; } else//還有數(shù)據(jù),臨時指針繼續(xù)向后移動 {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語言實現(xiàn)代碼如下[4]: cfft32_SCALE((LDATA *)signal,N); cbrev32((LDATA *)signal,(LDATA *)signal,N);//計算分段信號的FFT for (j=0;j<2*N;j=j+2)//計算復(fù)數(shù)的點乘運算 {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 結(jié)果保存模塊 將計算區(qū)的結(jié)果保存到目標(biāo)區(qū)的程序模塊實現(xiàn):將out_buffer去掉前面M-1個復(fù)數(shù),后面N-M+1個復(fù)數(shù)只取實部,即只取低頻分量,對取出的實部乘以比例系數(shù),這里采用的是小數(shù)乘法,然后再取前16 b,將結(jié)果存到數(shù)據(jù)存儲目標(biāo)區(qū)Layer2Data2,定義目標(biāo)區(qū)存儲的首地址指針為pDest=Layer2Data+M-1,然后定義臨時數(shù)據(jù)指針pTemp2=pDest,該模塊C語言實現(xiàn)代碼如下: for(j=(M-1)*2;j {LTemp1=out_buffer[j];//實部 LTemp2[WB]=((LTemp116)*Factor1[LayerID-1])2;//計算高16 b,乘比例系數(shù)再乘2,加上小數(shù)乘法 [DW] 左移1位,共移2位 LTemp3=(long)(((unsigned long)(LTemp1 0x0000ffffL) * Factor1[LayerID-1])(16-1));//計算低16位,無符號乘法 *(pTemp2++)=(LTemp2+LTemp3)16;//往目標(biāo)區(qū)保存結(jié)果 } 將保存在目標(biāo)區(qū)內(nèi)的數(shù)據(jù)減采樣一半,仍舊保存在目標(biāo)區(qū)內(nèi),該模塊的C語言代碼如下: pTemp2=pDest;//臨時指針回復(fù)到目標(biāo)區(qū)的源頭 for(L=1;L *(pTemp2++)=*(pDest+L); 3 小波重構(gòu)過程的DSP實現(xiàn) 首先對數(shù)據(jù)源區(qū)要重構(gòu)的低頻、高頻數(shù)據(jù)分量進(jìn)行上采樣,將上采樣后的數(shù)據(jù)存到另外一個目標(biāo)數(shù)據(jù)緩沖區(qū),該模塊的C語言程序代碼如下: pTemp2=pDest;//臨時指針指向目標(biāo)區(qū),作為重構(gòu)數(shù)據(jù)的起點 for(L=0;L {*(pTemp2++)=0;//奇數(shù)位置插入0值 *(pTemp2++)=*(pSrc+L);} *(pTemp2)=0;//尾部多補一個0 交換數(shù)據(jù)指針,將計算結(jié)果存到另一區(qū),對上采樣后的數(shù)據(jù)進(jìn)行邊界延拓,然后應(yīng)用重疊保留法計算擴展后的數(shù)據(jù)和重構(gòu)濾波器組的線性卷積,這兩個模塊的實現(xiàn)同分解過程。惟一有所區(qū)別的是,在保存數(shù)據(jù)時,每一層重構(gòu)時的第一個分段前面要去掉的個數(shù)要多一點,模塊的C語言代碼如下: if(i==1) //i為分段標(biāo)記 SaveBegin=(M-1+Trim)*2;//第一個分段要多丟掉一些 else SaveBegin=(M-1)*2;//其他分段丟掉的數(shù)據(jù)(16bit)個數(shù) for(j=SaveBegin;j { …… } 4 結(jié) 語 由于小波變換算法的復(fù)雜性,微機和通用的微處理器在運算速度上難以實現(xiàn)小波變換的實時性要求。定點DSP具有低功耗、高性能的特點,本文結(jié)合TI公司的16位定點DSP說明了小波變換快速算法的具體實現(xiàn),解決了小波變換實時、高精度處理的要求。 參 考 文 獻(xiàn) [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]呂新華.一種長序列小波變換的快速實現(xiàn)方法[J].?dāng)?shù)據(jù)采集與處理,2006,21(1):86-89. [3]呂新華.小波變換Mallat算法實現(xiàn)中的邊界延拓研究[J].天津理工大學(xué)學(xué)報,2006,22(2):14-17. [4]虞湘賓.長序列信號快速相關(guān)與卷積的算法研究[J].電路與系統(tǒng)學(xué)報,2001,6(4):78-83. 作者簡介 呂新華 男,1976年出生,湖北十堰人,碩士。主要從事數(shù)字信號處理研究。 注:本文中所涉及到的圖表、注解、公式等內(nèi)容請以PDF格式閱讀原文。