spm_dwtmtx.m 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. function H = spm_dwtmtx(N,K,T)
  2. % Create basis functions for Discrete (Haar) Wavelet Transform
  3. % FORMAT H = spm_dwtmtx(N,K,T)
  4. %
  5. % N - dimension
  6. % K - order: number of basis functions = N/K
  7. %
  8. % T - option flag for thinning eccentric wavelets [default: false]
  9. %__________________________________________________________________________
  10. %
  11. % spm_dwtmtx creates a matrix for the first few basis functions of a one
  12. % dimensional Haar Discrete Wavelet transform.
  13. %__________________________________________________________________________
  14. % Copyright (C) 2011-2015 Wellcome Trust Centre for Neuroimaging
  15. % Karl Friston
  16. % $Id: spm_dwtmtx.m 6416 2015-04-21 15:34:10Z guillaume $
  17. % Create basis set
  18. %==========================================================================
  19. try, T; catch, T = false; end
  20. K = max(K,1);
  21. H = ones(N,1);
  22. I = 1;
  23. while ~isempty(I)
  24. % Find non-zero elements and create new bases
  25. %----------------------------------------------------------------------
  26. j = find(H(:,I(1)) > 0);
  27. k = find(H(:,I(1)) < 0);
  28. nj = length(j);
  29. nk = length(k);
  30. hj = sparse(1:fix(nj/2),1,2,nj,1) - 1;
  31. hk = sparse(1:fix(nk/2),1,2,nk,1) - 1;
  32. % Add new columns if there are enough elements
  33. %----------------------------------------------------------------------
  34. if nj > K
  35. H(j,end + 1) = hj;
  36. I(end + 1) = size(H,2);
  37. end
  38. if nk > K
  39. H(k,end + 1) = hk;
  40. I(end + 1) = size(H,2);
  41. end
  42. % This column has now been expanded
  43. %----------------------------------------------------------------------
  44. I(1) = [];
  45. end
  46. % Thin eccentric basis functions
  47. %==========================================================================
  48. if T
  49. % indices of column (bases) to retain
  50. %----------------------------------------------------------------------
  51. j = logical(H(:,1));
  52. for i = 1:length(j);
  53. k = find(H(:,i));
  54. l = length(k);
  55. if any(k < (N/2 - 2*l)) || any(k > (N/2 + 2*l))
  56. j(i) = 0;
  57. end
  58. end
  59. % thin
  60. %----------------------------------------------------------------------
  61. H = H(:,j);
  62. end