snpisma.m
上传用户:m_sun_001
上传日期:2014-07-30
资源大小:1115k
文件大小:3k
源码类别:

matlab例程

开发平台:

Matlab

  1. % Program 6-10
  2. % snpisma.m
  3. %
  4. % Slotted non-persistent ISMA System
  5. %
  6. % Input argument
  7. %   now_time  : now time   but, now_time<0 initializes the access terminals
  8. %
  9. % Output argument
  10. %   next_time : next state change time
  11. %
  12. % Programmed by M.Okita
  13. % Checked by H.Harada
  14. %
  15. function [next_time] = snpisma(now_time)
  16. global STANDBY TRANSMIT COLLISION PERMIT                % definition of the global variable
  17. global Srate Plen Dtime
  18. global Mnum Mplen Mstime Mstate
  19. global Tint Rint
  20. global Spnum Splen Tplen Wtime
  21. persistent mgtime mtime slot                            % definition of the static variable
  22. if now_time < 0                                         % initialize access terminals
  23.     rand('state',sum(100*clock));                       % resetting of the random table
  24.     mgtime        = -Tint * log(1-rand(1,Mnum));        % packet generation time
  25.     Mstime        = zeros(1,Mnum) - inf;                % packet transmitting time
  26.     mtime         = mgtime;                             % inhibit sensing time
  27.     Mstate        = zeros(1,Mnum);
  28.     Mplen(1:Mnum) = Plen;                               % packet length
  29.     next_time     = min(mtime);                         % state change time
  30.     slot          = Plen / Srate * Dtime;               % idle slot length
  31.     return
  32. end
  33. idx = find(mtime==now_time & Mstate==TRANSMIT);         % finding of the terminal which transmission succeeded
  34. if length(idx) > 0
  35.     Spnum       = Spnum + 1;
  36.     Splen       = Splen + Mplen(idx);
  37.     Wtime       = Wtime + now_time - mgtime(idx);
  38.     Mstate(idx) = STANDBY;
  39.     mgtime(idx) = now_time - Tint * log(1-rand);        % next packet generation time
  40.     mtime(idx)  = mgtime(idx);
  41. end
  42. idx = find(mtime==now_time & Mstate==COLLISION);        % finding of the terminal which transmission failed
  43. if length(idx) > 0
  44.     Mstate(idx) = STANDBY;
  45.     mtime(idx)  = now_time - Rint * log(1-rand(1,length(idx))); % resending time
  46. end
  47. idx = find(mtime==now_time & Mstate==STANDBY);          % finding of the terminal which inhibit sensing
  48. if length(idx) > 0
  49.     Tplen = Tplen + sum(Mplen(idx));
  50.     for ii=1:length(idx)
  51.         jj = idx(ii);
  52.         if inhibitsense(jj,now_time) == 0               % channel is idle
  53.             Mstate(jj) = PERMIT;
  54.             [temp1 kk] = max(Mstime);                   % calculation of the transmitting start time slot
  55.             if temp1 < 0
  56.                 mtime(jj) = ceil(now_time/slot) * slot;
  57.             else
  58.                 temp1 = temp1 + Mplen(kk) / Srate;
  59.                 temp2 = now_time - temp1;
  60.                 if temp2 < 0
  61.                     mtime(jj) = temp1 + slot;
  62.                 else
  63.                     mtime(jj) = temp1 + ceil(temp2/slot) * slot;
  64.                 end
  65.             end
  66.         else                                            % channel is busy
  67.             mtime(jj) = now_time - Rint * log(1-rand);  % waiting time
  68.         end
  69.     end
  70. end
  71. idx = find(mtime==now_time & Mstate==PERMIT);           % finding the terminal which transmission start
  72. if length(idx) > 0
  73.     Mstate(idx) = TRANSMIT;
  74.     Mstime(idx) = now_time;
  75.     mtime(idx)  = now_time + Mplen(idx) / Srate;        % end time of transmitting
  76. end
  77. next_time = min(mtime);                                 % next state change time
  78. %%%%%%%%%%%%%%%%%%%%%% end of file %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%