Mallat算法又称塔式算法,它是S.Mallat于1989 年在多分辨分析基础上提出的快速算法。Mallat算法在小波分析中的作用相当于快速傅里叶变换(FFT)在傅里叶分析中的作用,它的出现标志着小波分析走上了宽阔的应用领域。Mallat算法适合于正交小波和双正交小波对信号的快速分解与重构,包括Mallat分解算法和重构算法。分解和重构需要低通、高通滤波器,它们的关系如下:
式中:H 为小波分解低通滤波器;G 为小波分解高通滤波器;h 为小波重构低通滤波器;g 为小波重构高通滤波器。
7.3.1.1 Mallat分解算法
Mallat小波分解没有与具体的尺度函数和小波函数联系,它由小波滤波器H、G 对信号进行分解。分解算法为:
式中:H 为分解低通滤波器;G为分解高通滤波器;t 为离散时间序列号,t=1,2,…,N;f(t)为原始信号;j 为分解层数,j=1,2,…,J,J=log2N;Cj为信号f(t)在第j层的低通小波系数(近似部分);Dj为信号f(t)在第j 层的高通小波系数(细节部分)。
式(7.32)的含义是:假定所检测的离散信号f(t)为C0,信号f(t)在第2j尺度(第j 层)的近似部分(低频部分)的小波系数Cj是通过2j-1尺度(第j-1 层)的近似部分的小波系数Cj-1与分解低通滤波器H 卷积,然后将卷积的结果隔点采样得到的;而信号f(t)在第2j尺度(第j 层)的细节部分(高频部分)的小波系数Dj是通过2j-1尺度(第j-1 层)的近似部分的小波系数Cj-1与分解高通滤波器G 的卷积,然后将卷积的结果隔点采样得到的。
通过式(7.32)的分解,在每一层j 上,信号f(t)被分解为低频部分的小波系数Cj和高频部分的小波系数Dj。图7.13 为Mallat算法分解实现过程。
图7.13 Mallat 分解算法实现过程
H—与H 卷积;G—与G卷积;↓2—隔点采样
由Mallat算法分解过程得知,每分解一次,数据减半。即若C0有N 个数据,则C1和D1分别为N/2个数据;依此类推,在第j 层上有N/2j个数据。因此,说分解过程是快捷的。
7.3.1.2 Mallat重构算法
重构算法是分解算法的逆过程。重构算法公式为:
式中:j 为分解层数,j=J-1,J-2,…,1,0;J=log2N;h、g 分别为小波重构的低通滤波器系数和高通滤波器系数;其他符号同式(7.32)。
式(7.33)的含义是:信号f(t)在第2j尺度(第j 层)的近似部分的小波系数Cj是通过第2j+1尺度(第j+1 层)的近似部分的小波系数Cj+1隔点插零后与重构低通滤波器h 卷积以及第2j+1尺度(第j+1 层)的细节部分的小波系数Dj+1隔点插零后与重构高通滤波器g 卷积,然后求和得到的。不断重复这一过程,直至第20尺度,得到重构信号。重构算法过程如图7.14所示。
图7.14 Mallat 重构算法实现过程
h—与h 卷积;g—与g 卷积;↑2—隔点插零
7.3.1.3 程序设计
(1)程序框图。根据Mallat小波分解与重构实现过程,设计程序框图如图7.15、图7.16 所示。
图7.15 Mallat分解计算程序框图
图7.16 Mallat重构计算程序框图
(2)程序代码。包括Mallat小波分解算法子程序、Mallat小波重构算法子程序、序列周期延拓子程序及卷积算法子程序,分别用VisualBasic语言实现。
1)Mallat小波分解子程序,程序输入X(N)原始序列、低通滤波器H(k)、滤波器长度R、样本序列长度N、分解层数L;输出为小波分解高通序列W[L,N+2*(R-1)]及低通序列CC[L,N+2*(R-1)]。其程序代码如下:
2)Mallat小波重构子程序,程序输入高通序列D(L)、低通序列C(L)、低通滤波器
H(k)、滤波器长度R、样本序列长度N、分解层数L;输出为重构序列CK(N)。其程序代码如下:
3)卷积计算子程序。输入序列值C(K)、高通或低通滤波器PHG,输出卷积结果为序列DC(K)。(www.xing528.com)
4)序列周期延拓长度计算子程序。输入为Shu,输出为XuLiZhouQiYanTuoLen。
7.3.1.4 应用实例
以长江寸滩站某两年的日平均年流量序列为例,取尺度数L=3,采用Db2 小波对日平均流量Q(t)进行小波分解,得到低通和高通序列;再用第一、二、三层的高通序列及第三层的低通序列进行重构,获得近似原始序列。其结果如图7.17所示。
从图7.17中可以看出,重构序列除开始几个点有部分差别外,其余过程几乎完全一致,说明小波分解与重构是成功的。由于小波Mallat算法分解一次序列个数减半,因此,对于序列长度有限的水文时间序列,分解层数一定要适当。
7.3.1.5 Mallat算法实现中的问题
Mallat算法是从正交小波入手导入的,但它同样适合于双正交小波,分解和重构的关键在于寻求滤波器系数。
(1)边界延拓问题。对信号长度有限的水文时间序列进行分解和重构时,都不可避免在边界上产生误差,这是因为大多数小波基的支集长度都大于1 (Harr基除外),因此在平移时两个基底会有重叠部分。然而到了边界上,边界小波基被强行截去了一部分,这样就会在边界上产生误差。解决的办法是增加原始信号的长度,将边界延拓到原始信号之外,以保证原始信号分解和重构的精确性。常用的边界延拓方法有零延拓、光滑常数延拓、周期延拓、对称延拓等(上面给出的程序采用的是周期延拓)。
图7.17 Db2 小波Mallat分解与重构结果
(a)原始序列;(b)第一层分解高频序列;(c)第一层分解低频序列;(d)第二层分解高频序列;(e)第二层分解低频序列;(f)第三层分解高频序列;(g)第三层分解低频序列;(h)重构序列
(2)初始化问题。在进行小波分解时需要选取初始值作为小波分解的第一组系数进行递推计算,初始值直接影响着小波分解的精度。由于初始值计算很复杂,实际应用中采取近似的方法获取,常用的方法就是采用原始序列作为小波分解的初始值。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。