function dft_2D
	
	% compressione della dinamica
	logarithmic_compression = 1;
	
	% visualizzazione come immagine o come superficie
	show_as_image = 1;
	
	% un rettangolo
	imfile = 'imm1.png';
	
	% un rettangolo ruotato
% 	imfile = 'imm2.png';
	
	% un cerchio
% 	imfile = 'imm3.png';
	
	% un cerchio di raggio maggiore
% 	imfile = 'imm4.png';
	
	% carica l'immagine e convertila a double
	a=double(imread(imfile));
	if size(a,3) ~= 1
		% RGB to YUV, componente Y
		a = 0.299*a(:,:,1)+0.114*a(:,:,2)+0.587*a(:,:,3);
	end
	
	% salva numero di righe e colonne in Nr ed Nc
	[Nr,Nc]=size(a);
	
	% oversampling con padding (permette di aumentare la
	% risoluzione dell'analisi in frequenza, non di risolvere
	% componenti in frequenza distanti meno di 1/Nr, 1/Nc)
	OSF = 16;
	
	% calcola la DFT 2-D dell'immagine (con padding al valore 255,
	% bianco, che è lo sfondo)
	a_pad = [a,255*ones(Nr,(OSF-1)*Nc);255*ones((OSF-1)*Nr,OSF*Nc)];
	A = abs(fft2(a_pad));
	
	% sostituisci il valore alla frequenza (0,0) (la componente in
	% continua) con il valore interpolato con l'8-intorno
	A(1,1) = (2 * (A(2,1) + A(1,2) + A(Nr,1) + A(1,Nc)) ...
		-(A(2,2) + A(Nr,2) + A(2,Nc) + A(Nr,Nc)))/4;
	
	% visualizza l'immagine
	figure(1)
	subplot(1,1,1)
	imagesc(a)
	colormap gray
	axis image
	xlabel('row')
	ylabel('col')
	
	% visualizza la DFT 2D
	figure(2)
	subplot(1,1,1)
	
	u=(-OSF*Nr/2:OSF*Nr/2-1)/OSF;
	v=(-OSF*Nc/2:OSF*Nc/2-1)/OSF;
	
	% queste righe visualizzano la DFT come immagine
	if logarithmic_compression
		A_shift=fftshift(log(30+abs(A)));
	else
		A_shift=fftshift(abs(A));
	end
	if show_as_image
		imagesc(u,v,A_shift)
		axis image
	else
		% queste righe visualizzano la DFT come superficie
		surf(u,v,A_shift,'EdgeColor','none')
	end
	colormap gray
	xlabel('row')
	ylabel('col')
end
