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

波变换

开发平台:

Matlab

  1. function ent = wentropy(x,t_ent,in3)
  2. %WENTROPY Entropy (wavelet packet).
  3. %   E = WENTROPY(X,T,P) returns the entropy E of the
  4. %   vector or matrix X. 
  5. %   In both cases, output E is a real number.
  6. %
  7. %   T is a string containing the type of entropy:
  8. %     T = 'shannon', 'threshold', 'norm',
  9. %         'log energy' (or 'logenergy'), 'sure', 'user'.
  10. %   or
  11. %     T = FunName (which is any other string except those
  12. %         previous Entropy Type Name listed above).
  13. %         FunName is the M-file name of your own
  14. %         entropy function. 
  15. %
  16. %   P is an optional parameter depending on the value of T:
  17. %     If T = 'shannon' or 'log energy', P is not used.
  18. %     If T = 'threshold' or 'sure', P is the threshold
  19. %     and must be a positive number.
  20. %     If T = 'norm', P is the power and must be such that 1 <= P.
  21. %     If T = 'user', P is a string containing the M-file name
  22. %     of your own entropy function, with a single input X.
  23. %     If T = FunName, P is an optional parameter with no constraints.     
  24. %
  25. %   E = WENTROPY(X,T) is equivalent to E = WENTROPY(X,T,0).
  26. %   M. Misiti, Y. Misiti, G. Oppenheim, J.M. Poggi 12-Mar-96.
  27. %   Last Revision: 13-may-2003.
  28. %   Copyright 1995-2004 The MathWorks, Inc.
  29. %   $Revision: 1.13.4.2 $
  30. % Check arguments.
  31. nbIn = nargin;
  32. if nbIn < 2
  33.   error('Not enough input arguments.');
  34. elseif nbIn > 3
  35.   error('Too many input arguments.');
  36. end
  37. x = x(:);
  38. switch t_ent
  39.     case 'shannon'       % in3 not used.
  40.       x = x(find(x)).^2;
  41.       ent = -sum(x.*log(eps+x));
  42.     case 'threshold'     % in3 is the threshold.
  43.       if nargin==2 | isempty(in3) | ischar(in3) | in3<0 , errStop; end
  44.       x = abs(x);
  45.       ent = sum(x > in3);
  46.     case 'sure'          % in3 is the threshold.
  47.       if nargin==2 | isempty(in3) | ischar(in3) | in3<0 , errStop; end
  48.       n = length(x);
  49.       x2 = x.^2; t2 = in3.^2;
  50.       xgt =  sum(x2 > t2); xlt = n - xgt;
  51.       ent = n - (2*xlt) + (t2*xgt) + sum(x2.*(x2 <= t2));
  52.     case 'norm'          % in3 = p , ent = (lp_norm)^p.
  53.       if nargin==2 | isempty(in3) | ischar(in3) | in3<1 , errStop; end
  54.       x = abs(x);
  55.       ent = sum(x.^in3);
  56.     case {'energy','log energy','logenergy'}     % in3 not used.
  57.       x = x(find(x)).^2;
  58.       ent = sum(log(x));
  59.     case 'user'  % in3 = '<function>' , user entropy.
  60.       if nargin==2 | isempty(in3) | ~ischar(in3) , errStop; end
  61.       ent = feval(in3,x);
  62.     otherwise
  63.       %-----------------------------------------------------------%  
  64.       % Bug & Generalization: temporary Patch (M.M. 20 June 2001) %
  65.       % For user defined entropy.                                 %
  66.       %-----------------------------------------------------------%        
  67.       try
  68.         k = find(t_ent=='&');
  69.         entFunct = t_ent(k+1:end);
  70.         ent = feval(entFunct,x);
  71.       catch
  72.           try
  73.               if nargin==2 , 
  74.                 ent = feval(t_ent,x);
  75.               else
  76.                 ent = feval(t_ent,x,in3);
  77.               end
  78.           catch
  79.             errStop;
  80.         end
  81.       %-----------------------------------------------------------%          
  82.       end
  83. end
  84. prec = 1.0E-10;
  85. if abs(ent)<prec , ent = 0; end
  86. % Internal Function
  87. function errStop
  88.   errargt(mfilename,'invalid argument value','msg');
  89.   error('*');