- 积分
- 42
- 注册时间
- 2005-10-22
- 仿真币
-
- 最后登录
- 1970-1-1
|
现在都2006时代了,也没洒技术含量,不知道算不算OLD了,凑合看吧
背景介绍:需要利用MATLAB的小波去噪函数.希望能够支持编译.
本人从未使用过小波工具箱.对小波没有任何理解,但由于涉及到的是去噪部分,看上去不是那么困难.所以本人不知道以下过程对编译其它工具箱的函数有没有启发.
系统环境:WINDOWS + VC6.0 + MATLAB65
前言:
如上所述,本文工作仅仅针对MATLAB65,或者说编译器3.0.MATLABR14后的编译器对工具箱函数的支持已经很好了.具体请参考TMW上的介绍.
至于符号计算,feval等MATLAB编译器不支持的函数,此处也不介绍了,需要的请参考TMW网页.
在能看到源码的范围内,工具箱函数之所以不好编译,经过我一天的摸索,我想应该有以下几个方面的困难.
1. 工具箱不比单枪匹马的单个函数,它是个系统,所以,程序结构,让人想起了软件工程.容错检查等等一堆,程序结构复杂
2. 工具箱函数大量使用了feval等编译器不支持的函数.
3. 工具箱函数可能调用了很多数据文件.
4. 工具箱的函数错综复杂,层层嵌套,往往有的函数,仅仅只有一两行.有些函数居然还有重复的.仅仅是改了几个string而已
准备工作.
先初步看看小波工具箱的函数结构.以便有个初步印象,尽管有些英文术语我都念不通.
Start ---Toolboxes—Wavelet---Help
要编译的函数即是
wden - Automatic 1-D de-noising using wavelets.
既然要编译,那么找到其调用的所有的函数是第一件要作的事情
1. 在Editor中,绿色工具栏f,show Function,可以列出该M文件的所有函数.但这显然不是我们所需要的.
2. 通过函数inmem
3. TMW FileExchange据说有几个函数.
4. depfun
这个是我比较习惯的.
主要是: 函数路径列得很清楚.写几行代码,把不是工具箱路径下的函数去掉就行了.
结果输出的最后会列出feval等函数的出处.这个无疑提供了很好的信息.
找到函数后,把所有的函数列一个M文件里.这个还是推荐手动.因为你至少得熟
悉函数名称,以及大概是干什么的.尤其是象我这样对这个工具箱完全没有概念的人.
函数代码总共也就几K行.但,这并不一定是最后的齐全的函数.
比如主函数WDEN也就调用了5个主要的函数.
工具箱函数中一堆的变量输入输出检查函数.这个我暂时拿它没有什么好的办法.因为函数数量实在是庞大,将这些出错检测如何一层层地向上传递是个问题.所以,我干脆去掉了所有的出错检测.这不是个好习惯,不得已而为之.
其次,需要检查exist函数.这个函数判断变量,有的情况下结果是错误的.
以及LOAD函数,将load(bin_file,'-mat');换为load(bin_file);即可
然后便是feval等了.
对于feval需要注意的是,WDEN函数中喜欢使用如下这种形式
F = feval(fname,wname);
比如wfilters的LINE 62.这种调用让人摸不着头脑.
分析输出wname,fname,得知,
Wname sym8
Fname symwavf
which symwavf一查.原来是它.
看函数名,以及waveinfo函数,所以应该把symwavf及其它函数给包容进来.
将feval改swicth或if函数即可.
完成这些之后可以编译了.
此时,需要查找是否还有一些独立的数据文件.
在工具箱文件夹中搜索*.mat
在列出的WDEN函数中查找load,以及与文件操作有关的函数.
将需要的数据文件拷贝备份,和MEX程序打包即可
PS:有些数据文件根本不需要.因为函数中直接有函数赋予.
初步精简后WDEN函数不到2K代码.
以HELP中的
snr = 3; init = 2055615866;
[xref,x] = wnoise(3,11,snr,init);
lev = 5;
[xd,cxd,lxd] = wden(x,'heursure','s','one',lev,'sym8');
测试通过.由于本人对小波去噪函数以及小波族都不清楚,所以对于其它的小波,其它一些特殊情况没有作更多的研究.
至于最后的DLL函数,等我再整理整理,把更多的小波来试试后,再看吧. |
评分
-
1
查看全部评分
-
|