wthcoef.m
上传用户:haiyisale
上传日期:2013-01-09
资源大小:3246k
文件大小:3k
源码类别:

波变换

开发平台:

Matlab

  1. function c = wthcoef(o,c,l,niv,percent,sorh)
  2. %WTHCOEF Wavelet coefficient thresholding 1-D.
  3. %   NC = WTHCOEF('d',C,L,N,P) returns coefficients obtained
  4. %   from the wavelet decomposition structure [C,L] (see WAVEDEC),
  5. %   by rate compression defined in vectors N and P. 
  6. %   N contains the detail levels to be compressed and P the
  7. %   corresponding percentages of lower coefficients 
  8. %   to be set to zero. N and P must be of same length.
  9. %   Vector N must be such that 1 <= N(i) <= length(L)-2.
  10. %
  11. %   NC = WTHCOEF('d',C,L,N) returns coefficients obtained
  12. %   from [C,L] by setting all the coefficients of detail
  13. %   levels defined in N to zero.
  14. %
  15. %   NC = WTHCOEF('a',C,L) returns coefficients obtained by
  16. %   setting approximation coefficients to zero.
  17. %
  18. %   NC = WTHCOEF('t',C,L,N,T,SORH) returns coefficients obtained
  19. %   from the wavelet decomposition structure [C,L] by soft
  20. %   (if SORH = 's') or hard (if SORH = 'h') thresholding
  21. %   (see WTHRESH) defined in vectors N and T. N contains the
  22. %   detail levels to be thresholded and T the corresponding
  23. %   thresholds. N and T must be of same length.
  24. %
  25. %   [NC,L] is the modified wavelet decomposition structure.
  26. %
  27. %   See also WAVEDEC, WTHRESH.
  28. %   M. Misiti, Y. Misiti, G. Oppenheim, J.M. Poggi 12-Mar-96.
  29. %   Last Revision: 14-May-2003.
  30. %   Copyright 1995-2004 The MathWorks, Inc.
  31. % $Revision: 1.11.4.2 $
  32. % Check arguments.
  33. nbIn = nargin;
  34. if nbIn < 3
  35.   error('Not enough input arguments.');
  36. end
  37. o = lower(o(1));
  38. if o=='a'
  39.     if nbIn>3 , error('Too many input arguments.'); end
  40.     c(1:l(1)) = 0;      
  41.     return; 
  42. end
  43. rmax = length(l);
  44. nmax = rmax-2;
  45. if find((niv < 1) | (niv > nmax) | (niv ~= fix(niv)))
  46.     error('Invalid level(s) number(s).')
  47. end
  48. if o=='d' & nbIn==5
  49.     errLen = (length(niv) ~= length(percent));
  50.     if errLen | ~isempty(find((percent<0) | (percent>100)))
  51.         error('Invalid argument value.')
  52.     end
  53. elseif o=='t'
  54.     errLen = (length(niv) ~= length(percent));
  55.     if errLen | ~isempty(find(percent<0))
  56.         error('Invalid argument value.')
  57.     end
  58. end
  59. first = cumsum(l)+1;
  60. first = first(end-2:-1:1);
  61. ld    = l(rmax-1:-1:2);
  62. last  = first+ld-1;
  63. if o=='d' & nbIn==5
  64.     for k = 1:length(niv)
  65.         p  = niv(k);
  66.         pc = percent(k);
  67.         cfs = c(first(p):last(p));
  68.         [x,ind] = sort(abs(cfs));
  69.         annul = fix(ld(p)*pc/100);
  70.         cfs(ind(1:annul))   = 0;
  71.         c(first(p):last(p)) = cfs;
  72.     end
  73. elseif o=='t'
  74.     for k = 1:length(niv)
  75.         p   = niv(k);
  76.         pc  = percent(k);        % thresholds
  77.         cfs = c(first(p):last(p));
  78.         cfs = wthresh(cfs,sorh,pc);
  79.         c(first(p):last(p)) = cfs;
  80.     end
  81. else
  82.     for p = niv
  83.         c(first(p):last(p)) = 0;
  84.     end
  85. end