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

波变换

开发平台:

Matlab

  1. function [xc,cxc,lxc,perf0,perfl2] = wdencmp(o,varargin)
  2. %WDENCMP De-noising or compression using wavelets.
  3. %   WDENCMP performs a de-noising or compression process
  4. %   of a signal or an image using wavelets.
  5. %
  6. %   [XC,CXC,LXC,PERF0,PERFL2] = 
  7. %   WDENCMP('gbl',X,'wname',N,THR,SORH,KEEPAPP)
  8. %   returns a de-noised or compressed version XC of input
  9. %   signal X (1-D or 2-D) obtained by wavelet coefficients
  10. %   thresholding using global positive threshold THR.
  11. %   Additional output arguments [CXC,LXC] are the
  12. %   wavelet decomposition structure of XC, 
  13. %   PERFL2 and PERF0 are L^2 recovery and compression
  14. %   scores in percentages.
  15. %   PERFL2 = 100*(vector-norm of CXC/vector-norm of C)^2
  16. %   where [C,L] denotes the wavelet decomposition structure
  17. %   of X.
  18. %   Wavelet decomposition is performed at level N and
  19. %   'wname' is a string containing the wavelet name.
  20. %   SORH ('s' or 'h') is for soft or hard thresholding
  21. %   (see WTHRESH for more details).
  22. %   If KEEPAPP = 1, approximation coefficients cannot be
  23. %   thresholded, otherwise it is possible.
  24. %
  25. %   WDENCMP('gbl',C,L,W,N,THR,SORH,KEEPAPP)
  26. %   has the same output arguments, using the same
  27. %   options as above, but obtained directly from the
  28. %   input wavelet decomposition structure [C,L] of the
  29. %   signal to be de-noised or compressed, at level N,
  30. %   using  'wname' wavelet.
  31. %
  32. %   For 1-D case and 'lvd' option:
  33. %   WDENCMP('lvd',X, 'wname',N,THR,SORH) or
  34. %   WDENCMP('lvd',C,L, 'wname',N,THR,SORH)
  35. %   have the same output arguments, using the same
  36. %   options as above, but allowing level-dependent
  37. %   thresholds contained in vector THR (THR must be of
  38. %   length N). In addition, the approximation is kept.
  39. %
  40. %   For 2-D case and 'lvd' option:
  41. %   WDENCMP('lvd',X, 'wname',N,THR,SORH) or
  42. %   WDENCMP('lvd',C,L, 'wname',N,THR,SORH)
  43. %   THR must be a matrix 3 by N containing the level
  44. %   dependent thresholds in the three orientations
  45. %   horizontal, diagonal and vertical.
  46. %
  47. %   See also DDENCMP, WAVEDEC, WAVEDEC2, WDEN, WPDENCMP, WTHRESH.
  48. %   M. Misiti, Y. Misiti, G. Oppenheim, J.M. Poggi 12-Mar-96.
  49. %   Last Revision: 14-May-2003.
  50. %   Copyright 1995-2004 The MathWorks, Inc.
  51. % $Revision: 1.11.4.2 $
  52. % Check arguments and set problem dimension.
  53. dim = 1;        % initialize dimension to 1D.
  54. nbIn  = nargin;
  55. nbOut = nargout;
  56. switch o
  57.     case 'gbl' , minIn = 7; maxIn = 8; 
  58.     case 'lvd' , minIn = 6; maxIn = 7;
  59.     otherwise  , error('Invalid argument value.')
  60. end
  61. if nbIn < minIn
  62.     error('Not enough input arguments.');
  63. elseif nbIn > maxIn
  64.     error('Too many input arguments.');
  65. end
  66. okOut = [0:1 3:5];
  67. if ~any(okOut==nbOut)
  68.     error('Invalid number of output arguments.');
  69. end
  70. if nbIn == minIn
  71.     x = varargin{1}; indarg = 2;
  72.     if min(size(x))~=1, dim = 2; end
  73. else
  74.     c = varargin{1}; l = varargin{2}; indarg = 3;
  75.     if min(size(l))~=1, dim = 2; end
  76. end
  77. % Get Inputs
  78. w    = varargin{indarg};
  79. n    = varargin{indarg+1};
  80. thr  = varargin{indarg+2};
  81. sorh = varargin{indarg+3};
  82. if (o=='gbl') , keepapp = varargin{indarg+4}; end
  83. if errargt(mfilename,w,'str'), error('*'), end
  84. if errargt(mfilename,n,'int'), error('*'), end
  85. if errargt(mfilename,thr,'re0'), error('*'), end
  86. if errargt(mfilename,sorh,'str'), error('*'), end
  87. % Wavelet decomposition of x (if not given).
  88. if (o=='gbl' & nbIn==7)  | (o=='lvd' & nbIn==6)
  89.     if dim == 1, [c,l] = wavedec(x,n,w);
  90.     else,        [c,l] = wavedec2(x,n,w);
  91.     end
  92. end
  93. % Wavelet coefficients thresholding.
  94. if o=='gbl'
  95.     if keepapp
  96.         % keep approximation.
  97.         cxc = c;
  98.         if dim == 1, inddet = l(1)+1:length(c);
  99.         else, inddet = prod(l(1,:))+1:length(c); end
  100.         % threshold detail coefficients.
  101.         cxc(inddet) = wthresh(c(inddet),sorh,thr);
  102.     else 
  103.         % threshold all coefficients.
  104.         cxc = wthresh(c,sorh,thr);
  105.     end
  106. else
  107.     if dim == 1, cxc = wthcoef('t',c,l,1:n,thr,sorh);
  108.     else
  109.         cxc = wthcoef2('h',c,l,1:n,thr(1,:),sorh);
  110.         cxc = wthcoef2('d',cxc,l,1:n,thr(2,:),sorh);
  111.         cxc = wthcoef2('v',cxc,l,1:n,thr(3,:),sorh);
  112.     end
  113. end
  114. lxc = l;
  115. % Wavelet reconstruction of xd.
  116. if dim == 1,xc = waverec(cxc,lxc,w);
  117. else        xc = waverec2(cxc,lxc,w);
  118. end
  119. if nbOut<4 , return; end
  120. % Compute compression score.
  121. perf0 = 100*(length(find(cxc==0))/length(cxc));
  122. if nbOut<5 , return; end
  123. % Compute L^2 recovery score.
  124. nc = norm(c);
  125. if nc<eps
  126.     perfl2 = 100;
  127. else
  128.     perfl2 = 100*((norm(cxc)/nc)^2);
  129. end