一种长序列小波变换快速算法的DSP实现

时间:2022-10-06 04:13:45

【前言】一种长序列小波变换快速算法的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-...

一种长序列小波变换快速算法的DSP实现

摘 要:由于小波变换算法的复杂性,直接计算小波变换耗时较长,微机和通用的微处理器在运算速度上难以实现小波变换的实时性要求。定点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

{数据边界延拓程序模块;

pTemp1=pSrc-M+1;//临时指针指到延拓后数据的源头

/*应用长序列快速卷积的重叠保留法计算扩展后数据和分解滤波器组的卷积*/

for(i=1;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

{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格式阅读原文。

上一篇:电路虚拟实验系统 下一篇:基于B/S的网络设备模拟器设计和开发