小波分解重构 V2.0 版程序存在的问题分析
2008-07-09 14:27
519 查看
首先非常感谢研友 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等程序中,就有判断分解系数各级矩阵大小是否周期性变化、相应地是否需要对矩阵进行边界延拓、延拓模式如何选取……等等。这些问题,目前我还抽不出时间深入探讨,希望以后和大家一起讨论的过程中,再把问题“发现一个,解决一个”吧,呵呵!
% 系数矩阵规范化,使各矩阵大小一致
[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等程序中,就有判断分解系数各级矩阵大小是否周期性变化、相应地是否需要对矩阵进行边界延拓、延拓模式如何选取……等等。这些问题,目前我还抽不出时间深入探讨,希望以后和大家一起讨论的过程中,再把问题“发现一个,解决一个”吧,呵呵!
相关文章推荐
- 小波图像分解与重构程序存在的问题与解决办法
- 小波图像分解与重构程序存在的问题与解决办法
- 小波图像分解与重构程序存在的问题与解决办法
- 自己动手编写小波信号分解与重构的Matlab程序
- 用自编的程序实现小波图像分解与重构
- 多尺度小波分解得到的系数进行处理之后如何进行重构的问题说明
- 一维信号的小波分解重构程序
- 自己动手编写小波信号分解与重构的Matlab程序
- 多线程程序问题分析小结
- 如何分析matlab程序的主要效率问题
- 软件工程第四个程序:结对项目 —— 电梯调度问题(分析)
- 程序运行时动态生成缓存时存在的问题
- 一个单尺度小波分解的程序-MATLAB版
- Linux下生产者消费者问题详细分析(操作系统期中考试论文---并发程序的同步和互斥)
- 小波图像重构 Matlab 程序 - V3.0版
- Spring事务管理,"'程序报错'但'事务不回滚'?"问题分析(SSM实例)
- 使用std::sort()排序导致程序core问题分析
- 分苹果问题分析及程序
- IIS8集成模式下打开静态资源被aspx处理程序处理,StaticFileModule失效问题分析
- 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了;面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为(转)