比较通俗易懂的帖子,希望大家有时间看看作者本人的博客:
http://waveletlegend.spaces.live.com/
现在我就举例,对一个8点序列,怎样实现第二代小波变换。
1. 奇偶分开。
非常简单,就是[2,4,6,8]组成一列向量,[1,3,5,7]组成一列向量。
2. 预测。
用[2,4,6,8]来预测[1,3,5,7]。比如说1,3估计2; 3,5估计4; 5,7估计6; 7,1估计8。(边缘处理,我采用循环方法)。估计公式可以用别人的,也可以自己做。举一个线性的例子:2=1*a+3*b,4=3*a+ 5*b,...,其他的都一样。这样我们就可找到最优的a,b,使得(2-(1*a+3*b)).^2+(4-(3*a+5*b)).^2+...最小 化。就是最小均方准则。若正好为零,说明偶可以完全预测奇,也就是我们只要存储偶数列向量,和a,b就可以了,压缩也就是实现了。对于信号很长序列,就等 于压缩了一半。当然,我们可以采用更复杂的立方差值预测,多项式预测,或其它的准则,来使其最小,这样我们的压缩也就得到了最优。
3. 提升。
我们总希望,均方为零,但可望不可及。于是,提升就需要了。我们经过预测后,要存储的是偶数序列[2,4,6,8],新的奇数序列[n1,n3,n5, n7]=[2-(1*a+3*b),4-(3*a+5*b),...]和线性变换系数(a,b)。这里新的奇数序列就是高频分量。但偶数序列是不能完全代 表信号的性质的,有所差距。所以我们要对偶数序列进行修正。即所谓的提升。我们这次用个简单的提升吧。[n2,n4,n6,n8]=[2,4,6,8]+ k*[n1,n3,n5,n7]。[n2,n4,n6,n8],就是要分解的低频分量。那k怎么求呢?因为要保持n2,n4,n6,n8和原始信号 [1,2,3,4,5,6,7,8]一样的性质。一般就是均值和高阶矩。这里就一个未知数k,所以用均值相等,就行了。1/8*(1+2+3+..8)= 1/4*(n2+n4+n6+n8)。k很容易就求出来了。我们最终存储的就是[n1,n3,n5,n7]和[n2,n4,n6,n8]以及a,b,k。
现在,所谓的第二代就完了。再说几句。
1.反变换,就是3->2->1。
2.二维。先行提升,再列提升。(我置顶的贴子里有harr二维提升的源代码)。
3.整数阶。就是加一个取整。
4.多层或小波包提升,就是在对序列[n1,n3,n5,n7]或[n2,n4,n6,n8],再做1->2->3。
5.灵活。不一定是a,b,也可能就一个a,或a,b,c;不一定是一个k,也可能是k1,k2。但越多计算量太大。最好是用大师们做好的CDF,5/3,7/9等。
6.最重要的,任何一代小波,总可以通过一次或多次提升实现。它和一代小波没有本质区别。
7.优势。文献都有,我随便谈谈。时域实现,最优压缩,无边缘效应,灵活多变,无损压缩,编程方便,速度快。
文章写完了,希望对大家有帮助。最主要的,动手编,不要依赖MATLABM,这样才有所体会。希望和大家多交流。