Monthly Archive for April, 2008

La programmation orientée objet

Qu’y a-t’il de plus beau que la programmation orientée objet? Rien.

La programmation orientée objet (ou POO) est un chef d’oeuvre en soi. Pourquoi? Parce que sa simplicité et sa rigueur en font l’une des meilleures façons de concevoir un logiciel, que se soit à l’aide de PHP, de C++ ou de tout autre langage orientée objet.

Mais qu’est-ce qu’ont les programmes orientés objets de si orgasmiques? Et bien, un ensemble de choses. Je ne ferais qu’en citer quelques-uns :
La possibilité d’écrire des classes réutilisables dans d’autres projets.
La possible de partager du code avec d’autres tout en ayant la capacité de retravailler sur son code sans affecter celui des autres.
La possibilité d’avoir des variables internes qui ne peuvent être modifiées/lues par des processus externes.
La liste continue…

Bon, commençons donc avec les rudiments de la POO, en langage C++.

Qu’est-ce qu’un objet? Et bien, il s’agit d’une classe, ou d’un ensemble d’information à propos d’un concept. Par exemple, la classe voiture pourrait être définie comme suit :
[cpp]
class Voiture
{
public:
Voiture(int position_x = 0, position_y = 0);
void avancer(int distance);
void reculer(int distance);
pair<int , int> obtenirPosition() const;

private:
int position_x_;
int position_y_;
}
[/cpp]

Qu’est-ce que c’est que ce beau tas de code? Et bien, il s’agit de la déclaration de la classe voiture! Eh oui, vous avez découvert votre première classe! Bon, il s’agit ici d’une classe bien banale qui permettra à votre objet Voiture de se déplacer vers l’avant et vers l’arrière. Elle gardera les positions en x et en y (bien que puisque la voiture se déplace actuellement seulement selon l’axe des x, la position y nous est inutile).

Maintenant, attaquons-nous au code qui fera en sorte qu’il y ait de l’action. Premièrement, il faut un constructeur, c’est-à-dire que tout objet Voiture doit être construit avant de pouvoir fonctionner.

[cpp]
Voiture::Voiture(int position_x, int position_y)
: position_x_(position_x), position_y_(position_y)
{
}
[/cpp]

Ici, on utilise le même nom que la classe pour déclarer ce constructeur. Vous noterez l’utilisation de : avant position_x_ et position_y_. Il s’agit d’une liste d’initialisation, c’est-à-dire que ces valeurs seront initialisées avec les valeurs dans les parenthèses. Pourquoi donc faire cela?

En C++, la création d’objet ce fait de cette façon : premièrement, on crée les attributs (les variables private), puis on appelle le constructeur qui se charge alors de construire l’objet. S’il arrivait qu’un objet A était inclus dans un autre objet B, cela aurait pour effet d’initialiser l’objet A avec des paramètres par défaut. Or, faire cela implique créer un objet avec des paramètres qu’on va changer quelques instants après, ce qui est une perte d’efficacité et une preuve de manque d’intelligence (vous ne voudriez pas paraître stupide non?).

Bon, avec ce constructeur, votre objet peut être créé. Mais rien de plus. Faisons à présent les deux fonctions de déplacement :

[cpp]
void avancer(int distance)
{
position_x_ += distance;
}
void reculer(int distance)
{
position_x_ -= distance;
}
[/cpp]

Code très simple. Ajoute ou enlève à la valeur de position_x_, un de nos attributs internes.

Finalement, il nous faut une fonction qui sera en mesure de nous donner notre position en x et en y!

[cpp]
pair <int , int> obtenirPosition() const
{
return make_pair(position_x_, position_y_);
}
[/cpp]

Avec ça, vous pouvez déjà faire une Voiture, la faire avancer et reculer et même obtenir sa position! Wow, vous avez presque le début d’un jeu de course entre les mains! À vous de repousser les limites maintenant.

Circuits électriques – Filtres actifs

Je veux vous faire part d’une partie intéressante de mon cours de circuits électriques : la conception de filtres actifs.

