声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 3828|回复: 11

[小波] 小波模极大值与峰值(极大值极小值)有什么关系?

[复制链接]
发表于 2009-7-5 17:52 | 显示全部楼层 |阅读模式

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

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

x
想用小波来求一个序列的峰值。
现在可以求出 模极大值。
但不知道 模极大值 对应的位置就是序列的峰值吗?  

用下面的程序可以求出在 db3下的6层的模极大值。
要如何应用它得到原始序列的极大值呢? 是用到某一层的(ddw: 局部极大位置),还是要综合多层的?
谢谢。
==============
points=1024; level=6; sr=360; num_inter=6; wf='db3';
%所处理数据的长度 分解的级数 抽样率 迭代次数 小波名称
offset=0;
[Lo_D,Hi_D,Lo_R,Hi_R]=wfilters(wf);

%计算小波分解系数和模极大序列
[signal,swa,swd,ddw,wpeak]=wave_peak(points,level,Lo_D,Hi_D,Lo_R,Hi_R,offset);
% signal: 原始信号; swa:小波概貌; swd:小波细节;
% ddw: 局部极大位置; wpeak:小波变换的局部极大序列]

function [signal,swa,swd,ddw,wpeak]=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([1,points,-50,300]);
signal=ecgdata(1:points)'+offset;

% 信号的小波变换,按级给出概貌和细节的波形
[swa,swd] = 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
回复
分享到:

使用道具 举报

 楼主| 发表于 2009-7-6 16:50 | 显示全部楼层
胡广书的现代信号处理教程里有:
对心电图的R波检测中。。
对每一条正岁极大值线进行直线拟合,分别求出它们在尺度a=0的时间位置,就是R波位置。

极大值也要这么个求法吗?
我完全不懂啊,不知道谁能解答下,谢谢。
 楼主| 发表于 2009-7-6 22:08 | 显示全部楼层
下面附上全部的代码和运行结果。

主程序代码:(将附件下载到同一目录,并在matlab中设置为当前目录后,运行下面的代码即可)
clc;
clear;
close all;
signal=load('signal.txt' );
points=400;
offset=0;
level=4;  wf='bior3.5'; fig=true;
%分解的级数 小波名称 是否作图

[Lo_D,Hi_D,Lo_R,Hi_R]=wfilters(wf);

%计算小波分解系数和模极大序列
[swa,swd,ddw,wpeak]=wave_peak(signal,level,Lo_D,Hi_D,Lo_R,Hi_R,fig);
% signal: 原始信号; swa:小波概貌; swd:小波细节;
% ddw: 局部极大位置; wpeak:小波变换的局部极大序列

%画某层的模极大值点
figure
plot(signal);
lvl=4;
hold on
a=ddw(lvl,:);
idx=find(a==1);
plot(idx,signal(idx),'r.');


问题:
想根据模极大值来得到原信号的峰值点。
但选取不同的小波(上面选的是  wf='bior3.5'),结果会不一样。
而且原信号峰值也不会对应到模极大值的位置。

那到底该如何根据模极大值来得到峰值位置啊? 麻烦各位了。

原信号及在第4层的模极大值位置

原信号及在第4层的模极大值位置

wave_peak.m

1.29 KB, 下载次数: 70

求模极大值的函数

signal.txt

2.35 KB, 下载次数: 51

要分析的信号(400长度)

 楼主| 发表于 2009-7-8 19:41 | 显示全部楼层
啊~ 为什么没人理。
发表于 2010-11-6 09:42 | 显示全部楼层
想進來瞭解
卻是很九沒有人回應
好可惜
发表于 2011-8-7 09:44 | 显示全部楼层
回复 4 # yisnkkk 的帖子

不知道楼主你的峰值,是不是原始信号的峰值?
“但不知道 模极大值 对应的位置就是序列的峰值吗?”对于你的这个疑问,我的回答只能是“应该不是”。引用一句话:“函数的奇异点可以从其小波变换的模极大值检测出来;小波变换的模极大值都是出现在信号有突变的地方;信号突变越大,其小波变换的模极大值就越大,而信号的突变点一定是信号的奇异点。”
我的理解是,利用模极大值检测出来的只是信号的突变点或奇异点。
至于是不是峰值,我想你如果看到该回复以后,应该有了自己的想法。
发表于 2012-12-11 14:59 | 显示全部楼层
好,谢谢
发表于 2013-10-21 11:04 | 显示全部楼层
本帖最后由 yueyaquan 于 2013-10-21 11:13 编辑


如果求由细节系数重构信号的模极大值序列,是不是只要把lz程序中的信号signal改为按细节系数重构的信号即可。小波变换的模极大值序列具体指谁的模极大值序列,那该怎么求细节系数的模极大值序列。新手,求指导~~~~
发表于 2013-11-20 21:42 | 显示全部楼层
正想学习的东西,谢谢大家踊跃发言
发表于 2014-6-18 11:16 | 显示全部楼层
yisnkkk 发表于 2009-7-6 22:08
下面附上全部的代码和运行结果。

主程序代码:(将附件下载到同一目录,并在matlab中设置为当前目录后, ...

adfaedfwefqawefqwe
发表于 2014-8-21 12:04 | 显示全部楼层
学习 了。
发表于 2015-7-15 20:31 | 显示全部楼层
楼主,您好,我想问问模极大值有正负之分吗?可以根据模极大值的正负去判别待分析信号的极性不?
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-5-18 10:29 , Processed in 0.063048 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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