%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Este script calcula a probabilidade de erro em um enlace com repetidores
% é mostrada a probabilidade exata e uma aproximação 
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% André Noll Barreto, Universidade de Brasília, 2013
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

n_links = 10; % número de enlaces

p = 10.^ (-5:.1:0); % probabilidades de erro consideradas
p_sim = 10.^(-5:.2:0); % probabilidade de erro para simulação
nbits = 10000; % bits para simulação


p_ac = (1 - p).^n_links;
for k = 2: 2: n_links
    p_ac = p_ac + combinations(n_links, k) * p.^k .* (1-p).^(n_links-k);
end

pe = 1 - p_ac;
pe_approx = n_links * p;

% simulação
pe_sim = zeros( size(p_sim));
for index = 1: length(p_sim)
    error = zeros(1, nbits);
    for link = 1: n_links
        error = xor( error, ( rand( 1, nbits ) < p_sim( index ) ) );
    end
    
    pe_sim(index) = sum( error ) / nbits;
end


loglog(p, pe, 'r', p, pe_approx,'b', p_sim, pe_sim, '*g')
title ('Probabilidade de Erro com Repetidores');
legend('exata', 'approximada', 'simulação');

xlabel('erro em 1 enlace')
ylabel('erro em todos os enlaces')