www.gusucode.com > wavelet工具箱matlab源码程序 > wavelet/eml/wthcoef.m
function c = wthcoef(o,c,l,niv,percent,sorh) %MATLAB Code Generation Library Function % Copyright 1995-2016 The MathWorks, Inc. %#codegen % Check arguments. narginchk(3,6); ONE = coder.internal.indexInt(1); coder.internal.prefer_const(o); if nargin >= 4 lenniv = coder.internal.indexInt(length(niv)); end if nargin >= 5 lenpercent = coder.internal.indexInt(length(percent)); end if nargin == 6 coder.internal.prefer_const(sorh); end o1 = lower(o(1)); if o1 == 'a' coder.internal.assert(nargin == 3, ... 'Wavelet:FunctionInput:TooMany_ArgNum'); c(1:l(1)) = 0; return end rmax = coder.internal.indexInt(length(l)); nmax = rmax - 2; coder.internal.assert(allIntInRange(niv,ONE,nmax), ... 'Wavelet:FunctionArgVal:Invalid_LevVal'); if o1 == 'd' && nargin == 5 coder.internal.assert(lenniv == lenpercent && ... isInRange(percent,0,100), ... 'Wavelet:FunctionArgVal:Invalid_ArgVal'); elseif o1 == 't' coder.internal.assert(nargin >= 5, ... 'Wavelet:FunctionInput:NotEnough_ArgNum') coder.internal.assert(lenniv == lenpercent && ... isInRange(percent,0), ... 'Wavelet:FunctionArgVal:Invalid_ArgVal'); end % Calculate the following without using COLON: % first = cumsum(l) + 1; % first = first(end-2:-1:1); % ld = l(rmax-1:-1:2); % last = first+ld-1; first = coder.nullcopy(zeros(1,nmax,coder.internal.indexIntClass)); ld = coder.nullcopy(zeros(1,nmax,coder.internal.indexIntClass)); for k = 1:nmax ld(k) = coder.internal.indexInt(l(rmax - k)); end first(nmax) = coder.internal.indexInt(l(1)) + 1; for k = 2:nmax first(nmax - k + 1) = first(nmax - k + 2) + ld(nmax - k + 2); end if o1 == 'd' && nargin == 5 for k = 1:lenniv p = niv(k); pc = percent(k); % cfs = c(first(p):last(p)); cfs = coder.nullcopy(zeros(1,ld(p),'like',c)); for j = 1:ld(p) cfs(j) = c(first(p) - 1 + j); end [~,ind] = sort(abs(cfs)); annul = coder.internal.indexInt(fix(double(ld(p))*pc/100)); % cfs(ind(1:annul)) = 0; for j = 1:annul cfs(ind(j)) = 0; end % c(first(p):last(p)) = cfs; for j = 1:ld(p) c(first(p) - 1 + j) = cfs(j); end end elseif o1 == 't' for k = 1:lenniv p = niv(k); pc = percent(k); % thresholds % cfs = c(first(p):last(p)); cfs = coder.nullcopy(zeros(1,ld(p),'like',c)); for j = 1:ld(p) cfs(j) = c(first(p) - 1 + j); end cfs = wthresh(cfs,sorh,pc); % c(first(p):last(p)) = cfs; for j = 1:ld(p) c(first(p) - 1 + j) = cfs(j); end end else for k = 1:lenniv p = niv(k); % c(first(p):last(p)) = 0; for j = 1:ld(p) c(first(p) - 1 + j) = 0; end end end %-------------------------------------------------------------------------- function p = isInRange(x,low,high) % Return true if all(x >= low) && all(x <= high). If nargin == 2, only % checks that all(x >= low). p = true; if nargin == 2 for k = 1:numel(x) p = p && x(k) >= low; end else for k = 1:numel(x) p = p && x(k) >= low && x(k) <= high; end end %--------------------------------------------------------------------------