Tp2 II B2.c
retour vers la page des Tps II
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "SVGlib.h"
#define N 512 // nombre de points de la courbe
#define largeur 640 // taille de l'image
#define hauteur 480
#define cCadre 0x000000 // les différentes couleurs utilisées.
#define cTour 0x303030
#define cFond 0xFFFFFF
#define cCourbe 0xFF0000
typedef struct
{
float min;
float max;
} bornes;
typedef struct
{
float Y[N]; // pas besoin d'axe des abscisses
bornes Ybornes;
} fct;
bornes extremes(fct f);
fct echantillonne(char t); // en paramètre le type de fonction
void tracerFenetre(int espace,fct f); // espace : bordure autour de la courbe
fct filtremoyenne(fct f);
fct filtrederivateur(fct f);
fct bruitage(fct f);
int main()
{
fct f;
char rep;
for(;;)
{
printf(" Filtrage Numérique \n");
printf(" ========================== \n");
printf(" \n");
printf("E...Echantillonnage B...Bruitage \n");
printf("M...filtre Moyenneur D...filtre Dérivée \n");
printf("T...Tracé de la courbe Q...Quitter \n");
printf(" \n");
scanf("%c",&rep); // la fonction scanf possède certaines limitations
if (rep!=10) getchar(); // comme ne pas supprimer la touche entrée ('\n' ou 10)
switch (rep)
{
case 'e':
case 'E':
do
{
printf("Choix de la courbe : 's' pour sin, 'r' pour rectangulaire.\n");
scanf("%c",&rep); // la fonction scanf possède certaines limitations
if (rep!=10) getchar(); // comme ne pas supprimer la touche entrée ('\n' ou 0x10)
if (rep=='S') rep='s';
if (rep=='R') rep='r';
} while ((rep!='s')&&(rep!='r'));
f=echantillonne(rep);
break;
case 't':
case 'T':
tracerFenetre(20,f);
break;
case 'q':
case 'Q':
return 0;
case 'm':
case 'M':
f=filtremoyenne(f);
break;
case 'd':
case 'D':
f=filtrederivateur(f);
break;
case 'b':
case 'B':
f=bruitage(f);
break;
}
}
}
fct filtremoyenne(fct f)
{
int i;
for (i=1;i<N-1;i++) f.Y[i]=(f.Y[i-1]+f.Y[i+1])/2;
f.Ybornes=extremes(f);
return f;
}
fct filtrederivateur(fct f)
{
int i;
for (i=1;i<N-1;i++) f.Y[i]=f.Y[i+1]-f.Y[i-1];
f.Ybornes=extremes(f);
return f;
}
fct bruitage(fct f)
{
int i;
for (i=1;i<N-1;i++) f.Y[i]+=1.0*rand()/RAND_MAX+0.5;
f.Ybornes=extremes(f);
return f;
}
bornes extremes(fct f) //recherche des valeurs extrêmes
{
int i;
bornes M;
M.min=f.Y[0]; M.max=f.Y[0]; // initialisation
for (i=1;i<N;i++) // parcours du tableau
{
if (M.min>f.Y[i]) M.min=f.Y[i];
if (M.max<f.Y[i]) M.max=f.Y[i];
}
return M;
}
fct echantillonne(char t)
{
int i;
fct f;
if (t=='s') for (i=0;i<N;i++) f.Y[i]=sin(2*M_PI*i/256); // fonction sinus
else for (i=0;i<N;i++) f.Y[i]=((i/128)%2)*2-1; // fonction rectangulaire
f.Ybornes=extremes(f);
return f;
}
void tracerFenetre(int espace,fct f)
{
SVGopen(largeur,hauteur); //Préparation de l'image
SVGrectanglePlein(0, 0, largeur, hauteur,cTour,cTour);
SVGrectanglePlein(espace, espace, largeur-2*espace, hauteur-2*espace,cCadre,cFond);
int cX[N],cY[N],i;
for (i=0;i<N;i++) // Coordonnees dans l'image
{
cX[i] = (largeur-2.0*espace) / N * i + espace;
cY[i] = (hauteur-2.0*espace)*(1.0 - (f.Y[i]-f.Ybornes.min)/(f.Ybornes.max-f.Ybornes.min)) + espace;
}
for (i=1;i<N;i++) SVGline(cX[i-1],cY[i-1],cX[i],cY[i],cCourbe); //tracé de la fonction
SVGClose();
}