function trellis_demo
	
	V = 7;
	tr = poly2trellis(V,[133 171]);
	
	% disegna il trellis degli stati del codice a blocchi ottenuto
	% terminando nello stato zero il trellis
	%
	figure(1)
	hold off
	% i: stato di partenza
	% tr.nextStates(1+i,1): stato di arrivo con ingresso 0
	% tr.nextStates(1+i,2): stato di arrivo con ingresso 1
	covered = zeros(tr.numStates,2);
	covered(1+0,1) = 1;
	T = 10;
	for t = 0:T-1
		for i = 0:tr.numStates-1
			if covered(1+i,1)
				covered(1+tr.nextStates(1+i,:),2) = 1;
				plot(t+[0,1],[i,tr.nextStates(1+i,1+0)]);
				hold on
				plot(t+[0,1],[i,tr.nextStates(1+i,1+1)],':');
			end
		end
		nc = sum(covered(:,1));
		plot(t*ones(nc,1),find(covered(:,1))-1,'o')
		covered(:,1) = covered(:,2);
		covered(:,2) = 0;
	end
	for t = T:T+V-2
		for i = 0:tr.numStates-1
			if covered(1+i,1)
				covered(1+tr.nextStates(1+i,1+0),2) = 1;
				plot(t+[0,1],[i,tr.nextStates(1+i,1+0)]);
			end
		end
		nc = sum(covered(:,1));
		plot(t*ones(nc,1),find(covered(:,1))-1,'o')
		covered(:,1) = covered(:,2);
		covered(:,2) = 0;
	end
	plot(T+V-1,0,'o')
	xlim([-1,T+V])
	ylim([-1,tr.numStates])

	% rapporto segnale rumore
	SNR_dB_min = -3;
	SNR_dB_step = 0.2;
	SNR_dB_max = 3;
	
	figure(2)
	x_axis = SNR_dB_min:SNR_dB_step:SNR_dB_max;
	y_axis = zeros(numel(x_axis),3);
	time_budget = 60;
	
	tic
	for i = 1:numel(x_axis)
		
		% calcola sigma_w dall'SNR
		SNR_dB = x_axis(i);
		SNR = 10^(SNR_dB/10);
		sigma_w = 1/sqrt(SNR);
		
		% probabilità di errore della BPSK non codificata
		BER = 0.5*erfc(1/sigma_w/sqrt(2));
		
		% contatori
		err_events = 0;
		trials = 0;
		bit_errors_Hard = 0;
		bit_errors_Soft = 0;
		
		while err_events < 300
			if toc > time_budget
				break
			end
			
			% codifica convoluzionale con terminazione nello stato zero
			k = 100;
			d = rand(k,1)<0.5;
			tail = zeros(V-1,1);
			c = convenc([d;tail],tr);
			n = numel(c);
			
			% trasmissione sul canale AWGN con modulazione BPSK
			v = 1-2*c; % BPSK
			w = sigma_w*randn(n,1);
			r = v + w; % canale AWGN
			
			% ricevitore
			c_est = r < 0;
			d_est = vitdec(c_est,tr,5*V,'term','hard');
			bit_errors_Hard = bit_errors_Hard + sum(d ~= d_est(1:k));
			
			% ricevitore Soft (non quantizzato)
			d_est = vitdec(r,tr,5*V,'term','unquant');
			errors_Soft = sum(d ~= d_est(1:k));
			bit_errors_Soft = bit_errors_Soft + errors_Soft;
			
			% contatori
			trials = trials + 1;
			if errors_Soft
				err_events = err_events + 1;
			end
		end
		y_axis(i,:) = [BER bit_errors_Hard/(trials*k) ...
			bit_errors_Soft/(trials*k)];
		fprintf(['SNR: %g dB -- BER(theory): %g --'...
			' BER(Hard): %g -- BER(Soft): %g\n'],...
			SNR_dB,BER,...
			bit_errors_Hard/(trials*k),...
			bit_errors_Soft/(trials*k));
		
		hold off
		semilogy(x_axis,y_axis)
		grid on
		xlabel('SNR [dB]')
		ylabel('BER')
		legend({'Uncoded','Hard','Soft'},'Location','SouthWest');
		drawnow
	end
end
