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

波变换

开发平台:

Matlab

  1. function [pts_Opt,kopt,t_est] = wvarchg(y,K,d)
  2. %WVARCHG Find variance change points.
  3. %   [PTS_OPT,KOPT,T_EST] = WVARCHG(Y,K,D) computes the estimated 
  4. %   change points of the variance of signal Y for j change 
  5. %   points, with j = 0, 1, 2,..., K.
  6. %   Integer D is the minimum delay between two change points. 
  7. %
  8. %   Integer KOPT is the proposed number of change points
  9. %   (0 <= KOPT <= K).
  10. %   The vector PTS_OPT contains the corresponding change points. 
  11. %   For 1 <= k <= K, T_EST(k+1,1:k) contains the k instants
  12. %   of the variance change points and then, 
  13. %   if KOPT > 0, PTS_OPT = T_EST(KOPT+1,1:KOPT) 
  14. %   else PTS_OPT = [].
  15. %
  16. %   K and D must be integers such that 1 < K << length(Y) and
  17. %   1 <= D << length(Y).
  18. %   Signal Y should be zero mean.
  19. %   
  20. %   WVARCHG(Y,K) is equivalent to WVARCHG(Y,K,10).
  21. %   WVARCHG(Y)   is equivalent to WVARCHG(Y,6,10).
  22. %   M. Misiti, Y. Misiti, G. Oppenheim, J.M. Poggi 09-Jun-1999.
  23. %   Last Revision: 07-Jul-2003.
  24. %   Copyright 1995-2004 The MathWorks, Inc.
  25. %   $Revision: 1.6.4.2 $  $Date: 2004/03/15 22:43:38 $
  26. % Set defaults.
  27. if nargin == 2, d = 10; elseif nargin == 1, K = 6; d = 10; end 
  28. % Center y.
  29. y = y(:)-mean(y);
  30. % Increment K.
  31. K = K+1;
  32. % t_est computation using dynamic programming.
  33. N  = length(y);
  34. y2 = y.^2;
  35. matD = repmat(NaN,N,N);
  36. wSAVE = warning;
  37. warnState = warning;
  38. warning('off','all')
  39. for i=1:N-d
  40.     vi = 1:N-i+1;
  41.     dummy = vi.*log(cumsum(y2(i:N)')./vi);
  42.     matD(i,i+d-1:N) = dummy(d:end);
  43. end
  44. warning(warnState);
  45. ind = isinf(-matD); matD(ind) = -matD(ind);
  46. ind = isnan(matD);  matD(ind) = Inf;
  47. I      = zeros(K,N);
  48. I(1,:) = matD(1,:);
  49. t = zeros(K,N);
  50. if K>2,
  51.   for k=2:K-1
  52.      for L=k:N
  53.         [I(k,L),t(k-1,L)] = min(I(k-1,1:L-1) + matD(2:L,L)');
  54.      end
  55.   end
  56. end
  57. t_est = diag(ones(1,K)*N);
  58. [I(K,N),t(K-1,N)] = min(I(K-1,1:N-1) + matD(2:N,N)');
  59. for j=2:K
  60.     for k=j-1:-1:1
  61.       t_est(j,k) = t(k,t_est(j,k+1));
  62.     end
  63. end
  64. % Kopt computation using penalization.
  65. V=I(:,N);
  66. for j=2:K
  67. g2(j) = min((V(1:j-1)-V(j))./(j-1:-1:1)');
  68. end;
  69. k=0;
  70. for j=2:K
  71.     if g2(j) > max(g2(j+1:K))
  72.         k = k+1; G2(k) = g2(j); M(k)=j;
  73.     end
  74. end;
  75. M(k+1) = K; G2(k+1) = g2(K); M = M'; G2 = G2';
  76. G1 = [G2(1:k+1);0]; G2 = [inf;G2]; M = [1;M]-1;
  77. % G1 (resp G2) contains the lower (resp upper) bounds of 
  78. % penalty intervals, M(i) contains the number of change points
  79. % found for a penalty within the interval from G1(i) to G2(i)
  80. % The length of G1 is at least 2.
  81. % When the length of G1 is equal to 2, kopt = 0,
  82. % else we select kopt as M(i) corresponding to the maximum
  83. % penalty interval range.
  84. if length(G1) == 2
  85.     kopt = 0; pts_Opt = [];
  86. else
  87.     [lmax,indopt] = max(G2(2:end-1)-G1(2:end-1));    
  88.     kopt = M(indopt+1)*(lmax>G2(end));
  89.     pts_Opt = t_est(kopt+1,1:kopt);   
  90. end