0% ont trouvé ce document utile (0 vote)
49 vues12 pages

CR TP6 Signal

Transféré par

wael.ahmedkomi
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
49 vues12 pages

CR TP6 Signal

Transféré par

wael.ahmedkomi
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

2024

Compte rendu TP n°6 : Échantil-


lonnage et filtrage numérique

KAPANDE DENG Anna Rafaella


AHMED SALAH ALI SAYED Wael
05/05/2024
INTRODUCTION :
Le traitement de signaux numériques est une composante essentielle de nombreux systèmes
électroniques, permettant de convertir des données numériques en signaux analogiques pour le
contrôle d’actionneurs et d’autres composants. Dans ce TP, nous nous concentrerons sur
l’échantillonnage et le filtrage numérique à l’aide de la carte Arduino Due, qui possède comme
fonctionnalité la génération de signaux analogiques. De ce point de vue, l’objectif principal sera
de comprendre comment échantillonner un signal et appliquer des filtres numériques pour
obtenir des résultats souhaités. Dans un premier temps, nous explorerons les capacités de la
carte Arduino Due pour générer des signaux analogiques, puis nous mettrons en œuvre des
techniques d’échantillonnage et de filtrage pour traiter ces signaux de manière efficace. En fin
de compte, ce TP nous permettra de mieux comprendre les principes fondamentaux du
traitement de signaux numériques.

6.1 Génération de signaux


1) Présentation de la fonction qui renvoie la valeur d’un signal rectangle en fonction du
paramètre d’entrée temps et fréquence du signal à générer :

Figure 1 : Génération d'un signal rectangle

2) Faisons évoluer le temps dans le programme principal (loop), puis affichons la valeur du
signal de sortie :

Figure 2 : Code du signal rectangle


Page 1 sur 11
Figure 3 : Sortie du signal
On remarque sur l’oscilloscope un signal qui n’est pas stable.
3) Affichage dans le traceur série le signal généré pour une fréquence f0 = 1Hz :

Figure 4 : Signal rectangle


Nous avons obtenu un signal rectangulaire dont le rapport cyclique est de 50%. Cela signifie
que la durée pendant laquelle le signal est à un niveau haut est égale à la durée pendant laquelle
il est à un niveau bas. En effet, avec une période de 1seconde, alors le signal restera à un état
haut pendant 0.5 seconde et bas pendant 0.5 seconde.
4) Le programme a été vérifié par Mme Chatoux.
5) Adaptation du code pour réaliser un signal de type impulsionnel à rapport cyclique variable
(paramètres d’entrée : temps, fréquence, rapport cyclique) :

Figure 5 : Code de la fonction 2

Page 2 sur 11
6) Afficher dans le traceur série le signal généré pour une fréquence f0 = 1Hz et λ = 1 / 5 :
Avant d’afficher, le code utilisé est de :

Figure 6 : Code 2

Figure 7 : Signal de sortie

Page 3 sur 11
Le signal avec un rapport cyclique de 1/5 a une durée pendant laquelle il est haut qui est
beaucoup plus courte que la durée pendant laquelle il est bas. De ce fait, la période étant toujours
de 1 seconde, le signal restera haut pendant seulement 0.2 secondes, soit 1/5 de la période et
bas pendant 0.8 seconde (soit le reste de la période). Cela signifie que le signal est plis court
par rapport à la version initiale, où il reste haut pendant une plus petite fraction de la période
totale.
7) Affichage des signaux générés sur l’oscilloscope.
Avant tout, nous avons d’abord réalisé le montage :

• En connectant notre carte Arduino à notre ordinateur à l’aide d’un câble USB.
• En connectant les pins DAC1 et DAC2 de notre carte Arduino à notre oscilloscope à
l’aide des câbles adaptateurs.
• Puis nous avons alimenté l’oscilloscope afin d’être prêt à recevoir les signaux.

Figure 8 : Montage du circuit


Après écriture du code, nous avons compilé puis téléversé le programme et avons obtenu ce
résultat :

Figure 9 : Signal sur oscilloscope au niveau du DAC1


Page 4 sur 11
Figure 10 : Affichage des 2 signaux
Nous remarquons en jaune le signal au niveau du DAC1 et en bleu le signal au niveau DAC2.
En effet nous avons rencontré des difficultés à afficher le signal au niveau du DAC2, car il ne
marchait pas. Néanmoins sur l’oscilloscope on a pu affiché celui du DAC1.
8) Validation par l’enseignant du signal impulsionnel à rapport cyclique variable.

