dspblkrandsrc2.m
上传用户:loeagle
上传日期:2013-03-02
资源大小:1236k
文件大小:6k
源码类别:

通讯编程文档

开发平台:

Matlab

  1. function varargout = dspblkrandsrc2(action)
  2. % DSPBLKRANDSRC2 DSP Blockset Random Source Generator block helper function.
  3. % Copyright 1995-2001 The MathWorks, Inc. 
  4. % $Revision: 1.3 $ $Date: 2001/04/05 15:48:32 $
  5. blk = gcbh;
  6. if nargin==0, action = 'dynamic'; end
  7. RepMode = get_param(blk,'RepMode');
  8. switch action
  9.  case 'icon'
  10.   % Plotting of icon:
  11.   
  12.   % Random data:
  13.   x = (0:.1:.9)';
  14.   y = [0.5645
  15.        0.3024
  16.        0.7520
  17.        0.4752
  18.        0.1684
  19.        0.5462
  20.        0.5798
  21.        0.3904
  22.        0.8463
  23.        0.1681];
  24.   
  25.   % Axes:
  26.   x=[x;NaN;0; 0;NaN;0;1];
  27.   y=[y;NaN;1;-1;NaN;0;0];
  28.   
  29.   varargout(1:2) = {x,y};
  30.  
  31.  case 'seed'
  32.   % Compute (if necessary) seed value
  33.   
  34.   % There is a structure in Random Source's UserData parameter
  35.   % that has two fields, Seed and SeedFlag.  They are used as:
  36.   % Seed:
  37.   %       This is (a string representation) of the seed value
  38.   %       that is actually passed into the S-fcn.  This value
  39.   %       is only equal to the seed in the dialog if the 
  40.   %       repeatabilit mode is 'Specify seed'.  Its default
  41.   %       value is '-1'.
  42.   % SeedFlag: 
  43.   %       This flag can have three values: (1) 'SaveSeed' if 
  44.   %       the repeatability mode is 'Repeatable' and a seed
  45.   %       has already been calculated, (2) 'DoNotSaveSeed' if
  46.   %       the repeatability mode is 'Specify seed' or 'Not
  47.   %       repeatable' (and thus the seed field in the user 
  48.   %       data is not the 'official' seed - it's either truly
  49.   %       not saved, or in the dialog seed) and (3) 'Unset'
  50.   %       for either a new block or an old block that was
  51.   %       saved before this functionality change.  The
  52.   %       default value is 'Unset'
  53.   
  54.   ud = get_param(blk,'userdata');
  55.   ud_old = ud;
  56.   
  57.   % Currently, if UserData = [] and UserDataPersistent = 'off', 
  58.   % then this is an old block -  that is, one that was saved 
  59.   % before this functionality change.
  60.   % It seems that for now the userdata is NOT copied into old
  61.   % blocks from the library block.  Assuming this doesn't
  62.   % change, detecting an 'old block' is trivial - just check
  63.   % either field
  64.   %
  65.   % If it DOES change, then the following logic will be needed
  66.   % to detect old blocks:
  67.   % Change the default value of Seed in the library model file to
  68.   % '-1', and use the logic below:
  69.   % if (strcmp(ud.SeedFlag, 'Unset'))
  70.   %   if (strcmp(get_param(blk,'Seed'),'-1'))
  71.   %     % This is the library block
  72.   %     ud.Seed = '1';
  73.   %     ud.SeedFlag = 'DoNotSaveSeed'; 
  74.   %     set_param(blk,'Seed','1');
  75.   %   else
  76.   %     % This is an 'old' block
  77.   %     ud.Seed = get_param(blk,'Seed');
  78.   %     ud.SeedFlag = 'DoNotSaveSeed'; 
  79.   %     set_param(blk,'RepMode','Specify seed');
  80.   %   end
  81.   % end
  82.   %
  83.   % Existing R12 models need this block of code to work properly
  84.   % for R12.1 and possible future releases
  85.   %
  86.   if isempty(ud),
  87.     % This is an old block (before R12.1)
  88.     ud.Seed = get_param(blk,'Seed');
  89.     ud.SeedFlag = 'DoNotSaveSeed';
  90.     
  91.     % Need to reset the RepMode
  92.     % (note: this is intentially done
  93.     %  and without the user necessarily
  94.     %  being aware of it...)
  95.     % Note: using dspsafe_set_param below
  96.     % because sometimes the set_param fails
  97.     % and we don't want this function to 
  98.     % end here (some tests will fail when
  99.     % they shouldn't)
  100.     dspsafe_set_param(blk,'RepMode','Specify seed');
  101.   else
  102.     % This is a new block (R12.1 or later)
  103.     
  104.     % Create an initial random seed when necessary
  105.     % return current seed otherwise
  106.     
  107.     if (strcmp(RepMode,'Specify seed'))
  108.       % Use seed specified by user
  109.       ud.Seed = get_param(blk,'Seed');
  110.       ud.SeedFlag = 'DoNotSaveSeed'; 
  111.     
  112.     elseif (strcmp(RepMode,'Repeatable'))
  113.       % Only need to change seed if this is a change in mode
  114.       % That is, if we were already in Repeatable mode,
  115.       % do not recalculate seed.  
  116.       if strcmp(ud.SeedFlag,'DoNotSaveSeed'),
  117.         % Just changed to Repeatable mode
  118.         seedVal = floor(rand(1)*100000);
  119.         ud.Seed = num2str(seedVal);
  120.         ud.SeedFlag = 'SaveSeed';
  121.       end
  122.     
  123.     else 
  124.       % Not repeatable: recalculate seed
  125.       seedVal = floor(rand(1)*100000);
  126.       ud.Seed = num2str(seedVal);
  127.       ud.SeedFlag = 'DoNotSaveSeed';
  128.     end
  129.   end
  130.   
  131.   % update the user data if it changed
  132.   if ~isequal(ud,ud_old),
  133.     % Using dspsafe_set_param for same reasons as
  134.     % above
  135.     dspsafe_set_param(blk,'userdata',ud);
  136.   end
  137.   
  138.   % set the return arg to the seed value
  139.   varargout = {ud.Seed};
  140.   
  141.  case 'dynamic'
  142.   % Adjust mask enables
  143.   SrcType = get_param(blk,'SrcType');
  144.   InheritMode = strcmp(get_param(blk,'Inherit'),'on');
  145.   SampMode = get_param(blk,'SampMode');
  146.   enables = get_param(blk,'maskenables');
  147.   oldenables=enables;
  148.   
  149.   % Check for distribution change
  150.   if strcmp(SrcType,'Gaussian')
  151.     enables(4:5) = {'on'};
  152.     enables(2:3) = {'off'};
  153.     enables(6)   = {'on'};
  154.   else
  155.     enables(4:5) = {'off'};
  156.     enables(2:3) = {'on'};
  157.     enables(6)   = {'on'};
  158.   end
  159.   
  160.   % Check for repeatability mode change
  161.   if strcmp(RepMode,'Specify seed')
  162.     enables(7) = {'on'};
  163.   else
  164.     enables(7) = {'off'};
  165.   end
  166.   
  167.   % Check for inherit mode change
  168.   if InheritMode,
  169.     enables(9:12)  = {'off'};
  170.   elseif (~InheritMode & strcmp(SampMode,'Discrete'))
  171.     enables(9:12)  = {'on'};
  172.   elseif (~InheritMode & strcmp(SampMode,'Continuous'))
  173.     enables(9)    = {'on'};
  174.     enables(10:11) = {'off'};
  175.     enables(12)   = {'on'};
  176.   end
  177.   % Only reset the enables if they have changed
  178.   if (~isequal(enables,oldenables))
  179.     set_param(blk,'maskenables',enables);
  180.   end
  181.   
  182.  otherwise
  183.   error('dspblkrandsrc2: unhandled action'); 
  184. end
  185. % [EOF] dspblkrandsrc2.m