www.gusucode.com > wavelet工具箱matlab源码程序 > wavelet/eml/ddencmp.m

    function [thr,sorh,keepapp,crit] = ddencmp(dorc,worwp,x)
% MATLAB Code Generation Library Function
%
%   Copyright 1995-2016 The MathWorks, Inc.
%#codegen

narginchk(3,3);
coder.internal.prefer_const(dorc,worwp);

WV = isequal(worwp,'wv');
WP = isequal(worwp,'wp');
DEN = isequal(dorc,'den');

% Check arguments.
coder.internal.assert(nargout <= 3 || ~WV, ...
    'Wavelet:FunctionOutput:TooMany_ArgNum');
coder.internal.assert(WV || WP, ...
    'Wavelet:FunctionArgVal:Invalid_ArgVal');

% Set thr value.
if DEN
    n = numel(x);
    if WV
        thr = sqrt(2*log(n)); % wavelets.
        normaliz = calcNormaliz(x,false);
        thr = thr*normaliz/0.6745;
    else
        thr = sqrt(2*log(n*log(n)/log(2))); % wavelet packets.
    end
else
    thr = calcNormaliz(x,true);
end

% Set sorh value.
if DEN && WV
    sorh = 's'; 
else
    sorh = 'h'; 
end

% Set keepapp default value.
keepapp = 1;

% Set crit value. The assignment will automatically be eliminated in the
% generated code if nargout < 4.
if DEN
    crit = 'sure';
else
    crit = 'threshold';
end

%--------------------------------------------------------------------------

function normaliz = calcNormaliz(x,CMP)
coder.internal.prefer_const(CMP);
if isvector(x)
    [c1,l1] = wavedec(x(:),1,'db1');
    % c2 = c1(l1(1)+1:end);
    offset = coder.internal.indexInt(l1(1));
    lenc2 = coder.internal.indexInt(length(c1)) - offset;
    c2 = coder.nullcopy(zeros(1,lenc2,'like',c1));
    for k = 1:lenc2
        c2(k) = c1(offset + k);
    end
    normaliz = median(abs(c2));
    % if normaliz=0 in compression, kill the lowest coefs.
    if CMP && normaliz == 0
        normaliz = 0.05*max(abs(c2));
    end
else
    [c3,l3] = wavedec2(x,1,'db1');
    % c4 = c3(prod(l3(1,:))+1:end);
    offset = coder.internal.indexInt(prod(l3(1,:)));
    lenc4 = coder.internal.indexInt(numel(c3)) - offset;
    c4 = coder.nullcopy(zeros(1,lenc4,'like',c3));
    for k = 1:lenc4
        c4(k) = c3(offset + k);
    end
    normaliz = median(abs(c4));
    % if normaliz=0 in compression, kill the lowest coefs.
    if CMP && normaliz == 0
        normaliz = 0.05*max(abs(c4));
    end
end

%--------------------------------------------------------------------------