6.2.1 Filtre dérivateur


Nous nous intéressons ici au filtre d’équation aux différences : y(n) = |x(n) − x(n − 1)|.
1) Le filtre dérivateur est un filtre de type RIF (Réponse Impulsionnelle Finie) car il utilise
uniquement les valeurs actuelles et les valeurs précédentes pour calculer la sortie.
2) Écriture d’une fonction mettant en œuvre ce filtre :

Figure 11 : Code de la fonction filtre


3) Pour préparer un signal carré d’amplitude comprise entre 0 et 3.3 V et de fréquence 200 Hz
sur le générateur, nous avons configuré le générateur de signaux pour produire un signal carré
avec ces caractéristiques.
4) Pour mesurer ce signal sur la voie 1 de l’oscilloscope, nous avons connecté la sortie du
générateur à cette voie.
5) Avant de brancher l’Arduino Due sur le générateur, nous avons fait valider par l’enseignant
pour nous assurer qu’il est correctement configuré.

Page 5 sur 11
6) Effectuons le filtrage numérique de ce signal.

Résultat obtenu :

Figure 12 : Signal filtré

7) En réalité, l’effet du filtrage dépend du signal d’entrée et des caractéristiques du filtre. Dans
ce cas, le filtre dérivateur réagira aux variations rapides du signal d’entrée en mettant en
évidence les points où le signal change brusquement de valeur.
8) Lorsque la fréquence du signal sinusoïdal est réglée à 3 kHz et filtrée à l'aide d'un filtre
dérivateur, on observe un phénomène intéressant sur l'oscilloscope. Le filtre dérivateur réagit
aux changements de phase et d'amplitude qui sont caractéristiques des signaux sinusoïdaux à
haute fréquence.

En théorie, la dérivée d'un signal sinusoïdal sin(2πft) est 2𝜋𝑓cos(2𝜋𝑓𝑡), ce qui signifie que le
filtre devrait produire un signal sinusoïdal avec une amplitude proportionnelle à la fréquence
du signal d'entrée, c'est-à-dire 3 kHz dans ce cas. Effectivement, ce que nous voyons est une
augmentation de l'amplitude des pics du signal de sortie, ce qui est cohérent avec la réponse
attendue d'un filtre dérivateur appliqué à un signal à haute fréquence.

Page 6 sur 11
6.2.2. Filtre passe-bas
1) Ci-dessous est la démonstration :

Figure 13 : Démonstration mathématique

Page 7 sur 11
2) Ecriture du programme mettant ce filtre en œuvre en choisissant A=9 et B= 11.
3) Ajout d’un délai de 1ms dans la bouche pour fixer la période d’échantillonnage Te.
const int inputPin = A0; // Pin d'entrée analogique
const int outputPin = DAC0; // Pin de sortie DAC sur Arduino

float x_n = 0;
float x_n_1 = 0;
float y_n = 0;
float y_n_1 = 0;

void setup() {
Serial.begin(9600);

analogReadResolution(10);
analogWriteResolution(12);

x_n_1 = analogRead(inputPin);
y_n_1 = x_n_1; // Initialiser la sortie avec la 1ère lecture
}

void loop() {
x_n = analogRead(inputPin);
y_n = (x_n + x_n_1 + 9 * y_n_1) / 11;

analogWrite(outputPin, int(y_n));

x_n_1 = x_n;
y_n_1 = y_n;

delay(1);
}
Figure 14 : Code Arduino pour le filtre PB

4) Testons les fréquences 1, 10 et 100. Et retrouvons approximativement la fréquence de


coupure en faisant varier la fréquence du générateur. Enfin, déterminons la nature de ce filtre.
void setup() {
pinMode(outputPin, OUTPUT);
Serial.begin(9600);
}

void loop() {
unsigned long currentTime = millis();

if (currentTime - lastChangeTime > 10000) {


lastChangeTime = currentTime;

// Alterner entre les fréquences


if (frequency == 1) {
frequency = 10;
} else if (frequency == 10) {
frequency = 100;
} else if (frequency == 100) {
frequency = 1;
}

Serial.print("Fréquence changée à: ");


Page 8 sur 11
Serial.println(frequency);
}

if (currentTime % (1000 / frequency) < (500 / frequency)) {


if (state != HIGH) {
state = HIGH;
analogWrite(outputPin, 4095); // Écrire la valeur maximale
}
} else {
if (state != LOW) {
state = LOW;
analogWrite(outputPin, 0); // Écrire la valeur minimale
}
}

delay(1);
}
Figure 15 : Code Arduino pour les tests

