Tp2p II B2.c
Révision datée du 10 décembre 2012 à 18:32 par Bjacquot (discussion | contributions)
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;
void extremes(fct *f); void echantillonne(char t,fct *f); // en paramètre le type de fonction void tracerFenetre(int espace,fct *f); // espace : bordure autour de la courbe void filtremoyenne(fct *f); void filtrederivateur(fct *f); void 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')); echantillonne(rep,&f); break; case 't': case 'T': tracerFenetre(20,&f); break; case 'q': case 'Q': return 0; case 'm': case 'M': filtremoyenne(&f); break; case 'd': case 'D': filtrederivateur(&f); break; case 'b': case 'B': bruitage(&f); break; } } }
void filtremoyenne(fct *f) { int i; for (i=1;i<N-1;i++) f->Y[i]=(f->Y[i-1]+f->Y[i+1])/2; extremes(f); }
void filtrederivateur(fct *f) { int i; for (i=1;i<N-1;i++) f->Y[i]=f->Y[i+1]-f->Y[i-1]; extremes(f); }
void bruitage(fct *f) { int i; for (i=1;i<N-1;i++) f->Y[i]+=1.0*rand()/RAND_MAX+0.5; extremes(f); }
void extremes(fct *f) //recherche des valeurs extrêmes { int i; f->Ybornes.min=f->Y[0]; f->Ybornes.max=f->Y[0]; // initialisation for (i=1;i<N;i++) // parcours du tableau { if (f->Ybornes.min>f->Y[i]) f->Ybornes.min=f->Y[i]; if (f->Ybornes.max<f->Y[i]) f->Ybornes.max=f->Y[i]; } }
void echantillonne(char t, fct *f) { int i; 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 extremes(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(); }