赞
踩
本篇文章主要分析了matlab中关于小波变换的相关函数:wavedec(用于小波分解)和wrcoef(用于小波重构)。通过分析两个函数的实际动作,进一步用C语言实现小波变换的分解及重构。最后比较了matlab的结果与C语言的结果,结果一致,实现了C语言的小波变换。
(*ps:本文只针对db4小波,分析四层的小波变换。其他小波及不同层数的分解需要根据实际情况对程序进行改动。)
wavedec函数是用于小波分解的函数,在matlab中使用时的基本格式如下:
[C,L] = wavedec(rawData,4,'db4');
输入:
名称
意义
rawData
需要分解的原始数据
4
分解的层数
‘db4’
使用的小波信号
这里用于测试的原始数据为:
rawData = [24,34,49,48,25,17,34,50,64,71,64,54,53,55,56,60];
输出:
名称
意义
C
分解出的各层细节分量cD与最后一层的近似分量cA
L
与C中对应的cA与cD的数量
C和L的具体含义在matlab中解释如下:
上图为进行三层分解的结果示意图。因此在对原始数据进行四层分解时,C中的数据应为:cA4 cD4 cD3 cD2 cD1。而L中的结果就是每个数据的长度。
下面对wavedec函数中的实际动作进行分析:
通过在matlab中查看该函数的代码可以发现,wavedec函数最核心的内容其实就是离散小波变换(dwt):
[x,d] = dwt(x,Lo_D,Hi_D);
这里出现了Lo_D和Hi_D两个量,x是输入的原始数据,那么Lo_D和Hi_D分别是什么?再深入查看代码,可以发现这两个量其实是每个小波信号都有的低通分解量和高通分解量。不同的小波信号,其分解量也不同,但每个小波信号的分解量值是固定不变的。可以在matlab中通过wfilters函数获取各个小波信号的分解量,获取’db4’小波的分解量如下:
[Lo_D,Hi_D,Lo_R,Hi_R]=wfilters('db4');
这时又引出了两个量:Lo_R(低通重构)和Hi_R(高通重构),和上面的分解量对应,这两个量用于信号的重构,在wrcoef函数中会使用到。
得出的结果:
Lo_D =[ -0.0106,0.0329,0.0308,-0.1870,-0.0280,0.6309,0.7148,0.2304];
Hi_D =[-0.2304,0.7148,-0.6309,-0.0280,0.1870,0.0308,-0.0329,-0.0106];
Lo_R =[0.2304,0.7148,0.6309,-0.0280,-0.1870,0.0308,0.0329,-0.0106];
Hi_R =[-0.0106,-0.0329,0.0308,0.1870,-0.0280,-0.6309,0.7148,-0.2304];
到这里,分析wavedec函数就变成了分析dwt函数。
matlab中对dwt函数的结构可以用以下的图进行简单解释:
从图中可以看出,实现离散小波变换,首先将原始信号分别通过低通滤波器和高通滤波器,然后分别进行降采样就可得到cA与cD。这里的“通过低通滤波器和高通滤波器”可以简单的理解为信号与之前求得的两个分解量(Lo_D和Hi_D)进行卷积,具体的含义可参考:小波学习之一(单层一维离散小波变换DWT的Mallat算法C++和MATLAB实现) —转载。
这篇文章对单层一维离散小波变换的分解进行了十分详细的解释,并且使用C++进行了小波的分解与重构,能够实现信号的重构,但是其信号分解的结果与matlab的结果存在出入。此外,在实现单层的小波分解与重构的基础上,我们的目标是实现多层信号的分解与重构。因此在这篇文章代码的基础上,笔者对其进行了更改,在改变成C语言版本的同时实现了信号的多层分解与重构,使其结果与matlab结果保持一致。
在小波分解中,对信号的分解是一层一层进行的,对每一层的近似分量进行分解以获得下一层的近似分量与细节分量,其原理如下图所示。因此,要实现wavedec函数功能就要对每一层进行离散小波变换(dwt)。
对原始信号进行离散小波变换(dwt)后,依次对得到的近似分量(cA)进行离散小波变换以获得下一层的分解量。将每一层需要的cD与cA及其个数汇总起来就可得出wavedec函数的结果C和L。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。