前言
网上翻了很久的资料,找不到很详细的解释,又找到matlab的官方文档,但是也只是使用dwt
和dwt2
的single-level的小波分析,而multi-level的有找到是用wavedec
和waverec
函数的。在利用dwt
和dwt2
做multi-level的小波变换时也遇到了一些问题,在此记录一二。
注意: 噬也仅在此提供基本使用方式,具体的请查看相关matlab官方文档:dwt,idwt,dwt2,idwt2,wavedec,waverec。
问题描述
对于一维(1-dim)、二维(2-dim)信号,综合考虑关于影响其小波分析效果的以下方面:
- 不同母函数(mother wavelet)
- 软 / 硬去噪(soft / hard denoising, ξ \xi ξ=0.01,0.05,0.1)
- 分解层数 (decomposition level)
基本处理流程
【整体代码在后面,此部分仅为解释性讲解。】
-
载入信号 (load)
- 一维 (1-dim),一般载入后会是一个1×1的struct,需要提取值(可以在右侧工作区双击点开变量查看名称)
X=load('Dir\p_5_2.mat'); X=X.signal_name; % Name of the signal
- 二维 (2-dim),处理成矩阵(图像)
% Here is an example of 2-level X=load('Dir\p_5_3.mat'); X=cell2mat(struct2cell(X));
- 一维 (1-dim),一般载入后会是一个1×1的struct,需要提取值(可以在右侧工作区双击点开变量查看名称)
-
小波分解 (decompostion)
- 一维 (1-dim)
- 单层 (1-level)
wavename = 'db1'; [cA,cD] = dwt(X,'db1');
- 多层 (multi-level),只需要不断对每一层的
cA
(Approximation coefficients) 进行分解,或使用wavedec
函数wavename = 'db1'; [cA,cD] = dwt(X,wavename); [cA2,cD2] = dwt(cA,wavename);
- 单层 (1-level)
- 二维 (2-dim)
- 单层 (1-level)
wavename = 'haar'; % or 'db2', 'coif1' [cA,cH,cV,cD] = dwt2(X,wavename);
- 多层 (multi-level),只需要不断对每一层的
cA
(Approximation coefficients) 进行分解,或使用wavedec2
函数% Here is an example of 2-level wavename = 'haar'; [cA,cH,cV,cD] = dwt2(X,wavename); [cA2,cH2,cV2,cD2] = dwt2(cA,wavename);
- 单层 (1-level)
- 一维 (1-dim)
-
去噪 (denoising)
- 一维 (1-dim)
- 单层 (1-level),
‘s'
:soft denoising,‘h'
:hard denoisingthr = 0.01; % threshold cA = wthresh(cA,'s',thr); % or wthresh(cA,'h',thr); cD = wthresh(cD,'s',thr);
- 多层 (multi-level),在最后一层进行去噪即可,
‘s'
:soft denoising,‘h'
:hard denoisingthr = 0.01; % threshold cA2 = wthresh(cA2,'s',thr); % or wthresh(cA2,'h',thr); cD2 = wthresh(cD2,'s',thr);
- 单层 (1-level),
- 二维 (2-dim)
- 单层 (1-level)
thr = 0.01; % threshold cA = wthresh(cA,'h',thr); cH = wthresh(cH,'h',thr); cV = wthresh(cV,'h',thr); cD = wthresh(cD,'h',thr);
- 多层 (multi-level),在最后一层进行去噪即可,
‘s'
:soft denoising,‘h'
:hard denoising% Here is an example of 2-level thr = 0.01; % threshold cA2 = wthresh(cA2,'h',thr); cH2 = wthresh(cH2,'h',thr); cV2 = wthresh(cV2,'h',thr); cD2 = wthresh(cD2,'h',thr);
- 单层 (1-level)
- 一维 (1-dim)
-
小波重构 (reconstruction)
- 一维 (1-dim)
- 单层 (1-level)
wavename = 'db1'; x=idwt(cA,cD,wavename);
- 多层 (multi-level),只需要不断对每一层的
cA
(Approximation coefficients) 进行重构,或使用waverec
函数% Here is an example of 2-level wavename = 'db1'; cA=idwt(cA2,cD2,'db1'); x=idwt(cA,cD,'db1');
- 单层 (1-level)
- 二维 (2-dim)
- 单层 (1-level)
wavename = 'haar'; % or 'db2', 'coif1' x=idwt2(cA,cH,cV,cD,wavename);
- 多层 (multi-level),只需要不断对每一层的
cA
(Approximation coefficients) 进行分解,或使用waverec2
函数
注意: 二维多层重构可能会遇到维度不一致的报错,问题可能在于分解时对于奇偶行列数的处理,经观察发现,多出的行、列其实是重复的数据(和相邻的一样),因此应该直接舍去。% Here is an example of 2-level wavename = 'haar'; cA=idwt2(cA2,cH2,cV2,cD2,wavename); len = size(cA); % size(cA) = (164 190) cA = cA(1:len(1)-1,:);
- 单层 (1-level)
- 一维 (1-dim)