lsq001 发表于 2006-10-19 22:55

求助:小波变换模极大值的求取

小波变换模极大值的求取
如何实现呢?按照对小波变换,以及模极大值的理论,对应于信号的奇异点,是有相对应的模极大值的。
如此的话,如何求取模极大值呢。
比如对一个信号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 编辑 ]

lsq001 发表于 2006-10-19 23:06

要是有其它例子程序
或者有做好了的,能借鉴一下就好了
呵呵

lsq001 发表于 2006-10-20 20:49

不是吧
难道这里没有人
做过关于
小波变换模极大值的东西么
还是这个问题容易了
我求助反而显得有点不合时宜了
还往有人给些指点建议

lsq001 发表于 2006-10-25 21:13

我顶起
怎么没人知道啊
还是比较麻烦的说
还望有牛人劳力指点啊

lsq001 发表于 2006-10-28 10:34

郁闷了
好不容易找到一个网站提供程序源代码
交流
可还要先上传5——10个

自己在想办法吧

jimin 发表于 2006-10-28 13:07

这个我不懂,支持一下你,别急,慢慢来
加油!
有什么心得和成果拿出来和大家共享哦

happy 发表于 2006-10-28 17:19

参考下面的函数吧

function =wave_peak(points,level,Lo_D,Hi_D,Lo_R,Hi_R,offset)
% 该函数用于读取ecg信号,找到小波变换模极大序列

warning off;
ecgdata=load('ecg.txt');
plot(ecgdata(1:points)),grid on,axis tight,axis();
signal=ecgdata(1:points)'+offset;

%信号的小波变换,按级给出概貌和细节的波形
= swt(signal,level,Lo_D,Hi_D);
figure;
subplot(level,1,1); plot(real(signal)); grid on;axis tight;
for i=1:level
    subplot(level+1,2,2*(i)+1);
    plot(swa(i,:)); axis tight;grid on;xlabel('time');
    ylabel(strcat('a   ',num2str(i)));
    subplot(level+1,2,2*(i)+2);
    plot(swd(i,:)); axis tight;grid on;
ylabel(strcat('d   ',num2str(i)));
end

%求小波变换的模极大值及其位置
ddw=zeros(size(swd));
pddw=ddw;
nddw=ddw;
posw=swd.*(swd>0);
pdw=((posw(:,1:points-1)-posw(:,2:points))<0);
pddw(:,2:points-1)=((pdw(:,1:points-2)-pdw(:,2:points-1))>0);
negw=swd.*(swd<0);
ndw=((negw(:,1:points-1)-negw(:,2:points))>0);
nddw(:,2:points-1)=((ndw(:,1:points-2)-ndw(:,2:points-1))>0);
ddw=pddw|nddw;
ddw(:,1)=1;
ddw(:,points)=1;
wpeak=ddw.*swd;
wpeak(:,1)=wpeak(:,1)+1e-10;
wpeak(:,points)=wpeak(:,points)+1e-10;

%按级给出小波变换模极大的波形
figure;
for i=1:level
    subplot(level,1,i);
    plot(wpeak(i,:)); axis tight;grid on;
ylabel(strcat('j=   ',num2str(i)));
end

lsq001 发表于 2006-10-29 19:18

嗯,多谢happy
我也最近找到这个代码了
费了不少功夫
现在还在钻研
希望很快就有个结果吧
附带说一句
这个程序是用来处理心电信号的
程序还没有完全读懂

visstic 发表于 2006-10-29 23:49

很有道理!

hyl2323 发表于 2006-10-30 09:50

搂住的心态可以理解,我也是这样的,遇到问题总是迫切需要解决,非常期望有人指点一二。
我也做过一阵子小波,不过应用在模态识别方面,你所说的只是大概了解点,呵呵,多交流。

lsq001 发表于 2006-10-30 10:05

嗯,多谢了
我会抓紧时间的
争取早出结果

appier520 发表于 2006-11-8 16:01

我刚才还发了个类似的帖子提问这个,没想到转眼就看到这个程序,多谢多谢!

lsq001 发表于 2006-11-9 10:46

只是一个大概的思想吧
可以好好借鉴的
呵呵

happy 发表于 2006-11-9 11:17

nod,很多论坛朋友给出来的东西大多只是提供一个参考,是否正确,或者和你需要的有多大差距完全可以探讨
页: [1]
查看完整版本: 求助:小波变换模极大值的求取