这是用小波变换模极大值重建信号的源程序,数据是一心电信号,在matlab6。5下实现,来源于胡广书的《现代信号处理教程》附属光盘,现提供给大家供大家学习参考,滤波部分可以根据个人情况进行修改。程序包含四个部份,其中wave_peak实现信号的分解并求出模极大值
程序代码
%--------------------------------------------------------------------------
% 利用小波变换模极大重建原信号
%--------------------------------------------------------------------------
close all;
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小波变换的局部极大序列]
pswa=swa(level, ); % pswa 为待重建的信号
wframe=(wpeak~=0);
%迭代初始化
w0=zeros(1,points);
[a,d]=swt(w0,level,Lo_D,Hi_D);
w2=d; % w2为待重建小波
for j=1num_inter
w2=Py_Pgama(d,wpeak,wframe,1,sr); % 先进行Py投影和 Pgama投影
w0=iswt(pswa,w2,Lo_R,Hi_R); % 再进行Pv投影
[a,d]=swt(w0,level,Lo_D,Hi_D); % Pv
end
pswa=iswt(swa(level, ),w2,Lo_R,Hi_R); % 计算重建信号
% 原信号和由模极大重建信号的比较
figure,
subplot(211)
plot(pswa(1points));
subplot(212)
plot(signal(1points),'r');
%分别计算重建小波以及原信号的信噪比
werr=w2-swd;
% 原信号的小波变换(swd)和重建后的小波变换(w2)的比较
figure,
for m=1level
wsnr(m)=20log10(norm(swd(m, ))norm(werr(m, )))
subplot(level+1,1,m);
plot(swd(m, )),hold on,
plot(w2(m, ),'r');grid on;ylabel(strcat('j=',num2str(m))),axis tight;
end
err=pswa(1points)-signal(1points);
snr=20log10(norm(signal)norm(err))
wave_peak函数
程序代码
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(1points)),grid on,axis tight,axis([1,points,-50,300]);
signal=ecgdata(1points)'+offset;
% 信号的小波变换,按级给出概貌和细节的波形
[swa,swd] = swt(signal,level,Lo_D,Hi_D);
figure;
subplot(level,1,1); plot(real(signal)); grid on;axis tight;
for i=1level
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.(swd0);
pdw=((posw(,1points-1)-posw(,2points))0);
pddw(,2points-1)=((pdw(,1points-2)-pdw(,2points-1))0);
negw=swd.(swd0);
ndw=((negw(,1points-1)-negw(,2points))0);
nddw(,2points-1)=((ndw(,1points-2)-ndw(,2points-1))0);
ddw=pddwnddw;
ddw(,1)=1;
ddw(,points)=1;
wpeak=ddw.swd;
wpeak(,1)=wpeak(,1)+1e-10;
wpeak(,points)=wpeak(,points)+1e-10;
%按级给出小波变换模极大的波形
figure;
for i=1level
subplot(level,1,i);
plot(wpeak(i, )); axis tight;grid on;
ylabel(strcat('j= ',num2str(i)));
end