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

波变换

开发平台:

Matlab

  1. function [x,xn] = wnoise(num,n,sqrtSNR,init)
  2. %WNOISE Generate noisy wavelet test data.
  3. %   X = WNOISE(FUN,N) returns values of the test function 
  4. %   given by FUN, on a 2^N sample of [0,1].
  5. %
  6. %   [X,XN] = WNOISE(FUN,N,SQRT_SNR) returns the previous vector X
  7. %   rescaled such that std(x) = SQRT_SNR. The returned vector XN
  8. %   contains the same test vector X corrupted by an
  9. %   additive Gaussian white noise N(0,1). Then XN has a
  10. %   signal-to-noise ratio of (SQRT_SNR^2).
  11. %
  12. %   [X,XN] = WNOISE(FUN,N,SQRT_SNR,INIT) returns previous
  13. %   vectors X and XN, but the generator seed is set to INIT
  14. %   value. 
  15. %
  16. %   The six functions below are based on: D. Donoho and I. Johnstone 
  17. %   in "Adapting to Unknown Smoothness via Wavelet Shrinkage"
  18. %   Preprint Stanford, January 93, p 27-28.
  19. %   FUN = 1 or FUN = 'blocks'     
  20. %   FUN = 2 or FUN = 'bumps'      
  21. %   FUN = 3 or FUN = 'heavy sine'   
  22. %   FUN = 4 or FUN = 'doppler'   
  23. %   FUN = 5 or FUN = 'quadchirp'   
  24. %   FUN = 6 or FUN = 'mishmash'   
  25. %   M. Misiti, Y. Misiti, G. Oppenheim, J.M. Poggi 12-Mar-96.
  26. %   Last Revision: 14-May-2003.
  27. %   Copyright 1995-2004 The MathWorks, Inc.
  28. % $Revision: 1.12.4.2 $
  29. % Check arguments.
  30. nbIn  = nargin;
  31. nbOut = nargout;
  32. if nbIn < 2
  33.   error('Not enough input arguments.');
  34. elseif nbIn > 4
  35.   error('Too many input arguments.');
  36. elseif nbIn==2
  37.   if nargout>1 , error('Too many output arguments.'); end
  38. end
  39. t = [0.1  0.13  0.15  0.23  0.25  0.40  0.44  0.65  0.76  0.78  0.81];
  40. h = [4      -5     3    -4     5  -4.2   2.1   4.3  -3.1   5.1  -4.2];
  41. len = 2^n;
  42. switch num   
  43.     case {1,'blocks'}       % blocks.
  44.         tt = linspace(0,1,len);  x = zeros(1,len);
  45.         for j=1:11
  46.             x = x + ( h(j)*(1+sign(tt-t(j)))/2 );
  47.         end
  48.     case {2,'bumps'}        % bumps.
  49.         h  = abs(h);     
  50.         w  = 0.01*[0.5 0.5 0.6 1 1 3 1 1 0.5 0.8 0.5];
  51.         tt = linspace(0,1,len);  x = zeros(1,len);
  52.         for j=1:11
  53.             x = x + ( h(j) ./ (1+ ((tt-t(j))/w(j)).^4));
  54.         end
  55.     case {3,'heavy sine'}   % heavy sine.
  56.         x = linspace(0,1,len);   
  57.         x = 4*sin(4*pi*x) - sign(x-0.3) - sign(0.72-x);
  58.     case {4,'doppler'}      % doppler.
  59.         x = linspace(0,1,len);   
  60.         epsil = 0.05;
  61.         x = sqrt(x.*(1-x)) .* sin( 2*pi*(1+epsil) ./ (x+epsil) );
  62.     case {5,'quadchirp'}    % quadchirp.
  63.         t = linspace(0,1,len);   
  64.         x = sin( (pi/3) * t .* (len * t.^2) );
  65.     case {6,'mishmash'}     % mishmash.
  66.         t = linspace(0,1,len);
  67.         x = sin( (pi/3) * t .* (len * t.^2) );
  68.         x = x + sin( pi * (len * 0.6902) * t );
  69.         x = x + sin( pi * t .* (len * 0.125 * t) );
  70.     otherwise
  71.         errargt(mfilename,'invalid argument value','msg');
  72.         error('*')
  73. end    
  74.    
  75. if nargin>=3 
  76.     x = (x * (sqrtSNR/std(x)));
  77.     if nargin==4, randn('seed',init); end
  78.     wn = randn(1,len);
  79.     xn = x + wn;
  80. end