%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Este script calcula a probabilidade de erro com um código de repetição
% com n = 3 ou 5 repetições.
% O valor calculado teoricamente é comparado com resultados de simulação.
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% André Noll Barreto, Universidade de Brasília, 2013
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Calcular a prob de erro com código de repetição em canal BSC
p = 10.^[-5:.1:-1]; % probabilidade de erro do canal BSC

n = 3;
Pe3 = 0;
for k = ceil(n/2) : n
    Pe3 = Pe3 + combinations(n, k) * p.^k .* (1-p).^(n-k);
end

n = 5;
Pe5 = 0;
for k = ceil(n/2) : n
    Pe5 = Pe5 + combinations(n, k) * p.^k .* (1-p).^(n-k);
end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%simular a prob de erro co código de repetição

nbits = 100000; % número de bits simulados
n= 5; % número de repetições de cada bit
psim = 10.^(-5:.2:-1); % probabilidades de erro de bit simuladas


bits = randi([0,1],[1,nbits]);

codeword = repmat(bits,n,1);
codeword = reshape(codeword, 1, n * nbits);

psim = 10.^(-5:.2:-1);

np = length(psim);
Pe3sim = zeros(1,np);

for k = 1:np
    errors = rand(1,n* nbits) < psim(k);
    received = mod(codeword + errors, 2);  
    
    received = reshape(received, n, nbits);
    
    estimated = sum(received) > n/2;
    
    nerrors = sum(estimated ~= bits);
    
    Pe3sim(k) = nerrors/ nbits;
end


title ('Probabilidade de erro com códigos de repetição')
loglog(p, p, '-', p, Pe3,'-', p, Pe5,'-', psim, Pe3sim, '*' )
legend('n = 1', 'n = 3', 'n = 5', 'n=3 (sim)')
xlabel('probabilidade de erro de bit')
ylabel('probabilidade de erro após código')



