1-D 信号小波去噪函数 wden
1-D 信号小波去噪函数 wden
[xd,cxd,lxd,thrs] = wden(in1,in2,in3,in4,in5,in6,in7)
该函数使用小波变换对 1-D 信号进行自动去噪。
输入参数
in1: 输入信号x或者小波系数向量c或 MODWT 变换矩阵W。in2: 阈值选择规则tptr,支持以下选项:'modwtsqtwolog': 使用 MODWT 进行去噪,并使用 Donoho 和 Johnstone 的通用阈值和级别依赖的阈值处理。'rigrsure': 使用 Stein 的无偏风险原理进行 DWT 去噪。'heursure': 使用 Stein 的无偏风险的启发式变体进行 DWT 去噪。'sqtwolog': 使用 Donoho 和 Johnstone 的通用阈值进行 DWT 去噪。'minimaxi': 使用极小极大阈值进行 DWT 去噪。
in3: 阈值处理方法sorh,支持's'(软阈值) 和'h'(硬阈值)。in4: 阈值重标定方法scal,支持以下选项:'one': 不进行重标定。'sln': 使用基于第一级系数的噪声估计进行重标定。'mln': 使用级别依赖的噪声估计进行重标定,这是 MODWT 去噪的唯一支持选项。
in5: 小波变换层级n。in6: 小波函数wname,必须为字符串,对于 MODWT 去噪,必须为正交小波。in7: 对于 DWT 去噪,输入参数l为由WAVEDEC函数输出的尺度系数向量。
输出参数
xd: 去噪后的信号。cxd: 去噪后的 DWT 小波系数向量 (对于 DWT 去噪) 或 MODWT 变换矩阵 (对于 MODWT 去噪)。lxd: 对于 DWT 去噪,输出参数lxd为由WAVEDEC函数输出的尺度系数向量。thrs: 去噪阈值,对于 DWT 去噪,为每个层级的阈值向量,对于 MODWT 去噪,仅当使用'modwtsqtwolog'选项时才输出。
示例
- 示例 1: 对包含 2 Hz 正弦波和 0.3 秒和 0.72 秒处的瞬态的信号进行去噪,使用 Donoho 和 Johnstone 的通用阈值和级别依赖的噪声估计,并使用 DWT 和 MODWT 进行去噪。
N = 1000;
t = linspace(0,1,N);
x = 4*sin(4*pi*t);
x = x - sign(t - .3) - sign(.72 - t);
y = x+0.15*randn(size(t));
xdDWT = wden(y,'sqtwolog','s','mln',3,'db2');
xdMODWT = wden(y,'modwtsqtwolog','s','mln',3,'db2');
subplot(2,1,1)
plot(xdDWT), title('DWT Denoising'); axis tight;
subplot(2,1,2)
plot(xdMODWT), title('MODWT Denoising'); axis tight;
- 示例 2: 使用 Haar 小波对块状信号进行 MODWT 和 DWT 去噪,并比较原始信号与去噪版本之间的 L2 和 L-infty 范数。
[x,xn] = wnoise('blocks',10,3);
xdMODWT = wden(xn,'modwtsqtwolog','s','mln',6,'haar');
xd = wden(xn,'sqtwolog','s','mln',6,'haar');
plot(x)
hold on
plot(xd,'r--')
plot(xdMODWT,'k-.')
legend('Original','DWT','MODWT')
hold off
norm(abs(x-xd),2), norm(abs(x-xd),Inf)
norm(abs(x-xdMODWT),2), norm(abs(x-xdMODWT),Inf)
相关函数
THSELECT, MODWT, WAVEDEC, WDENCMP, WFILTERS, WTHRESH
详细说明
该函数首先检查输入参数的数量和类型是否正确。如果使用 MODWT 进行去噪,则直接调用 modwtdenoise1D 函数进行处理。对于 DWT 进行去噪,首先根据输入参数进行小波分解,得到小波系数 c 和尺度系数 l。根据输入参数,计算小波系数的阈值,根据阈值对小波系数进行阈值处理或者收缩处理。对处理后的小波系数进行小波重构,得到去噪后的信号 xd。根据输出参数的数量,返回不同的结果。
注意: 该函数在使用时需要包含 Wavelet Toolbox。
代码实现
% Check arguments.
nargoutchk(0,4);
bIn = nargin;
switch nbIn
case {0,1,2,3,4,5}
error(message('Wavelet:FunctionInput:NotEnough_ArgNum'));
case 6
x = in1; tptr = in2; sorh = in3;
scal = in4; n = in5; w = in6;
case 7
c = in1; l = in2; tptr = in3;
sorh = in4; scal = in5; n = in6; w = in7;
end
if errargt(mfilename,tptr,'str')
error(message('Wavelet:FunctionArgVal:Invalid_ArgVal'));
end
if errargt(mfilename,sorh,'str')
error(message('Wavelet:FunctionArgVal:Invalid_ArgVal'));
end
if errargt(mfilename,scal,'str')
error(message('Wavelet:FunctionArgVal:Invalid_ArgVal'));
end
if errargt(mfilename,n,'int')
error(message('Wavelet:FunctionArgVal:Invalid_ArgVal'));
end
if errargt(mfilename,w,'str')
error(message('Wavelet:FunctionArgVal:Invalid_ArgVal'));
end
% Adding MODWT denoising
if strcmpi(tptr,'modwtsqtwolog')
if nargout>3
error(message('Wavelet:modwt:TooManyOutputs'));
end
[xd,cxd,lxd] = modwtdenoise1D(x,w,n,sorh,scal);
return;
end
if nbIn==6
% Wavelet decomposition of x.
[c,l] = wavedec(x,n,w);
end
% Threshold rescaling coefficients.
switch scal
case 'one' , s = ones(1,n);
case 'sln' , s = ones(1,n)*wnoisest(c,l,1);
case 'mln' , s = wnoisest(c,l,1:n);
otherwise
error(message('Wavelet:FunctionArgVal:Invalid_ArgVal'));
end
% Wavelet coefficients thresholding.
first = cumsum(l)+1;
first = first(end-2:-1:1);
ld = l(end-1:-1:2);
last = first+ld-1;
cxd = c;
lxd = l;
if iscolumn(c)
thrs = zeros(n,1);
else
thrs = zeros(1,n);
end
for k = 1:n
flk = first(k):last(k);
if strcmp(tptr,'sqtwolog') || strcmp(tptr,'minimaxi')
thr = thselect(c,tptr);
else
if s(k) < sqrt(eps) * max(c(flk))
thr = 0;
else
thr = thselect(c(flk)/s(k),tptr);
end
end % threshold.
thrs(k) = thr * s(k); % rescaled threshold.
cxd(flk) = wthresh(c(flk),sorh,thrs(k)); % thresholding or shrinking.
end
% Wavelet reconstruction of xd.
xd = waverec(cxd,lxd,w);
代码详解
- 检查输入参数的数量和类型是否正确。
- 如果使用 MODWT 进行去噪,则直接调用
modwtdenoise1D函数进行处理。 - 对于 DWT 进行去噪,首先根据输入参数进行小波分解,得到小波系数
c和尺度系数l。 - 根据输入参数,计算小波系数的阈值,根据阈值对小波系数进行阈值处理或者收缩处理。
- 对处理后的小波系数进行小波重构,得到去噪后的信号
xd。 - 根据输出参数的数量,返回不同的结
原文地址: https://www.cveoy.top/t/topic/nSB9 著作权归作者所有。请勿转载和采集!