小波模极大值重构 MATLAB代码
(2011-08-14 09:50:56)
标签:
matlab小波模极大值 |
本代码是摘自胡广书编写的《现代信号处理教程》,对相关程序段进行分析说明。
主程序:
%小波模极大值重构是采用的交替投影法
close all;
points=1024;
%所处理数据的长度 分解的级数
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:
%
ddw:
pswa=swa(level,:);
wframe=(wpeak~=0);
%迭代初始化
w0=zeros(1,points);
[a,d]=swt(w0,level,Lo_D,Hi_D);
w2=d;
% 原信号和由模极大重建信号的比较
figure,
subplot(211)
plot(pswa(1:points));
subplot(212)
plot(signal(1:points),'r');
%分别计算重建小波以及原信号的信噪比
werr=w2-swd;
% 原信号的小波变换(swd)和重建后的小波变换(w2)的比较
figure,
for m=1:level
end
err=pswa(1:points)-signal(1:points);
snr=20*log10(norm(signal)/norm(err))
%用到的函数
(1)function pc3inte=P_y(interval,len);
% 该函数对区间进行裁减即Py投影,返回裁剪后的区间信号
if sign(interval(1))==sign(interval(len))
else
end
pc3inte=interval;
(2)function
% 该函数用于进行 Pgama 和 Py 投影
err=wpeak-w1.*(wpeak~=0);
w2=zeros(size(wpeak));
[r,c]=size(wpeak);
% 对每一级小波分别进行处理
for m=1:r
end
(3)function [inter]=P_gama(interval,lev,sr);
T=length(interval);
%该函数对一个区间进行Pgama投影,返回修正的区间
if T==2
else
end
(4)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
ylabel(strcat('d
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
ylabel(strcat('j=
end