% varie tesine possibili 
function cc_demo(K,g_oct)
	% se non vengono passati parametri usiamo questi
	if nargin < 2
		% rate 1/2 con memoria 2 (d_free = 5)
		K = 1;
		g_oct = [5 7]; % 101 111
		
		% questo equivale al caso K=1 g_oct=[5 7] con
		% pucturing per ottenere rate 2/3 (i bit di ingresso
		% con posizione dispari sono "più protetti" di quelli
		% con posizione pari) (d_free = 4)
% 		K = 2;
% 		g_oct = [12 16 5]; % 1010 1110 0101
	end

	% costruisci la matrice dei polinomi generatori a partire dalla
	% rappresentazione in ottale (da passare come numeri non come 
	% stringhe)
	g_bin = dec2bin(oct2dec(g_oct))-'0';
	
	% numero di generatori e lunghezza di vincolo
	[N,temp] = size(g_bin);
	V = ceil(temp/K);

	% questo serve con K>1 per assicurarsi che [u_bin s_bin] e
	% g_bin abbiano dimensioni compatibili
	if temp < V*K
		g_bin = [zeros(N,V*K-temp),g_bin];
	end
	
	% numero di stati (ni è log2(S))
	ni = K*(V-1);
	S = 2^ni;
	
	% matrice di transizione di stato
	S_new = zeros(S,2^K);
	% matrice delle uscite corrispondenti alle transizioni di stato
	Y = zeros(S,2^K);
	for s = 1:S
		for u = 1:2^K
			% converti s da (posizione) decimale
			% a stringa di ni bit
			s_bin = dec2bin(s-1,ni)-'0';
			u_bin = dec2bin(u-1,K)-'0';
			
			% shift della coppia ingresso-stato
			% a destra di K bit
			temp = [u_bin,s_bin];
			s_new_bin = temp(1:end-K);

			% converti da stringa di bit a posizione
			s_new = 1 + s_new_bin * 2.^(ni-1:-1:0)';
			S_new(s,u) = s_new;
			
			% combinazione lineare su GF(2) con
			% i coefficenti della g
			y_bin = mod(temp*g_bin',2);
			
			% converti da stringa di N bit ad indice
			y = 1 + y_bin * 2.^(N-1:-1:0)';
			Y(s,u) = y;
		end
	end
	
	% blocchi da codificare (L deve essere divisibile per K)
	L_try = 8;
	L = K*ceil(L_try/K);
	x = eye(L);
	[L,X] = size(x);
	
	% messaggio codificato
	M = L/K*N+(V-1)*N;
	fprintf('codice a blocchi con rate nominale: %d/%d e rate effettivo: %d/%d\n',K,N,L,M);

	% codifica dallo stato zero di X messaggi
	y = zeros(X,M);
	for x_ind = 1:X
		s = 1;
		for i = 1:K:L
			
			% ingresso attuale
			u_bin = x(x_ind,i:i+K-1);
			u = 1 + u_bin * 2.^(K-1:-1:0)';
			
			% uscita
			temp = Y(s,u);
			y(x_ind,(i-1)/K*N+(1:N)) = dec2bin(temp-1,N)-'0';

			% prossimo stato
			s = S_new(s,u);
		end
		% controllo allo stato zero (senza di questo gli utlimi 
		% bit non sono protetti come gli altri)
		for v = 1:V-1

			% uscita con ingresso zero
			temp = Y(s,1);
			y(x_ind,L/K*N+(v-1)*N+(1:N)) = dec2bin(temp-1,N)-'0';

			% prossimo stato con ingresso zero
			s = S_new(s,1);
		end
	end
	x_str=char(x+'0');
	y_str=char(y+'0');
	for x_ind = 1:X
		fprintf('input: %s output: %s\n',x_str(x_ind,:),y_str(x_ind,:));
	end
end
