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

波变换

开发平台:

Matlab

  1. function fBm = wfbm(H,L,varargin)
  2. %WFBM Synthesize fractional Brownian motion.
  3. %   FBM = WFBM(H,L) returns a fractional Brownian
  4. %   motion signal (fBm) of parameter H (0 < H < 1) and
  5. %   length L, following the algorithm proposed by Abry 
  6. %   and Sellan.
  7. %
  8. %   FBM = WFBM(H,L,'plot') generates and plots the fBm
  9. %   signal.
  10. %
  11. %   FBM = WFBM(H,L,NS,W) or FBM = WFBM(H,L,W,NS)
  12. %   returns the fBm using NS reconstruction steps 
  13. %   and the sufficiently regular orthogonal wavelet 
  14. %   which name is W.
  15. %
  16. %   WFBM(H,L,'plot',NS) or WFBM(H,L,'plot',W) or
  17. %   WFBM(H,L,'plot',NS,W) or WFBM(H,L,'plot',W,NS)
  18. %   generates and plots the fBm signal.
  19. %
  20. %   WFBM(H,L) is equivalent to WFBM(H,L,6,'db10').
  21. %   WFBM(H,L,NS) is equivalent to WFBM(H,L,NS,'db10').
  22. %   WFBM(H,L,W) is equivalent to WFBM(H,L,W,6).
  23. %   M. Misiti, Y. Misiti, G. Oppenheim, J.M. Poggi 04-Dec-1996.
  24. %   Last Revision: 01-Jun-2003.
  25. %   Copyright 1995-2004 The MathWorks, Inc.
  26. %   $Revision: 1.1.6.2 $  $Date: 2004/03/15 22:42:43 $ 
  27. % Check arguments.
  28. %-----------------
  29. nbIn = nargin;
  30. if nbIn < 2
  31.   error('Not enough input arguments.');
  32. elseif nbIn > 5
  33.   error('Too many input arguments.');
  34. end
  35. % Internal parameters.
  36. %---------------------
  37. delta  = 10; % sampling period to extract a "good" fBm
  38.     % Caution : for extreme values of H, a greater
  39.     % value of delta can be needed
  40. prec = 1E-4; % precision for the terms of fs1 and gs1 sequences   
  41. % Default values.
  42. %----------------
  43. nblev = 6; wname = 'db10'; plot_flag = 0;
  44. if nargin>2
  45.     if ~ischar(varargin{1})
  46.         nblev = varargin{1};
  47.         if nargin>3
  48.             if ~isequal(varargin{2},'plot')
  49.                 wname = varargin{2};
  50.                 if nargin>4 , plot_flag = 1; end
  51.             else
  52.                 plot_flag = 1;
  53.             end
  54.         end
  55.     elseif isequal(varargin{1},'plot')
  56.         plot_flag = 1;
  57.         if nargin>3
  58.             if ~ischar(varargin{2})
  59.                 nblev = varargin{2};
  60.                 if nargin>4 , wname = varargin{3}; end
  61.             else
  62.                 wname = varargin{2};
  63.                 if nargin>4 , nblev = varargin{3}; end
  64.             end
  65.         end
  66.     else
  67.         wname = varargin{1};
  68.         if nargin>3
  69.             if ~ischar(varargin{2})
  70.                 nblev = varargin{2};
  71.                 if nargin>4 , plot_flag = 1; end
  72.             else
  73.                 if isequal(varargin{2},'plot')
  74.                     plot_flag = 1;
  75.                 end
  76.                 if nargin>4 , nblev = varargin{3}; end
  77.             end
  78.         end
  79.     end
  80. end
  81. % Checking input parameter values.
  82. %---------------------------------
  83. if ~isnumeric(H) | H < 0 | H > 1 | isnan(H)
  84.     error('Fractal index must be a number between 0 and 1');
  85. end
  86. if ~isequal(L,fix(L)) | L < 100 | isnan(L)
  87.     error('Signal length must be an integer greater than 100');
  88. end
  89. if ~isequal(nblev,fix(nblev)) | nblev < 2 | isnan(nblev)
  90.     error('Number of levels must be an integer greater than 1');
  91. end
  92. wtype = wavemngr('type',wname);
  93. if ~isstr(wname) || ~isequal(wtype,1)
  94.     error('Wavelet must be orthogonal');
  95. end
  96. % Compute internal length.
  97. %-------------------------
  98. L = delta*L;
  99. % Intermediate variables.
  100. %------------------------
  101. s = H+1/2;
  102. d = H-1/2;
  103. % Reconstruction filters.
  104. %------------------------
  105. [lo_R,hi_R] = wfilters(wname,'r');
  106. % Fractional coefficients.
  107. %-------------------------
  108. ckalpha = alphacfs(d,prec);
  109. ckbeta = betacfs(d,prec);
  110. % Sequences fs1 and gs1.
  111. %-----------------------
  112. fs1 = conv(ckalpha,lo_R);
  113. fs1 = sqrt(2)*2^(-s)*conv(fs1,[1 1]);
  114. gs1 = conv(ckbeta,hi_R);
  115. gs1 = sqrt(2)*2^(s)*cumsum(gs1);
  116. % Number of starting points.
  117. %---------------------------
  118. nbmax  = max([length(fs1),length(gs1)]);
  119. nbInit = ceil(L/2^(nblev));
  120. len    = nbmax+nbInit;
  121. % Adjust Filters.
  122. %----------------
  123. fs1 = [fs1 , zeros(1,nbmax-length(fs1))];
  124. gs1 = [gs1 , zeros(1,nbmax-length(gs1))];
  125. % Computation of the fBm signal.
  126. %-------------------------------
  127. tmp = conv(randn(1,len+nbmax),ckbeta);
  128. tmp = cumsum(tmp);
  129. CA  = wkeep(tmp,len,'c');
  130. for j=0:nblev-1
  131.     CD  = 2^(j/2)*4^(-s)*2^(-j*s)*randn(1,len);
  132.     len = 2*len-nbmax;
  133.     CA  = idwt(CA,CD,fs1,gs1,len);
  134. end
  135. fBm  = wkeep(CA,L,'c');
  136. fBm  = fBm-fBm(1);
  137. % Final sampling.
  138. %----------------
  139. fBm  = fBm(1:delta:end);
  140. % Optional plot.
  141. %---------------
  142. if plot_flag
  143.     tfBm = 1:length(fBm);
  144.     plot(tfBm,fBm);
  145.     title(['fractional Brownian motion - parameter: ',num2str(H)]);
  146.     set(gca,'Xlim',[min(tfBm) max(tfBm)]);
  147. end
  148. %======================================================%
  149. % INTERNAL FUNCTIONS
  150. %======================================================%
  151. function cka = alphacfs(alpha,prec)
  152. %
  153. % Convergence: -1/2 < alpha <1/2
  154. % Vectorized function
  155. if abs(alpha)<eps , cka = [1 0]; return; end
  156. I   = [1:1000];
  157. cka = gamma(alpha+1)./(gamma(I).*gamma(alpha+2-I));
  158. I   = find(abs(cka)<=prec);
  159. if isempty(I) , cka = [1 0]; return; end
  160. cka = cka(1:I(1));
  161. %------------------------------------------------------%
  162. function ckb = betacfs(alpha,prec)
  163. %
  164. % Convergence: -1/2 < alpha <1/2
  165. % beta(k,d) = (-1)^k cka(k,-d)
  166. % Vectorized function
  167. if abs(alpha)<eps , ckb = [1 0]; return; end
  168. I   = [1:1000];
  169. ckb = gamma(I-1+alpha)./(gamma(alpha)*gamma(I));
  170. I   = find(abs(ckb)<=prec);
  171. if isempty(I) , ckb = [1 0]; return; end
  172. ckb = ckb(1:I(1));
  173. %------------------------------------------------------%
  174. %======================================================%