来源:http://blog.163.com/[email protected]/blog/static/6096992620125713240582/
1. 使用小波分解、重构
1)wrcoef 由多层小波分解重构某一层的分解信号;
2)waverec 直接重构原始信号
注意:如果原始信号的长度为N,则使用wrcoef得到的信号,不论是近似信号信息还是细节信息,其长度都为N。
主要代码如下:
fg2=figure('numbertitle','on','name','使用wavedec信号分解');
[d,a]=wavedec(y,3,'db5');
subplot(211);plot(d);ylabel('信号分解');
subplot(212);plot(a);ylabel('各段信号长度');
fg3=figure('numbertitle','on','name','使用wrcoef获取每层信号');
a3=wrcoef('a',d,a,'db5',3);
d3=wrcoef('d',d,a,'db5',3);
d2=wrcoef('d',d,a,'db5',2);
d1=wrcoef('d',d,a,'db5',1);
subplot(411);plot(a3);ylabel('a1');
subplot(412);plot(d3);ylabel('d3');
subplot(413);plot(d2);ylabel('d2');
subplot(414);plot(d1);ylabel('d1');
fg4=figure('numbertitle','on','name','使用waverec的效果图');
subplot(211);
plot(y);ylabel('原始信号');
subplot(212);
sx=waverec(d,a,'db5');
plot(sx);ylabel('恢复的信号');
fg5=figure('numbertitle','on','name','使用Hilbert的效果图');
ys=hilbert(d3);
ydata=abs(ys);
Fs=1000;
NFFT=1024;
p=abs(fft(ydata,NFFT));
plot((0:NFFT/2-1)/NFFT*Fs,p(1:NFFT/2));
xlabel('频率 f/Hz');
ylabel('功率谱 P/W');
2. 使用小波包分解、重构
参见另外我的一篇博客《使用小波包获得某个节点信号的几个细节问题》。
3. 几种重构获取节点处信号的不同之外
3.1 关于小波分解时,层数、近似信号、细节信号的对应关系
wrcoef
Reconstruct single branch from 1-D wavelet coefficients
Syntax
X = wrcoef('type',C,L,'wname',N)
Description
wrcoef reconstructs the coefficients of a one-dimensional signal, given a wavelet decomposition structure (C and L) and either a specified wavelet ('wname', see wfilters for more information) or specified reconstruction filters (Lo_R and Hi_R).
Argument 'type' determines whether approximation ('type' = 'a') or detail ('type' = 'd') coefficients are reconstructed. When 'type' = 'a', N is allowed to be 0; otherwise, a strictly positive number N is required. Level N must be an integer such that N ≤length(L)-2.
解释:
如果分解三层,则
信号:C=CA3+CD3+CD2+CD1,
长度标示:L=[size(CA3),size(CD3),size(CD2),size(CD1),size(C)]
如果要求解节点CA3,则使用a3=wrcoef('a',d,a,'db5',3);
如果要求解节点CD3,则使用d3=wrcoef('d',d,a,'db5',3);
如果要求解节点CD2,则使用d2=wrcoef('d',d,a,'db5',2);
如果要求解节点CD1,则使用d1=wrcoef('d',d,a,'db5',1);
最后一个参数是根据在L中的索引顺序决定的,且最大值为length(L)-2,在此应用中最大值是3。
%-------------------------------------------------
a3=wrcoef('a',d,a,'db5',3); % 得到CA3,等同于a3=wrcoef('a',d,a,'db5');
d1=wrcoef('d',d,a,'db5',1); % 得到CD1
d2=wrcoef('d',d,a,'db5',2); % 得到CD2
d3=wrcoef('d',d,a,'db5',3); % 得到CD3,等同于d3=wrcoef('d',d,a,'db5');
%-------------------------------------------------
wpt = wpdec(y,3,'db5');
cfs_a3= wprcoef(wpt,[3 0]); % 得到CA3
cfs_d1= wprcoef(wpt,[1 1]); % 得到CD1
cfs_d2= wprcoef(wpt,[2 1]); % 得到CD2
cfs_d3= wprcoef(wpt,[3 1]); % 得到CD3 由此可知,小波分解与小波包分解,其分解思路是一致的。只是小波分解只用了左半部分,小波包分解用了整个二叉树。
参见另外一篇博文:《使用小波包获得某个节点信号的几个细节问题》。
3.3 信号长度
以原始信号的长度是1024,分解层数是3作为例子。
1)使用wrcoef,其格式为:X = wrcoef('type',C,L,'wname',N) ,使用此函数可得到任意节点处的信号,即除了节点CA3,CD3,CD2,CD1之外,还可以获取节点CA1,CA2处的信号。小波分解后使用的wrcoef函数,其特殊之处在于从每个节点处得到的信号长度均与原始信号长度一致,如3.1节的图所示。
2)使用wpcoef,其格式为:X = wpcoef(T,N),例如:
wpt = wpdec(x,3,'db1'); % Plot wavelet packet tree wpt.
plot(wpt);
cfs = wpcoef(wpt,[3 0]);
3)使用wprcoef,其格式为:X=wprcoef(T,N),例如:
t = wpdec(x,3,'db1','shannon'); % Plot wavelet packet tree.
plot(t);
rcfs = wprcoef(t,[3 0]);
figure(2);
subplot(211);
plot(x); title('Original signal');
subplot(212);
plot(rcfs); title('Reconstructed packet 3,0)');