ddxy1986 发表于 2009-4-3 10:13

EMD三次样条问题求助

各位大牛,小弟接触EMD算法刚半个月时间,算是初来乍到,若下面的提问有什么幼稚之处还请多多包涵,小弟先谢过各位^_^

最近需要用c#编写EMD算法,现在存在的最大疑惑就是三次样条的问题:

    第一、使用三次样条函数进行插值需要给定边界条件,共有三种边界条件可以选择,不知道哪种边界条件适合EMD算法?(注:这里使用的三次样条函数是

《c#数值计算算法编程》中提供的,要我现编估计会疯的:@( )

    第二、不管哪种边界条件都是要求提供端点的导数值。这样就带来一个问题,在处理端点问题的时候有很多种好的方法,但好像只有正交多项式拟合法可以在求

出拟合多项式之后很方便的写出导函数的多项式,然后直接代入边界点求导数(多项式拟合法精度不如正交多项式拟合法,所以就不算一种方法了)。让我心痛的

是,不知是我自己代码编写的缺陷还是正交多项式拟合法自身的缺陷,迭代前几个IMF分量的时候表现的还可以,到后期极值点很少的情况下(比如只有4、5

个),拟合出的边界点的绝对值大的离谱(如经过Z_SCORE标准化后一般的值也就是1左右,但是拟合出的边界值会达到35),而且多项式系数动辄10的17次方这

么大,根本无法使用。因此,现在只能选择其它的方法,如镜像延拓法进行边界拟合,但是导数具体怎么求,还请各位指点迷津。

P.S. 刚开始想尝试翻译MATLAB代码,但看到那么多系统函数,如直接用spline就可以三次样条插值,欲哭无泪,放弃这个念头了:'( 在线等待好心人的解答,不

胜感激!

[ 本帖最后由 zhangnan3509 于 2009-4-3 17:26 编辑 ]

xray 发表于 2009-4-7 10:21

回复 楼主 ddxy1986 的帖子

Matlab的函数应该可以编译成DLL供C#来调用吧!
p.s. 我只做过VC++调用Matlab编译的DLL文件,我想应该差不多的吧 :)

ddxy1986 发表于 2009-4-7 11:13

原帖由 xray 于 2009-4-7 10:21 发表 http://www.chinavib.com/forum/images/common/back.gif
Matlab的函数应该可以编译成DLL供C#来调用吧!
p.s. 我只做过VC++调用Matlab编译的DLL文件,我想应该差不多的吧 :)

哈哈哈~我那老板要求看到C#的源码,所以痛苦中。。。:@Q

ddxy1986 发表于 2009-4-7 11:23

    xray兄,在论坛上久闻您大名,特向您请教问题哈^_^

    这几天算法已经写的差不多了,对之前我提问的两个问题,现在是这么做的,因为数学功底不是很高,所以请xray兄多多指点~具体如下:

    首先,对三次样条函数我选择的是一阶导数作为边界条件。

    接下来,对于边界点会振荡很大的问题,我的解决思路是,将两个端点的值作为极大值曲线或者极小值曲线的端点。例如假设H>H,就把它作为极大值曲

线的左端点,不再使用正交多项式拟合。这样一来每次的极大极小值曲线就能减少两个需要预测的端点值,也使得曲线在端点处不会出现过大的振荡,验证下来发

现效果也是可行的。不过没有理论基础,不知道这样做是否符合EMD算法的原理。



[ 本帖最后由 zhangnan3509 于 2009-4-9 10:18 编辑 ]

xray 发表于 2009-4-7 14:29

回复 6楼 ddxy1986 的帖子

实际上,你采用的插值方法与下面文献中提出的极值延拓方法类似,可以参考一下:
黄大吉, 赵进平, 苏纪兰等. 希尔伯特-黄变换的端点延拓. 海洋学报, 2003, 25(1): 1-11.

