`
womendu
  • 浏览: 1478272 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

小波分解重构 V2.0 版程序存在的问题分析

阅读更多

首先非常感谢研友 hh_milan ,7月7日和他讨论时提出了我这个小波分解重构程序存在一个挺大的问题:一个16*16的矩阵,用我的V2.0小波分解重构程序处理后,重构矩阵大小仅为9*9!当时我就判断出问题应该是出在重构程序的子函数 myidwt2() 中的 wkeep 那一行代码上,即用来将重构滤波卷积后的序列进行截取,使之与下一级的系数矩阵大小一致。做V2.0程序的时候,没仔细想,就简单地按 row-lnf+1 的长度截取了,而这样截取出来的矩阵大小是和下一级系数矩阵不一致的,所以在 myidwt2() 中的开头就有了这一段规范化的程序:

% 系数矩阵规范化,使各矩阵大小一致

[m,n]=size(rcA);

rcV=rcV(1:m,1:n);

rcH=rcH(1:m,1:n);

rcD=rcD(1:m,1:n);

这样处理的话,实际上,每重构一级,所得到的矩阵就会比原来同级的分解系数子矩阵要小若干行和列,从而就有了16*16的矩阵重构后只有9*9大小了。

着手解决这个问题的时候,一开始,我没什么头绪,就研究 Matlab 自带的小波函数程序代码,想从中看看 Matlab 是怎样处理这个问题的,然后按自己的理解编写修正程序。真是不看不知道,一看吓一跳,Matlab 为了解决这个重构问题,调用了十多个函数程序,主要包括waverec2,idwt2,dwtmode,dyadup,upsconv2,wextend,wconv2,wkeep2,wavemngr,wtbxmngr等等,特别是dwtmode, wavemngr, wtbxmngr等程序,涉及到这个小波分解和重构的全局管理信息,有一大堆的输入参数判别代码和模式(mode)分类处理代码,有没有详细的注释,看了好几个小时,也没有把各个函数之间的关联完整的构建起来,看来我悟性有待提高啊!不过这里要理解好matlab的这些程序,一定要对小波变换的数学分析过程有所掌握,才能理清其中的脉络。我就是小波的数学基础没修好,所以才看得辛苦。

不过感觉做科研,有时候真的是,寻寻觅觅,“蓦然回首,那人却在灯火阑珊处”!昨天因为课题任务没抽出时间继续研究这个小波重构问题。倒是晚上回宿舍的路上,突然想到matlab的 wavedec2() 函数的输出是[c,s],c 是分解系数序列,s 记录各级分解系数子矩阵的大小。在小波重构的时候,截取卷积序列的长度,就是要与下一级矩阵的行或列长度一致的,那这个 s 应该可以用来作为截取长度而读入的。其实就是很基本的一个原理!回宿舍后在V2.0程序的 mywavedec2 里面加上这个 s 的输出,在 mywaverec2 里面添加这个 s 的输入,然后在 myidwt2 中根据 s 来截取卷积序列 …… OK,Problem shooted down !

呵呵,真有点一波三折的感觉,在 matlab 自带函数的代码中脱离出来,才发现问题的解决其实可以很简单。但是,此刻,我又有点预感,今天这个 V3.0 的程序,可能还存在某些深层次的问题。毕竟,这里给出的小波分解与重构程序,还是着眼于基本的功能,与 matlab 的自带函数相比,是一种简化的处理。如果功能上要进一步扩展,就必须考虑很多复杂的因素,从 matlab 的 dwtmode, wavemngr, wtbxmngr等程序中,就有判断分解系数各级矩阵大小是否周期性变化、相应地是否需要对矩阵进行边界延拓、延拓模式如何选取……等等。这些问题,目前我还抽不出时间深入探讨,希望以后和大家一起讨论的过程中,再把问题“发现一个,解决一个”吧,呵呵!

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics