在上回《小波学习之一》中,已经详细介绍了Mallat算法C++实现,效果还可以,但也存在一些问题,比如,代码难于理解,同时出现了边界问题。在此,本文将重构代码,采用新的方法解决这些问题,同时也加深对小波变换的理解。
MATLAB作为经典的数学工具,分析其小波变换dwt和idwt实现后发现真的很经典,学习参考价值很高。下面结合南京理工大学
谭彩铭的《解读matlab之小波库函数》及MATLAB小波工具包中m文件的情况,作一个小结,最后用C++函数进行实现,并且编译调试OK。
一、MATLAB上dwt函数的工作过程
假设x=[x(1) x(2) x(3) x(4) x(5) x(6)
x(7)],计算y=dwt(x,’db2’),其计算过程主要由三个部分组成:
1、边缘延拓,它主要由函数wextend完成。
仔细分析子程序部分,函数wextend的用法为y=wextend('1D','sym',x,3);这样得到的y=[ x(3) x(2)
x(1) x(1) x(2) x(3) x(4) x(5) x(6) x(7) x(7) x(6) x(5)]
2、卷积运算,它主要由函数conv2完成。
仔细分析子程序部分,核心语句有z=conv2(y,Lo_D,'valid');这里设Lo_D=[h(1) h(2) h(3)
h(4)]。
这2步的实现过程示意图如下:
3、最后就是下采样即隔点采样,其下采样是按照式a =
z(2:2:length(z))进行的,高频低频部分均如此,项数为floor((7+4-1)/2)。
最后的dwt低频系数结果是[z(2)
z(4) z(6) z(8) z(10)],高频系数求解过程和低频系数一样,在此不再赘述。
二、MATLAB上idwt函数的工作过程
1、上采样即隔点插0,dyadup(x,0)。
2、卷积运算,它也是最终由函数conv2完成。
3、抽取结果,wkeep1(x,s,'c')。