function hamming_demo
	
	% parametro del codice
	NmK = 3;
	N = 2^NmK-1;
	K = N-NmK;
	
	temp = de2bi(0:2^NmK-1);
	P = temp(sum(temp,2)>=2,:);
	G=[eye(K),P];
	
	% tabelle delle parole informative e di codice
	d_tab = de2bi(0:2^K-1);
	c_tab = mod(d_tab*G,2);
	
	% rapporto segnale rumore
	SNR_dB = 10;
	sigma = sqrt(10^(-SNR_dB/10));
	
	n_err = 0;
	for loop = 1:1000
		% sorgente
		d = d_tab(ceil(2^K*rand),:);
		
		% codifica
		c = mod(d*G,2);
		
		% mapping
		v = 1-2*c;
		
		% canale AWGN
		w = sigma*randn(1,N);
		r = v+w;
		
		% demapping LLR
		Lc = 2*r/sigma^2;
		
		% Hamming SISO
		Ld_a = zeros(1,K);
		Ld = hamming_siso(Ld_a,Lc,d_tab,c_tab);
		%Ld_e = Ld-Ld_a;
		
		% decisioni Hard
		d_est = Ld<0;
		n_err = n_err + sum(mod(d+d_est,2));
	end
	fprintf('SNR = %gdB - Errori: %d\n',SNR_dB,n_err)
	
end

function Ld = hamming_siso(Ld_a,Lc,d_tab,c_tab)
	
	% implementare il calcolo degli LLR :)
	
	K = log2(size(d_tab,1));
	Ld = Ld_a + Lc(1:K);

end
