stacksize('max');

function res = comp1(sonEntree, m, l, sonSortie)
	x = wavread(sonEntree,[1 m]); // Extraction du signal selon une longueur m
	Cn = dft(x,-1); // Transformée de Fourier
	for i = 1:m-l
		Dn(i) = Cn(i); // Copiage jusqu'aux l derniers coefficients...
	end
	for i = m-l:m
		Dn(i) = 0; // ...qui sont ici annulés
	end
	y = dft(Dn,1); // Transformée inverse de Fourier
	err = 0; 
	for i = 1:m // Calcul de l'erreur quadratique
		err = err + (x(i) - y(i))^2;
	end
	if sonSortie <> 'false'
	wavwrite(y,sonSortie); // Création du fichier de sortie ('false' pour aucun fichier de sortie)
	xset("window", 2);
	plot2d(1:m,x);
	xtitle('Audiogramme du signal d''entrée f(n)','n','f(n)');
	xset("window", 3);
	plot2d(1:m,y);
	xtitle('Audiogramme du signal compressé g(n) (méthode 1)','n','g(n)');
	xset("window", 4);
	plot2d(1:m,abs(Cn));
	xtitle('Représentation des coefficients de Fourier |s(n)| du signal de départ','n','|s(n)|');
	xset("window", 5);
	plot2d(1:m,abs(Dn));
	xtitle('Représentation des coefficients de Fourier |s1(n)| du signal transformé (méthode 1)','n','|s1(n)|');
	end
	res = sqrt(err); // Retour de l'erreur
endfunction

function res = comp2(sonEntree, m, l, sonSortie)
	x = wavread(sonEntree,[1 m]); // Extraction du signal selon une longueur m
	Cn = dft(x,-1); // Transformée de Fourier
	sorted = gsort(Cn,'g','i'); // Tri des valeurs de la transformée
	for i = 1:m
		if abs(Cn(i)) < abs(sorted(l)) // Si le coefficient fait partie des l plus petits
			Dn(i) = 0; // Annulation
		else
			Dn(i) = Cn(i); // Sinon, rien
		end
	end
	y = dft(Dn,1); // Transformée inverse de Fourier
	err = 0; 
	for i = 1:m // Calcul de l'erreur quadratique
		err = err + (x(i) - y(i))^2;
	end
	if sonSortie <> 'false'
	wavwrite(y,sonSortie); // Création du fichier de sortie ('false' pour aucun fichier de sortie)
	xset("window", 6);
	plot2d(1:m,y);
	xtitle('Audiogramme du signal compressé g(n) (méthode 2)','n','g(n)');
	xset("window", 7);
	plot2d(1:m,abs(Dn));
	xtitle('Représentation des coefficients de Fourier |s1(n)| du signal transformé (méthode 2)','n','|s1(n)|');
	end
	res = sqrt(err); // Retour de l'erreur
endfunction

function res = errorGraph1(sonEntree)
	i = 1;
	for m = 513:16:769
		for l = 17:32:m-16
			t(i) = (m-l)/m;
			E(i) = abs(comp1(sonEntree,m,l,'false'));
			i = i+1;
		end
	end
	xset("window", 8);
	plot2d(t,E);
	xtitle('Erreur quadratique (méthode 1)','t','E(t)');
	res = 0;
endfunction

function res = errorGraph2(sonEntree)
	i = 1;
	for m = 513:16:769
		for l = 17:32:m-16
			t(i) = (m-l)/m;
			E(i) = abs(comp2(sonEntree,m,l,'false'));
			i = i+1;
		end
	end
	xset("window", 9);
	plot2d(t,E);
	xtitle('Erreur quadratique (méthode 2)','t','E(t)');
	res = 0;
endfunction

comp1('voix1.wav',1025,512,'voixtest.wav')
comp2('voix1.wav',1025,512,'voixtest.wav')
errorGraph1('voix1.wav')
errorGraph2('voix1.wav')
