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);

代码详解

  1. 检查输入参数的数量和类型是否正确。
  2. 如果使用 MODWT 进行去噪,则直接调用 modwtdenoise1D 函数进行处理。
  3. 对于 DWT 进行去噪,首先根据输入参数进行小波分解,得到小波系数 c 和尺度系数 l
  4. 根据输入参数,计算小波系数的阈值,根据阈值对小波系数进行阈值处理或者收缩处理。
  5. 对处理后的小波系数进行小波重构,得到去噪后的信号 xd
  6. 根据输出参数的数量,返回不同的结
1-D 信号小波去噪函数 wden

原文地址: https://www.cveoy.top/t/topic/nSB9 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录