% STIMA DI PROBABILITA' DI ERRORE PER SISTEMA BINARIO
%-----------------------------------------------------------
%
%                        y = x + n
%
% n = rumore gaussiano a media nulla di potenza No
%
%
% Codifica   =>   x  = +A (-A) quando TX = 0 (1)
%
%              
% Decodifica =>   RX =  0 (1)  quando y>0  (y<0) 
%
% Rapporto segnale Rumore = SNR = A^2/No
%------------------------------------------------------------
%
% Modificare il programma per rendere ugulamente attendibile
% la stima della BER ad alto e basso SNR
%
% Confrontare con grafici ottenuti con
% 'ChernoffBound.m'
%-------------------------------------------------------------

clear all
figure

A     = 1 ;      % Ampiezza Massima Segnale TX
Nbits = 100000 ; % Numero di Prove (Bits) con cui si realizza la stima

SNRdB = [ 0 :2 :   10 ];          % Rapporto Segnale Rumore in dB

for ind = 1 : length( SNRdB ) ;   % Ciclo per ogni valore del SNR
   
   bits  = round(rand( [Nbits,1] ));        % Generazione di bits equiprobabili (0 o 1)
   x     = 2*A*(bits -0.5) ;                % Codifica Vettore TX (+/- A)    
   SNR   = 10^(SNRdB(ind)/10);              % Rapporto Segnale Rumore lineare
   n     = sqrt( A^2/SNR )*randn(size(x)) ; % Vettore di Rumore Gaussiano con Potenza imposta da SNR
   y     = x + n ;                          % Vettore Ricevuto
   bitshat = ( y > 0 ) ;                    % Stima Bit Trasmessi con Soglia a 0
   
   biterr(ind) = sum(  bitshat ~= bits );   % Numero di Bit Errati
   BERsti(ind) = biterr(ind)/Nbits ;             % BER stimata
end

semilogy( SNRdB , BERsti , 's-g' ) ; hold on ; 

% Togliere commento sotto per confronto con BER teorica e Chernoff Bound
%
%     |
%     |
%     v

ChernoffBound
legend( 'BER Stimata' , 'BER Esatta' , 'Chernoff Bound');

