TP 7 : Représentation d’un signal sinusoidal

jeudi 22 janvier 2015
par  Julien Seinturier
popularité : 100%

Introduction

Ce TP à pour but la création d’un outil simple de visualisation d’un signal sinusoïdal en utilisant les package dédiés aux Interfaces Homme-Machine (IHM) de Java, en particulier SWING et AWT.

Prérequis

Vous effectuerez ce TP dans le même environnement que celui des TPs précédents.

Rappel :
Le répertoire de travail est le répertoire java se trouvant dans votre répertoire utilisateur (vous devez pouvoir y accéder grâce à la commande cd /java).

Le répertoire java doit être composé :

  • d’un répertoire src où les sources (fichiers .java) sont déposées ;
  • d’un répertoire build/classes ou les fichiers compilés (fichiers .class) sont stockés ;

1. Rappels mathématiques

Un signal sinusoïdal est un signal dont l’amplitude observée est une fonction sinusoïdale du temps.

De façon formelle, on calcule la valeur instantanée d’un fonction sinusoïdale (ou sinusoïde) à l’aide de la formule suivante :

g(t)\ =\ \^G \times sin(\omega{}t\ +\ \phi)
avec :

  • g(t) la valeur du signal à l’instant t ;
  • \^G amplitude de la grandeur (valeur de crête) ;
  • \omega pulsation de la grandeur en radians par seconde ;
  • \phi la phase à l’origine en radian.

Vous trouverez plus d’informations dans les cours de signal ou sur internet.

2. Calcul de la valeur instantanée d’un signal sinusoïdal en Java

Dans cette section l’implantation java d’une méthode de calcul de sinusoïde sera proposée. Pour cela :

1. Ecrire une classe Java nommée Sinusoide contenant les champs nécessaires à la paramétrisation d’une sinusoïde (\^G, \omega, \phi nommés respectivement g, w et phi.)


Par définition une sinusoïde est infinie suivant le temps t. L’étude d’un signal sinusoïdal est donc toujours effectuée sur un intervalle de temps défini par un instant d’origine t_{o} et un instant de fin t_{f}.

2. Compléter la classe Sinusoide en y ajoutant des champs permettant de représenter les instants t_{o} et t_{f} à l’aide de deux champs de type double nommés respectivement to et tf.


Les paramètres d’une sinusoïde devant être dynamiques, il faut qu’un utilisateur puisse les modifier.

3. Compléter la classe Sinusoide en y ajoutant une méthode main afin de la rendre exécutable. La méthode main devra permettre à l’utilisateur d’instancier une Sinusoide avec les paramètres voulus.

Vous êtes libres de choisir la méthode d’entrée des paramètres (lecture depuis la console, depuis un fichier ou lecture des arguments du programme.)

A partir des paramètres entrés par l’utilisateur il est maintenant possible de calculer des valeurs de signal.

4. Compléter la classe Sinusoide en y ajoutant une méthode double valeur(double t) qui calcule la valeur du signal à l’instant t en utilisant la formule rappelée en 1. et les paramètres saisis par l’utilisateur.)

Afin d’être sur que le calcul de sinusoïde à partir des paramètres souhaités est correct nous pouvons intégrer un contrôle simple qui affiche les valeurs du signal dans l’intervalle voulu.

5. Ajouter à la méthode main un bloc itératif qui permet d’afficher toutes les valeurs de signal (valeurs de la fonction sinusoïdale) sur l’intervalle de temps voulu. Vous devrez pour cela échantillonner l’intervalle de façon arbitraire.

L’affichage pourra prendre la forme suivante :

  1. t = 0.5 val = 1.45896
  2. t = 0.6 val = 1.420568
  3. ...

Télécharger

5. Visualisation graphique du signal

Nous allons maintenant modifier la classe Sinusoide afin d’avoir une visualisation graphique du signal.

La première action a effectuer est de déclarer la classe Sinusoide comme une classe ayant une représentation graphique. Pour cela :

6. Remplacer la déclaration de la classe Sinusoide de
public class Sinusoide {
en
public class Sinusoide extends JPanel{
Pour que cela fonctionne, il faut indiquer à Java ou trouver la classe graphique JPanel en indiquant l’import suivant :
import javax.swing.JPanel;

La classe Sinusoide propose maintenant des méthodes dédiées à l’affichage graphique. Le traçage d’une sinusoide peut alors être effectué en surchargeant la méthode paintComponent() de JPanel

7. Ajouter la méthode suivante à votre classe Sinusoide :
  1. public void paintComponent(Graphics graphics){
  2.  
  3. super.paintComponent(graphics);
  4.  
  5. // Facteur de passage de la valeur reelle de t a une abcisse sur le canvas
  6. double stepX = (tf - to) / getWidth();
  7.  
  8. // facteur de passage de la valeur de signal a un instant t vers une ordonnee sur le canvas
  9. double echantillonY = getHeight() / (2.0d*g);
  10.  
  11. int x = 0; // Valeurs de temps exprimee dans le canvas (abcisses)
  12. int y = 0; // Valeurs de signal exprimee dans le canvas (ordonnees)
  13.  
  14. int xo = 0;
  15. int yo = 0;
  16.  
  17. // Dessine la sinusoide
  18. for (x=0;x<getWidth(); x = x + 1){
  19. y = (int)((getHeight()/2.0d) - echantillonY*valeur(x*stepX));
  20. graphics.drawLine(xo, yo, x, y);
  21.  
  22. xo = x;
  23. yo = y;
  24. }
  25.  
  26. // Desinne l'axe des abcisses
  27. graphics.setColor(Color.red);
  28. ((Graphics2D)graphics).setStroke(new BasicStroke(2.0f));
  29. graphics.drawLine(0, getHeight()/2, getWidth(), getHeight()/2);
  30. }

Télécharger

Afin que le programme compile, vous devez ajouter à la classe les imports suivants :

  1. import java.awt.BasicStroke;
  2. import java.awt.Color;
  3. import java.awt.Graphics;
  4. import java.awt.Graphics2D;

Télécharger

Pour que le programme compile, vous devez avoir respecté les noms de variables demandés lors des questions 1 et 2.

Malgré les modifications apportées, aucun graphique n’est affiché lors de l’exécution de la classe Sinusoide. Pour déclencher l’affichage graphique, il faut modifier la méthode main de Sinusoide.

8. Ajouter le code suivant à la méthode main de Sinusoide :
  1. JFrame application = new JFrame(){};
  2. application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  3. application.add(s);
  4. application.setSize(640,480);
  5. application.setVisible(true);

Télécharger

Pour que ce code fonctionne, vous devez avoir nommé l’instance de la classe Sinusoide par s dans le main. De plus, vous devez intégrer l’import suivant à votre classe :

  1. import javax.swing.JFrame;

Vous pouvez maintenant exécuter le programme et visualiser la sinusoïde voulue.