1.小波变换
常用小波基有Haar小波、Daubechies(dbN)小波、Mexican Hat(mexh)小波、Morlet小波、Meyer小波等。
%matlab code
clc
clear
close all
load test_data
%小波边换
Fs = 256;
[t]=wpdec(test_data,3,'db4'); %小波包分解,3代表分解3层,'dmey'使用meyr小波
plot(t) %画小波包树图
wpviewcf(t,1); %画出时间频率图
小波包树(已采样率256Hz为例):
我们的数据的是256Hz的采样频率。
我们的采样频率是256Hz,根据采样定理,奈奎斯特采样频率是128Hz,我们分解了3层,最后一层就是 2^3=8个频率段,每个频率段的频率区间是 128/8=16Hz
小波变换将现有的信号向下分解时,将信号转化为低频部分和高频部分(细节部分),但是小波变换只将信号的低频部分进一步分解,而对高频部分不再继续分解,所以小波变换能够很好地表征一大类以低频信息为主要成分的信号,不能很好地分解和表示包含大量细节信息(细小边缘或纹理)的信号,如非平稳机械振动信号、遥感图象、地震信号和生物医学信号等。小波包变换不仅对低频部分进行分解,对高频部分也进行分解,如上图,当是小波变换的时候,只将黑色的连接线(低频部分)进行分解,红色的连接线(高频部分)不进行分解,当用小波包进行变换的时候,不管是黑色的连接线(低频部分)还是红色的连接线(高频部分)都进行分解。
第一行将采样频率进行2等分, 第二行将采样频率进行4等分,第N行将采样频率进行2^N等分;
节点的命名规则:(0,0)表示原始信号,从(1,0)开始,叫1号, (1,1)是2号………依此类推,(3,0)是7号,(3,7)是14号。
MATLAB输出的小波包树,可以通过点击节点可以在右边的数据显示区显示波形,以供用户查看。
2.小波包分解系数
小波变换的实质是:原信号与小波基函数的相似性。小波系数就是小波基函数与原信号相似的系数
3.信号分解与重构
3.1 wpjoin read write wprec 信号分解与重构
实现对任意节点系数选择进行组合重构
%MATLAB code
t2 = wpjoin(t,[3;4;5;6]);% wpjoin 重新组合小波包
% 将小波包树的第二行的四个节点收起来,也就是让第二行的节点变为树的最底层节点。因为第一行中小波包树
% 的节点个数是第一层2个,第二层4个,第三层8个。现在t2就是将第三层的节点再聚合回第二层。
% wpjoin是必要的,write函数对最底层的节点操作。如果没有这一句,我们只能对最底层(第三层)的小波
% 包系数进行修改,而wpjoin将第三层的数据聚合回到第二层,现在第二层就是最底层,所以才能用write对
% 其进行操作
sNod = read(t,'sizes',[3,4,5,6]);
% 读取第二层3,4,5,6节点系数的大小
cfs3=wpcoef(t,3);% 读取第3个节点的小波系数
cfs3 = zeros(sNod(1,:));
cfs4 = zeros(sNod(2,:));
cfs5 = zeros(sNod(3,:));
cfs6 = zeros(sNod(4,:));
t3 = write(t2,'cfs',5,cfs5,'cfs',4,cfs4,'cfs',3,cfs3,'cfs',6,cfs6);
%将5,6节点的小波系数置位0,就行将节点5,6对应的频率剔除掉
wave2=wprec(t3);% wprec 一维小波包重构 重构的数据
figure
plot(wave2)
结果图
原始数据图:
重构之后的数据:
t3 = write(t2,‘cfs’,5,cfs5,‘cfs’,4,cfs4,‘cfs’,3,cfs3,‘cfs’,6,cfs6);
因为将节点3,4,5,6(完美的一层)节点的小波系数均置位零了,与小波基函数相似度为零,就是摒弃了所有的频率的数据,所以重构之后的波形就是常数,可以用来进行数据的滤波
t3 = write(t2,‘cfs’,5,cfs5,‘cfs’,6,cfs6,‘cfs’,4,cfs4);
因为将节点4,5,6节点的小波系数均置位零了,与小波基函数相似度为零,就是摒弃了高频的数据,所以重构之后的波形只包含低频的数据,可以用来进行数据的滤波
3.2 对节点小波系数的打印输出
只能对某一节点信号系数分别进行重构
%MATLAB code
x=test_data;
fs=256;
N=length(x); %采样点个数
t=wpdec(test_data,3,'db4'); %小波包分解,3代表分解3层,'dmey'使用meyr小波
for i=0:7
rex3(:,i+1)=wprcoef(t,[3,i]); %实现对节点小波节点进行重构
end
% 在小波包节点的频谱划分“不是严格按照上述理解的顺序排列的”(一种格雷编码排序),
% 要解决这个问题我们需要对节点顺序进行重新编码排序。
figure; %绘制第3层各个节点分别重构后信号的频谱
for i=0:7
subplot(2,8,i+1);
x_sign=rex3(:,i+1);
N=length(x_sign); %采样点个数
signalFFT=abs(fft(x_sign,N));%真实的幅值
Y=2*signalFFT/N;
f=(0:N/2)*(Fs/N);
plot(f,Y(1:N/2+1));
title(['第3层',num2str(i),'节点频谱']);
end
% 重新编码排序
nodes=[7;8;9;10;11;12;13;14]; %第3层的节点号
ord=wpfrqord(nodes); %小波包系数重排,ord是重排后小波包系数索引构成的矩阵 如3层分解的[1;2;4;3;7;8;6;5]
nodes_ord=nodes(ord); %重排后的小波系数
for i=1:8
rex3(:,i)=wprcoef(wpt,nodes_ord(i)); %实现对节点小波节点进行重构
end
for i=0:7
subplot(2,8,i+9);
x_sign= rex3(:,i+1);
N=length(x_sign); %采样点个数
signalFFT=abs(fft(x_sign,N));%真实的幅值
Y=2*signalFFT/N;
f=(0:N/2)*(fs/N);
plot(f,Y(1:N/2+1));
title(['第3层',num2str(i),'节点频谱']);
end
小波系数节点存储排序是 [1,2,4,3,7,8,5,6] (一种格雷码排序),上图一共有两行,第一行是直接绘制的,频率是乱的,没有按照频率的大小排列,绘制的节点排列是 [7,8,10,9,13,14,11,12] ,使用 wpfrqord 对节点重新排序,在第二行中重新绘制。
4小波包分解------能量特征提取
4.1方法1
%能量特征提取
for i = 1 : 8
cfs3_floor(i,:)=wpcoef(wpt,nodes_ord(i)); %对重排序后第3层i节点的小波包系数0-8Hz
E_cfs3_floor(i)=norm(cfs3_floor(i,:),2)^2; %% 1-范数:就是norm(...,1),即各元素绝对值之和;2-范数:就是norm(...,2),即各元素平方和开根号;求每个节点的频段能量
end
E_total_3_floor=sum(E_cfs3_floor);
for i = 1 : 8
p_node(i)= 100*E_cfs3_floor(i)/E_total_3_floor; % 求得每个节点的占比
end
figure;
x=1:8;
bar(x,p_node);
title('各个频段能量所占的比例');
xlabel('第三层节点号');
ylabel('能量百分比/%');
for j=1:8
text(x(j),p_node(j),num2str(p_node(j),'%0.2f'),...
'HorizontalAlignment','center',...
'VerticalAlignment','bottom')
end
4.2方法2
MATLAB自带函数 ==wenergy(wpt) == 但是该函数只能对最底层节点进行能量提取。