Friday, August 17, 2012

MAC implementation in Matlab

Logic in Matlab for MAC protocol is simple. Every node maintains its array for status of every activities such as packets sent, arriaval packet, collision status etc. Every time a random number is thrown to initiate the any activity and keep status of that activity. For details, ALOHA mac protocol has been implemented here as an example which is self-explanatory.

%SIMULATION PARAMETERS
%simulation for pure Aloha protocol
%total simulation time in seconds
runtime=0.2;
%total number of stations
nstation=10;
%transmission throughput of the media in bits per second
netthrou=10e6;
%frame size in bits
fsize=8000;
%avarage frame arrival rate per second for each station
%frate=10;
for frate=1:5:150
%average frame arrival rate per simulation iteration
trh=frate/10000;
%random wait window in number of simulation iterations
wwind=100;
%EVENTS VARIABLES
%transmit active
tr=zeros(1,nstation);
%transmit queue
tq=zeros(1,nstation);
%transmit progress counter
tcnt=zeros(1,nstation);
%collision keeper
colis=zeros(1,10000*runtime);
%collision station index
colin=zeros(1,nstation);
%random wait after collision
rwait=zeros(1,nstation);
%transmit keeper
trkeep=zeros(nstation,10000*runtime);
%packet arrival keeper
pakeep=0;
for i=1:10000*runtime
for j=1:nstation
    %check if the transmitter is active
    if tr(j)==1
        trkeep(j,i)=1;
    end
    %check if the packet has been sent
     if tcnt(j)>0
        tcnt(j)=tcnt(j)-1;
        if tcnt(j)==0
            tr(j)=0;
            %check if the transmission is collision free
            if colin(j)==1
                rwait(j)=ceil(wwind*rand(1,1));
                tq(j)=tq(j)+1;
                colin(j)=0;
            end
        end
    else
        if tq(j)>0 && rwait(j)==0
            tr(j)=1;
            tcnt(j)=ceil(fsize/netthrou*10000);
            tq(j)=tq(j)-1;
        end
    end
    %check if a new packet has arrived
    pa=rand(1,1);
    if pa        pakeep=pakeep+1;
        %if the transmit is ready
        if tr(j)==0 && rwait(j)==0
           tr(j)=1;
           tcnt(j)=ceil(fsize/netthrou*10000);
       else
           tq(j)=tq(j)+1;
       end
    end
    %decreaserandom waiting count
    if rwait(j)>0
        rwait(j)=rwait(j)-1;
    end
end
%check for collision
if sum(tr)>1
        colis(i)=1;
        for k=1:nstation
            if tr(k)==1
                colin(k)=1;
            end
        end
end
end
py1(frate)=(pakeep-sum(tq));
px1(frate)=pakeep;
end
g1=[0:0.01:1.2];
s1=g1.*exp(-2*g1);
figure(1)
plot(py1*8000/runtime,px1*8000/runtime,'x',g1*1e7,s1*1e7,'-')
grid
ylabel('Throughput (bps)')
xlabel('Arrival Rate (bps)')