二、小波分析算法的C语言实现
小波变换程序:
voidDB4DWT(doubleData[],intn)
{
if(n》=4)
}
inTI,j;
intbalf=n》》1;
double*tmp=newdouble[n];
i=0;
for(j=0;j《half;j++)
{
tmp[j]=Data[(2*j)%n]*h0+
Data(2*j+l)%n]*h1+
Data[(2*j+2)%n]*h2+
Data[(2*j+3)%n]*h3;
tmp[j+half]=Datal(2*j)%n]*g0+
Data[(2*j+I)%n]*g1+
Datal(2*j+2)%n]*g2+
Data[(2*j+3)%n]*g3;
}
for(i=0;i《n;i++)
{
Data[i]=tmp[i];
}}}
提升算法的程序
小波的分解算法的提升过程如下:
使用提升算法的程序:
voidDB4LiftDWT(doubleData[],intn)
应用研究
inTI,half=n》》1;
double*pS=newdouble[half];
//临时变量存放平滑系数
double*pD=new
double[half];
//临时变量存放细节系数
for(i=0;i《half;it+)/赋值
{
pS[j]=Data[2*i]://even,
pD[i]=Data[2*i+1]://odd
}
for(i=0;i《half;i++)11DB4变换Update1
{
pS[i]=pS[i]+pD[i]*sqrt_3;
}
for(i=0;i《half;i++)//DB4的predict
{
pD[i]=pD[i]-sqrt_3*p$[i14
(sqt_3-2)*pS[(-1)》=0?(i-1):(halfTI-1)14;
//边界是采用周期延拓
}
for(i=0;i《half;i++)//DB4的update2
{
pS[i]=pS[i]-pD[(i+1)%half];
/1边界采用周期延拓
}
for(i=0;i《half;i++)
{
p$[i]=(sqt_3-1)*pS[iV(sqnt_2);/比例系数
pD[i]=(sqrt_3+1)*pD[i](sqrt_2);
}
for(i=0;i《half;i++)
{
Data[i]=pS[i];//将平滑系数放回原数组
}
for(i=half;i《length;i++)
{
Data[i]=pD[i-half];
/将细节系数放回原数组
}
deleteOpD;
delete[DpS;
在目述程序中用到了两个临时变量数组,虽然程
序结构清楚,容易阅读但消耗较大的内存空间,这里给
出另一种方法不用辅助数组,带来节约内存,但耗时。
voidsplit(doubleData[],intn)
{intstart=1;
intend=n-1;
while(start《end)
{for(inTI=start;i《end;i=i+2)
{doubletmp=Data[i];
Data[i]=Data[i+1];
Data[i+l]=tmp;}
start=start+1;
end=end-1;}}
对原数组调用split函数进行处理后,则Data数组的前半部分是偶数索引值,后半部分是奇数索引值。再对提升算法的程序进行一些修正就可以起到节约内存的目的。具体的实现限于篇幅不多介绍。利用提升算法的小波程序结构清楚,与Mallat算法相比运算量也小[3]。同时它的反变换也很易实现,这里由于篇幅限制,不对反变换作多的介绍。
本文给出了一维小波变换的C的实现,可在基础上实现:二维的小波变换,希望对要自己实现小波变换的读者有一定的帮助。