声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 5600|回复: 14

[编程技巧] 求助:小波变换模极大值的求取

[复制链接]
发表于 2006-10-19 22:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
小波变换模极大值的求取
如何实现呢?按照对小波变换,以及模极大值的理论,对应于信号的奇异点,是有相对应的模极大值的。
如此的话,如何求取模极大值呢。
比如对一个信号s进行4尺度分解,用DB小波。之后在D1尺度上,针对这一尺度小波分解的系数,找到对应的模极大值。
之前也在一些论坛上找到过一些,可惜不是很明白。主要是对编写程序比较头疼吧。
下面是找来的一个小程序
他的思想我能明白
但是是需要一定修改之后才能为所用吧
模极大值是要设置阀值,将信号的每点计算值与相邻点进行比较
可以参考我如下的程序实现:


function md=MaxMode(W,L)

Wmax=0;%求取第一个小波变换的模极大值
tfirst=0;%求第一个小波变换模极大值点的时刻

for i=1:5001
md(i)=0;
end

for(i=1:1:4009)
if(abs(W(i))>abs(Wmax))
Wmax=W(i);
tfirst=i;
end
end
%求取小波变换模极大值点。
Wflag=abs(0.02*Wmax);%设定小波变换模极大值的门坎值
tflag=tfirst+2*L/0.28;
for(i=1:1:tflag)
if((W(i+1)>Wflag)&(W(i+1)-W(i)>Wflag))
md(i+1)=W(i+1);
elseif((W(i+1)<-Wflag)&(W(i+1)-W(i)<-Wflag))
md(i+1)=W(i+1);
else
md(i+1)=0;
end

end

for(i=1:1:tflag)
if((md(i)>0)&(md(i+1)>md(i)))
md(i)=0;
elseif((md(i)<0)&(md(i+1)<md(i)))
md(i)=0;
end
end

W代表信号,L代表线路长度,Wflag=abs(0.02*Wmax)是阀值可以自己定义;
tflag=tfirst+2*L/0.28是选取信号分析区间,这也是根据需求而定

要是有人能明白全部,并且能就此给出仔细诠释
让我好好理解,接受就太好了。在此先谢过了

[ 本帖最后由 suffer 于 2006-10-20 14:55 编辑 ]
回复
分享到:

使用道具 举报

 楼主| 发表于 2006-10-19 23:06 | 显示全部楼层
要是有其它例子程序
或者有做好了的,能借鉴一下就好了
呵呵
 楼主| 发表于 2006-10-20 20:49 | 显示全部楼层
不是吧
难道这里没有人
做过关于
小波变换模极大值的东西么
还是这个问题容易了
我求助反而显得有点不合时宜了
还往有人给些指点建议
 楼主| 发表于 2006-10-25 21:13 | 显示全部楼层
我顶起
怎么没人知道啊
还是比较麻烦的说
还望有牛人劳力指点啊
 楼主| 发表于 2006-10-28 10:34 | 显示全部楼层
郁闷了
好不容易找到一个网站提供程序源代码
交流
可还要先上传5——10个

自己在想办法吧
发表于 2006-10-28 13:07 | 显示全部楼层
这个我不懂,支持一下你,别急,慢慢来
加油!
有什么心得和成果拿出来和大家共享哦
发表于 2006-10-28 17:19 | 显示全部楼层
参考下面的函数吧

  1. function [signal,swa,swd,ddw,wpeak]=wave_peak(points,level,Lo_D,Hi_D,Lo_R,Hi_R,offset)
  2. % 该函数用于读取ecg信号,找到小波变换模极大序列

  3. warning off;
  4. ecgdata=load('ecg.txt');
  5. plot(ecgdata(1:points)),grid on,axis tight,axis([1,points,-50,300]);
  6. signal=ecgdata(1:points)'+offset;

  7. %  信号的小波变换,按级给出概貌和细节的波形
  8. [swa,swd] = swt(signal,level,Lo_D,Hi_D);
  9. figure;
  10. subplot(level,1,1); plot(real(signal)); grid on;axis tight;
  11. for i=1:level
  12.     subplot(level+1,2,2*(i)+1);
  13.     plot(swa(i,:)); axis tight;grid on;xlabel('time');
  14.     ylabel(strcat('a   ',num2str(i)));
  15.     subplot(level+1,2,2*(i)+2);
  16.     plot(swd(i,:)); axis tight;grid on;
  17. ylabel(strcat('d   ',num2str(i)));
  18. end

  19. %求小波变换的模极大值及其位置
  20. ddw=zeros(size(swd));
  21. pddw=ddw;
  22. nddw=ddw;
  23. posw=swd.*(swd>0);
  24. pdw=((posw(:,1:points-1)-posw(:,2:points))<0);
  25. pddw(:,2:points-1)=((pdw(:,1:points-2)-pdw(:,2:points-1))>0);
  26. negw=swd.*(swd<0);
  27. ndw=((negw(:,1:points-1)-negw(:,2:points))>0);
  28. nddw(:,2:points-1)=((ndw(:,1:points-2)-ndw(:,2:points-1))>0);
  29. ddw=pddw|nddw;
  30. ddw(:,1)=1;
  31. ddw(:,points)=1;
  32. wpeak=ddw.*swd;
  33. wpeak(:,1)=wpeak(:,1)+1e-10;
  34. wpeak(:,points)=wpeak(:,points)+1e-10;

  35. %按级给出小波变换模极大的波形
  36. figure;
  37. for i=1:level
  38.     subplot(level,1,i);
  39.     plot(wpeak(i,:)); axis tight;grid on;
  40. ylabel(strcat('j=   ',num2str(i)));
  41. end
复制代码
 楼主| 发表于 2006-10-29 19:18 | 显示全部楼层
嗯,多谢happy
我也最近找到这个代码了
费了不少功夫
现在还在钻研
希望很快就有个结果吧
附带说一句
这个程序是用来处理心电信号的
程序还没有完全读懂
发表于 2006-10-29 23:49 | 显示全部楼层
很有道理!
发表于 2006-10-30 09:50 | 显示全部楼层
搂住的心态可以理解,我也是这样的,遇到问题总是迫切需要解决,非常期望有人指点一二。
我也做过一阵子小波,不过应用在模态识别方面,你所说的只是大概了解点,呵呵,多交流。
 楼主| 发表于 2006-10-30 10:05 | 显示全部楼层
嗯,多谢了
我会抓紧时间的
争取早出结果
发表于 2006-11-8 16:01 | 显示全部楼层
我刚才还发了个类似的帖子提问这个,没想到转眼就看到这个程序,多谢多谢!
 楼主| 发表于 2006-11-9 10:46 | 显示全部楼层
只是一个大概的思想吧
可以好好借鉴的
呵呵
发表于 2006-11-9 11:17 | 显示全部楼层
nod,很多论坛朋友给出来的东西大多只是提供一个参考,是否正确,或者和你需要的有多大差距完全可以探讨
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-5-24 06:57 , Processed in 0.109503 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表