此外,对于三次样条函数的边界条件,由于延拓可以得到边界外的极值点,往往把极值点作为插值的边界,而极值点的一阶导数为0(已知),所以一般可以采用一阶导数作为边界条件。

ddxy1986 发表于 2009-4-7 16:50

原帖由 xray 于 2009-4-7 14:29 发表 http://www.chinavib.com/forum/images/common/back.gif
实际上,你采用的插值方法与下面文献中提出的极值延拓方法类似,可以参考一下:
黄大吉, 赵进平, 苏纪兰等. 希尔伯特-黄变换的端点延拓. 海洋学报, 2003, 25(1): 1-11.

此外,对于三次样条函数的边界条件,由于延 ...

感谢~刚研究了极值延拓方法,我的理解是:拿极大值包络来说,通过已知的极值点在左右两段点各延伸2个极值,再使用三次样条函数。假设原极大值数组长度为

i,那通过延拓后的数组长度就是i+4,然后使用第一种边界条件,并且两个端点的导数值为0。求出包络之后减去去掉新增加的极值点,作为最终的极大值包络。是

这个意思吗?不太理解的是为什么要左右各增加两个点呢?只增加一个极值点不就可以用三次样条函数了吗?感谢xray兄的指点迷津:lol

xray 发表于 2009-4-7 20:25

回复 8楼 ddxy1986 的帖子

从计算的角度来说,只增加一个极值点就可以了,但是由于三次样条的计算是对所有极值点的位置列方程组求解的,因此增加一个极值点和增加两个极值点计算得到的三次包络略有差异。通常延拓出两个极值点,可能是希望通过增加边界附近的极值点个数,来增加边界附近插值结果的稳定性。当然,这个也只是我的猜测,权作抛砖引玉吧 :@)

wangyanfang678 发表于 2009-4-9 14:58

请问6楼,能不能将你改进过的边界处理程序给发上来?

ddxy1986 发表于 2009-4-9 20:58

原帖由 wangyanfang678 于 2009-4-9 14:58 发表 http://www.chinavib.com/forum/images/common/back.gif
请问6楼,能不能将你改进过的边界处理程序给发上来?

呵呵~是这样的,我只是理解了一下极值延拓方法,然后并没有实现,现在用的还是原来的正交多项式拟合+三次样条函数的方法,三次样条函数用的是周长发的《c#数值计算算法编程》中的代码,然后正交多项式是翻译的Matlab程序,见附件。

wangyanfang678 发表于 2009-4-10 12:05

谢谢楼主,我试试

ddxy1986 发表于 2009-4-10 13:21

原帖由 wangyanfang678 于 2009-4-10 12:05 发表 http://www.chinavib.com/forum/images/common/back.gif
谢谢楼主,我试试

呵呵~不客气哈,我现在还是回归正式的方法了,正在翻译Rilling弄的镜像延拓法,其它方法还是精度不够啊。。。

td21 发表于 2013-4-15 20:55

为什么没人用极值延拓呢?莫非这个方法不好?

yghit08 发表于 2013-4-15 21:10

td21 发表于 2013-4-15 20:55 static/image/common/back.gif
为什么没人用极值延拓呢?莫非这个方法不好?

如果你查到没有文献在做,你可以做做看啊!
任何模型化方法或者是可以做数据预测的方法都可以用来做端点延拓。个人见解

td21 发表于 2013-4-17 08:52

yghit08 发表于 2013-4-15 21:10 static/image/common/back.gif
如果你查到没有文献在做,你可以做做看啊!
任何模型化方法或者是可以做数据预测的方法都可以用来做端点 ...

你好,刚开始接触EMD,我想请教一下。基于法国人的程序,做端点延拓的改进,我目前看的是相似极值延拓,是不是就是把相似极值延拓对应的程序,把emd.m里的镜像延拓那部分替换掉就可以了?还是对整个emd.m需要进行修改?期待您的回答。谢谢

yghit08 发表于 2013-4-17 08:55

替换掉就行
页: [1] 2
查看完整版本: EMD三次样条问题求助