• À basse fréquence (1 Hz), le filtre maintient l'intégrité du signal.


• À des fréquences intermédiaires (10 Hz), on observe une légère atténuation.
• À haute fréquence (100 Hz), le signal est nettement atténué.
• La fréquence de coupure est d’environ 225 Hz
On en déduit que notre filtre s’agit d’un filtre passe-bas.
5) Le signal filtré a été validé par l’enseignant.
6) En observant le comportement du signal de sortie à 1 kHz, on observe que le signal de
sortie est déformé. On en déduit que la fréquence d'échantillonnage réelle peut être
insuffisante pour éviter l'aliasing.
7) La nouvelle fréquence de coupure tend vers 23 Hz quand le délai est de 10ms.
8) Les valeurs des fréquences de coupure ne sont pas identiques parce qu’on avait modifié la
valeur du délai. Il a été multiplié par 10 et par conséquent f0 a été divisée par 10.

CONCLUSION :
En conclusion, ce TP sur l’échantillonnage et le filtrage numérique avec la carte Arduino Due
nous a permis de découvrir les principes fondamentaux du traitement de signaux numériques.
En explorant d’une part les fonctionnalités de la carte Arduino Due pour générer des signaux
analogiques et en les affichant sur l’oscilloscope. D’une autre part, en mettant en œuvre des
techniques d’échantillonnage et de filtrage tel que le filtre de type RIF qui permet de détecter
des variations brusques du signal. Ainsi, nous avons appris à convertir des données
numériques en signaux analogiques, à les manipuler pour obtenir des résultats souhaités et à
comprendre l’importance de filtrage pour éliminer le bruit et les artefacts indésirables.

Page 9 sur 11
ANNEXES :
En raison de problèmes techniques rencontrés avec notre carte Arduino, spécifiquement un
dysfonctionnement au niveau des pins, nous n'avons pas été en mesure de réaliser les tracés
des signaux directement sur l'appareil comme initialement prévu. Cette contrainte nous a
empêchés de compléter les tests de filtrage directement sur la plateforme Arduino dans les
délais impartis.
Pour contourner ce problème et poursuivre notre analyse du comportement des filtres
numériques, nous avons opté pour l'implémentation des algorithmes de filtrage en Python.
Cette approche nous a permis de simuler le filtrage passe-bas et de visualiser les effets sur les
signaux de manière précise grâce aux bibliothèques numpy et matplotlib, qui offrent des
outils robustes pour le traitement et la visualisation des données numériques.
Cette décision a été prise afin de garantir la continuité de notre projet malgré les obstacles
techniques, et les résultats obtenus via Python sont inclus dans ce rapport pour illustrer nos
conclusions sur l'efficacité du filtre étudié.
import numpy as np
import matplotlib.pyplot as plt

t = np.linspace(0, 1, 1000, endpoint=False) # 1 seconde, 1000 points


fs = 1000 # fréquence d'échantillonnage

# Génération d'un signal d'entrée


input_signal = np.sin(2 * np.pi * 5 * t) + 0.5 * np.sin(2 * np.pi * 50 * t)

# Paramètres du filtre passe-bas


A = 9
B = 11
previous_output = 0
output_signal = []

for i in range(len(input_signal)):
current_input = input_signal[i]
if i == 0:
previous_input = current_input
current_output = (current_input + previous_input + A * previous_output)
/ B
output_signal.append(current_output)
previous_input = current_input
previous_output = current_output

output_signal = np.array(output_signal)

plt.figure(figsize=(10, 6))
plt.plot(t, input_signal, label='Signal d\'entrée')
plt.plot(t, output_signal, label='Signal de sortie', linestyle='--')
plt.title('Filtrage passe-bas')
plt.xlabel('Temps (s)')
plt.ylabel('Amplitude')
plt.legend()
plt.grid(True)
plt.show()

Figure 16 : Code Arduino pour le signal sinusoïdal d’entrée et de sortie (filtrage PB)

Page 10 sur 11
Figure 17 : Graphique du signal

Figure 18 : Tronçon du même graphique sur une période

Page 11 sur 11

Vous aimerez peut-être aussi