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

波变换

开发平台:

Matlab

  1. function varargout = dwtmode(option,varargin)
  2. %DWTMODE Discrete wavelet transform extension mode.
  3. %   DWTMODE sets the signal or image extension mode for
  4. %   discrete wavelet and wavelet packet transforms.
  5. %   The extension modes represent different ways of handling
  6. %   the problem of border distortion in the analysis.
  7. %
  8. %   DWTMODE or DWTMODE('status') display the current mode.
  9. %   ST = DWTMODE or ST = DWTMODE('status') display and
  10. %   return the current mode.
  11. %   ST = DWTMODE('status','nodisp') returns the current mode
  12. %   and does not display the text.
  13. %
  14. %   DWTMODE('sym') or DWTMODE('symh') sets the DWT mode to 
  15. %   symmetric-padding (half-point): boundary value symmetric
  16. %   replication - default mode.
  17. %
  18. %   DWTMODE('symw') sets the DWT mode to symmetric-padding
  19. %   (whole-point): boundary value symmetric replication.
  20. %
  21. %   DWTMODE('asym') or DWTMODE('asymh') sets the DWT mode to 
  22. %   antisymmetric-padding (half-point): boundary value 
  23. %   antisymmetric replication.
  24. %
  25. %   DWTMODE('asymw') sets the DWT mode to antisymmetric-padding
  26. %   (whole-point): boundary value antisymmetric replication.
  27. %
  28. %   DWTMODE('zpd') sets the DWT mode to zero-padding
  29. %
  30. %   DWTMODE('spd') or DWTMODE('sp1') sets the DWT mode 
  31. %      to smooth-padding of order 1 (first derivative
  32. %      interpolation at the edges).
  33. %
  34. %   DWTMODE('sp0') sets the DWT mode to smooth-padding
  35. %      of order 0 (constant extension at the edges). 
  36. %
  37. %   DWTMODE('ppd') sets the DWT mode to periodic-padding
  38. %      (periodic extension at the edges).
  39. %
  40. %   The DWT associated with these eight modes is slightly  
  41. %   redundant. But IDWT ensures a perfect reconstruction for any
  42. %   of the five previous modes whatever is the extension mode 
  43. %   used for DWT.
  44. %
  45. %   DWTMODE('per') sets the DWT mode to periodization.
  46. %        
  47. %   This mode produces the smallest length wavelet decomposition.
  48. %   But, the extension mode used for IDWT must be the same to
  49. %   ensure a perfect reconstruction.
  50. %   Using this mode, DWT and DWT2 produce the same results as 
  51. %   the obsolete functions DWTPER and DWTPER2, respectively.
  52. %
  53. %   All functions and GUI tools that use the DWT (1-D & 2-D) or
  54. %   Wavelet Packet (1-D & 2-D) use the specified DWT extension mode.
  55. %
  56. %   DWTMODE updates a global variable allowing the use of these
  57. %   six signal extensions. The extension mode should only 
  58. %   be changed using this function. Avoid changing the global 
  59. %   variable directly.
  60. %
  61. %   --------------------------------------------------------------
  62. %   The default mode is loaded from the file DWTMODE.DEF
  63. %   if it exists. If not, the file DWTMODE.CFG 
  64. %   (in the "toolbox/wavelet/wavelet" directory) is used.
  65. %   DWTMODE('save',mode) saves "mode" as new default mode
  66. %   in the file DWTMODE.DEF (all the files named DWTMODE.DEF 
  67. %   are deleted before saving).
  68. %   DWTMODE('save') is equivalent to DWTMODE('save',currentMode).
  69. %   --------------------------------------------------------------
  70. %
  71. %   See also DWT, DWT2 ,IDWT, IDWT2, WEXTEND.
  72. %   M. Misiti, Y. Misiti, G. Oppenheim, J.M. Poggi 12-Mar-96.
  73. %   Last Revision: 14-Jul-2003.
  74. %   Copyright 1995-2004 The MathWorks, Inc.
  75. % $Revision: 1.16.4.2 $
  76. % Internal options: 'load', 'save', 'get', 'set', 'clear'
  77.  
  78. global DWT_Attribute
  79. if nargin==0 , option = 'status'; else , option = lower(option); end
  80. switch option
  81.     case 'load'       
  82.         try
  83.            load('dwtmode.def','-mat');
  84.            DWT_Attribute = dwt_default_Attrb;
  85.         catch
  86.            try
  87.              load('dwtmode.cfg','-mat');
  88.              DWT_Attribute = dwt_default_Attrb;
  89.            catch
  90.              DWT_Attribute = ...
  91.                   struct('extMode','sym','shift1D',0,'shift2D',[0,0]);
  92.            end
  93.         end
  94.     case 'save'
  95.         if nargin<2
  96.             if ~isempty(DWT_Attribute)
  97.                 extM = DWT_Attribute.extMode;
  98.             else
  99.                 dwtmode('load');
  100.                 extM = DWT_Attribute.extMode;
  101.             end
  102.         else
  103.             extM = varargin{1};
  104.         end
  105.         if isequal(extM,'zpd')  | ...
  106.            isequal(extM,'sym')  | isequal(extM,'symh')  | ...
  107.            isequal(extM,'asym') | isequal(extM,'asymh') | ...
  108.            isequal(extM,'symw') | isequal(extM,'asymw') | ...
  109.            isequal(extM,'sp0')  | isequal(extM,'spd')   | ...
  110.            isequal(extM,'sp1')  | isequal(extM,'ppd')   | isequal(extM,'per')
  111.             try
  112.               extM = trueExtName(extM);  
  113.               dwt_default_Attrb = ...
  114.                        struct('extMode',extM, 'shift1D',0,'shift2D',[0,0]);
  115.               namefileSave = 'dwtmode.def';
  116.               s = which(namefileSave,'-all');
  117.               try , delete(s{:}); end
  118.               save(namefileSave,'dwt_default_Attrb');
  119.               msg = strvcat(sprintf('Saving DWT Extension in %s !', namefileSave),...
  120.                             sprintf('Default DWT Mode is : %s', extM));
  121.               msgval = 1;
  122.             catch
  123.               msg = ['Save DWT Extension Mode failed !'];
  124.               msgval = 2;
  125.             end
  126.         else
  127.            msg = ['Invalid DWT Extension Mode !'];
  128.            msgval = 2;
  129.         end
  130.         if isequal(get(0,'Userdata'),'testWTBX') , msgval = 3; end
  131.         switch msgval
  132.           case 1 , wwarndlg(msg,'Save DWT Extension Mode','modal');
  133.           case 2 , errordlg(msg,'Save DWT Extension Mode','modal');
  134.           case 3 , sep = repmat('-',1,size(msg,2)+2);
  135.                    disp(strvcat(sep,msg,sep));
  136.         end
  137.     case 'set'
  138.         for k = 1:2:nargin-1
  139.             switch varargin{k}
  140.               case {'extMode','mode'} ,
  141.                   extM = trueExtName(varargin{k+1});
  142.                   DWT_Attribute.extMode = extM;
  143.               case 'shift1D' , DWT_Attribute.shift1D = mod(varargin{k+1},2);
  144.               case 'shift2D' , DWT_Attribute.shift2D = mod(varargin{k+1},2);
  145.               otherwise ,
  146.                 errargt(mfilename,'Invalid field name','msg');
  147.                 error('*');
  148.             end
  149.         end
  150.     case 'get'
  151.         if isempty(DWT_Attribute) , wtbxmngr('ini'); end
  152.         switch nargout
  153.             case 1 , varargout = {DWT_Attribute};
  154.             case 2 , varargout = {...
  155.                         DWT_Attribute.extMode , ...
  156.                         DWT_Attribute.shift1D};
  157.             case 3 , varargout = {...
  158.                         DWT_Attribute.extMode , ...
  159.                         DWT_Attribute.shift1D , ...
  160.                         DWT_Attribute.shift2D};
  161.         end
  162.         
  163.     case 'clear'
  164.         clear global DWT_Attribute
  165.     case {'zpd','sym','symh','symw','asym','asymh','asymw',...
  166.           'sp0','spd','sp1','ppd','per','status'}
  167.         % Check arguments.
  168.         nbIn  = nargin;
  169.         nbOut = nargout;
  170.         if nbIn > 2 ,      error('Too many input arguments.');
  171.         elseif nbOut > 1 , error('Too many output arguments.');
  172.         end
  173.         if isempty(DWT_Attribute) , wtbxmngr('ini'); end
  174.         option = trueExtName(option);
  175.         if ~isequal(option,'status') & ~isequal(DWT_Attribute.extMode,option)
  176.             DWT_Attribute.extMode = option;
  177.             numMsg = 1;
  178.         else
  179.             numMsg = 2;
  180.         end
  181.         if nbIn<2 , dispMessage(numMsg,DWT_Attribute.extMode); end
  182.         if nbOut==1 , varargout{1} = DWT_Attribute.extMode; end
  183.     otherwise
  184.         errargt(mfilename,'Unknown Extension Mode','msg');
  185.         error('*');
  186. end
  187. %----------------------------------------------------------------------------%
  188. % Internal Function(s)
  189. %----------------------------------------------------------------------------%
  190. function dispMessage(num,mode)
  191. if num<2
  192.     disp(' ');
  193.     disp('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!');
  194.     disp('!  WARNING: Change DWT Extension Mode  !');
  195.     disp('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!');
  196. end
  197. % Display Extension Mode.
  198. msg = ['DWT Extension Mode: '];
  199. switch mode
  200.     case 'zpd' ,            msg = [msg 'Zero Padding'];
  201.     case {'sym','symh'} ,   msg = [msg 'Symmetrization (half-point)'];
  202.     case 'symw' ,           msg = [msg 'Symmetrization (whole-point)'];
  203.     case {'asym','asymh'} , msg = [msg 'Antisymmetrization (half-point)'];
  204.     case 'asymw' ,          msg = [msg 'Antisymmetrization (whole-point)'];
  205.     case 'sp0' ,            msg = [msg 'Smooth Padding of order 0'];
  206.     case {'spd','sp1'} ,    msg = [msg 'Smooth Padding of order 1'];
  207.     case 'ppd' ,            msg = [msg 'Periodized Padding'];    
  208.     case 'per' ,            msg = [msg 'Periodization'];
  209. end
  210. n = length(msg)+8;
  211. c = '*';
  212. s = c(ones(1,n));
  213. msg = strvcat(' ',s,[c c '  ' msg '  ' c c],s,' ');
  214. disp(msg);
  215. %----------------------------------------------------------------------------%
  216. function output = trueExtName(input)
  217. switch input
  218.     case {'sp1','spd'}  , output = 'spd';
  219.     case {'sym','symh'} , output = 'sym';
  220.     case {'asym','asymh'} , output = 'asym';
  221.     otherwise , output = input;
  222. end
  223. %----------------------------------------------------------------------------%