Tout d’abord, voyons quelques termes techniques:
lm741Ampli-op : Amplificateur opérationnel : Il s’agit d’une composante électronique qui renferme un paquet de transistors. Il a la capacité de faire diverses opérations mathématiques, tel que son nom l’indique : amplificateur OPÉRATIONNEL.
Condensateur : Permet de garder une charge électrique.

L’avantage de construire des filtres actifs comparativement à des filtres passifs est que l’on ne se sert pas de bobines, qui sont chères, difficilement miniaturisables et imparfaites (point de vue pratique). Les circuits qu’on construit se réduisent donc alors à des résistances, des condensateurs et des ampli-op.

Filtre passe-bas actif de Chebychev

Filtre passe-bas actif de Chebychev
Premièrement, passons au filtre “simple”. Ici, nous avons un circuit qui nous permet d’obtenir un filtre nommé de Chebychev dû à la nature du filtre lui-même. Non, Chebychev n’a pas fait le schéma, mais il a développé une méthode pour obtenir des filtres dont la partie à l’extérieur de la bande passante est plus atténué. Bande passante? Atténué? La bande passante, c’est les fréquences qu’on souhaîte laisser passer, et donc qui ne sont pas filtré (ou atténué). Atténué, c’est lorsque la tension à la sortie de notre filtre est diminué de 3dB. Ça devient rapidement complexe, mais disons que lorsque la tension (en volt) de sortie est de 0.707 comparativement au maximum qu’elle peut atteindre, on considère le signal comme atténué et inexistant (Vout = 0.707 x Vout MAX).

Commençons avec l’ampli-op. Comme vous pouvez le constater sur le schéma, ce ne sont pas toutes ses entrées et sorties qui sont employés. Nous utilisons en général la 2 (inverseuse), 3 (non-inverseuse), 4 (V-), 6 (sortie) et 7 (V+). Les bornes 4 et 7 sont employés pour polariser les transistors qui se trouvent à l’intérieur de l’ampli-op. L’entrée 2 est extrêmement importante. Avec cette entrée connectée à la sortie, nous obtenons ce qu’on appelle du feedback négatif, ce qui permet à l’ampli-op d’ajuster sa sortie pour qu’elle soit toujours constante. L’entrée 3 est l’entrée du signal même. Nous obtenons notre signal amplifié à la sortie, soit à la borne 6.

Ici, il s’agit d’un filtre passe-bas actif du deuxième degré avec un filtre passe-bas passif du premier degrée (composé des éléments R3 et C2).

À ce moment, vous n’avez probablement aucune idée de ce que fait ce circuit. Et bien, il faut demander à Bode de nous faire un graphique (Bode n’étant pas un logiciel mais une personne à qui on doit ces graphiques). On voit ici que toutes les fréquences avant 500 et des plumes sont à zéro (non atténué) et que plus on augmente la fréquence, plus le signal est attenué. Donc, vers l’infini, plus de signal!

Filtre passe-bande actif de Butterworth

Deuxièmement, voici le filtre de Butterworth. “Légèrement” plus complexe, il nous permet d’obtenir un filtre passe-bande, donc qui laisse passer certaines fréquences. Celui-ci est conçu pour faire passer des fréquences entres 8500 Hz et 10500 Hz.

Il faut ici créer un filtre actif qui se compose de 3 filtres actifs mis en étages. Cela a l’avantage d’être facile à synthétiser, c’est-à-dire de passer d’un format demandé avec des paramètres exigés à un filtre sous forme de circuit.

Une fois de plus, on fait appel à Bode qui nous montre le genre de filtre que l’on vient de créer. Victoire, on obtient un passe-bande, c’est-à-dire que les fréquences passent où il y a le pic (environ 10 kHz)!

Mais bon, à quoi ça sert toute cette marde là? Et bien, sans cette “marde” là, on ne pourrait pas avoir de télévision, ni de radio. En fait, probablement tout ce qui est de nature sonore et visuelle doit être traité afin de s’afficher ou de s’exprimer de façon correcte sans contenir de bruits. Merci à la science des filtres, certains élèves auront mal à la tête des jours durant et préfèreront s’abstenir de fréquenter un laboratoire d’électronique.

NOTE: Il manque probablement beaucoup d’explications, ça viendra au cours des semaines à suivre 🙂

Categories