Représentation spectrale d’un
signal noyé dans un bruit en
utilisant Python
Réaliser par :
MEKAOUI Demandé par Pr
HAMZA Drissi.H
CHEIKH
SOUHAIL
LADID ACHRAF
1) Algorithme et programme à utiliser :
Définir les paramètres du signal :
o Fréquence du signal : 50 Hz
o Amplitude du signal : 1 (ou une valeur choisie)
o Phase du signal : 0 (ou une autre valeur si nécessaire)
o Durée du signal : par exemple, 1 seconde
o Fréquence d'échantillonnage : 1000 Hz (ou plus pour une meilleure précision)
Créer un vecteur de temps :
o Générer un vecteur de temps allant de 0 à la durée spécifiée avec des pas égaux à
l'inverse de la fréquence d'échantillonnage.
Calculer le signal sinusoïdal :
o Utiliser la formule y(t)=Asin(2πft+ϕ)y(t) = A \sin(2\pi f t + \phi)y(t)=Asin(2πft+ϕ), où
:
AAA est l'amplitude,
fff est la fréquence du signal (50 Hz),
ttt est le temps,
ϕ\phiϕ est la phase.
Tracer le signal :
o Afficher le signal sinusoïdal à l'aide d'un graphique.
1-1) Programme Python :
# Importation des bibliothèques nécessaires
import numpy as np # Pour les calculs numériques
import [Link] as plt # Pour la création de graphiques
# Paramètres du signal
frequence = 50 # Fréquence du signal en Hz
amplitude = 1 # Amplitude du signal
phase = 0 # Phase du signal en radians
duree = 1 # Durée du signal en secondes
frequence_echantillonnage = 1000 # Fréquence d'échantillonnage en Hz
# Génération de l'axe temporel
t = [Link](0, duree, int(frequence_echantillonnage * duree), endpoint=False) # temps de 0 à
duree, avec un pas défini par la fréquence d'échantillonnage
# Calcul du signal sinusoïdal
y = amplitude * [Link](2 * [Link] * frequence * t + phase)
# Tracer le signal sinusoïdal
[Link](figsize=(10, 6))
[Link](t, y, label=f"Signal Sinusoïdal à {frequence} Hz")
[Link]("Signal Sinusoïdal de Fréquence 50 Hz")
[Link]("Temps (secondes)")
[Link]("Amplitude")
[Link](True)
[Link]()
# Afficher le graphique
[Link]()
ues en entrant cette commande
1-2) Graphe de programme :
Figure 1: Graphique de signal sinusoïdal 50
Hz
1-3) Interprétation graphique :
Le graphique affichera un signal sinusoïdal de 50 Hz. L'axe des x représente le temps allant
de 0 à 1 seconde, tandis que l'axe des y représente l'amplitude du signal, oscillant entre -1
et +1. Le signal effectuera 50 cycles complets en une seconde, avec une période de 20 ms
par cycle. On verra des oscillations régulières, où le signal monte à +1, descend à -1, puis
revient à 0, et ce motif se répète constamment.
2) Ajout de transformée de Fourier :
2-1) Programme
On ajoute maintenant la transformée de Fourier à notre programme par les commandes
suivants :
import numpy as np
import [Link] as plt
frequence = 50
amplitude = 1
phase = 0
duree = 1
frequence_echantillonnage = 1000
t = [Link](0, duree, int(frequence_echantillonnage * duree), endpoint=False)
y = amplitude * [Link](2 * [Link] * frequence * t + phase)
Y = [Link](y) # Calcul de la FFT du signal
n = len(Y) # Nombre de points
f = [Link](n, 1/frequence_echantillonnage) # Fréquences associées à chaque
composante
f_pos = f[:n // 2]
Y_pos = [Link](Y[:n // 2]) # Magnitude de la transformée (valeurs absolues)
[Link](figsize=(12, 6))
[Link](2, 1, 1) # Diviser la figure en 2 sous-graphes
[Link](t, y, label=f"Signal Sinusoïdal à {frequence} Hz")
[Link]("Signal Sinusoïdal de Fréquence 50 Hz")
[Link]("Temps (secondes)")
[Link]("Amplitude")
[Link](True)
[Link]()
[Link](2, 1, 2) # Le second sous-graphe
[Link](f_pos, Y_pos, label="Spectre de fréquence", color='orange')
[Link]("Spectre de Fréquence du Signal")
[Link]("Fréquence (Hz)")
[Link]("Amplitude")
[Link](True)
[Link]()
plt.tight_layout()
[Link]()
2-2) Graphe de programme:
Figure 2: Graphe
avec fft
2-3) Interprétation graphique
On remarque un pic net autour de 50 Hz, ce qui signifie que le signal contient
principalement une composante de fréquence à 50 Hz. Cela correspond à la fréquence du
signal que vous avez généré.
Il n'y a pratiquement pas d'autres pics importants dans le spectre, ce qui indique que le
signal est principalement composé de cette fréquence unique (50 Hz). Le signal est donc
monofréquentiel (un seul composant de fréquence).
3) Ajout d’une autre fréquence de 120 Hz
3-1) Programme
Maintenant on va ajouter des commandes pour ajouter une autre fréquence de 120 Hz
# Importation des bibliothèques nécessaires
import numpy as np # Pour les calculs numériques
import [Link] as plt # Pour la création de graphiques
# Paramètres du signal
frequence_1 = 50 # Fréquence du premier signal en Hz
frequence_2 = 120 # Fréquence du deuxième signal en Hz
amplitude = 1 # Amplitude du signal
phase = 0 # Phase du signal en radians
duree = 1 # Durée du signal en secondes
frequence_echantillonnage = 1000 # Fréquence d'échantillonnage en Hz
# Génération de l'axe temporel
t = [Link](0, duree, int(frequence_echantillonnage * duree), endpoint=False) #
temps de 0 à duree, avec un pas défini par la fréquence d'échantillonnage
# Calcul des signaux sinusoïdaux
y1 = amplitude * [Link](2 * [Link] * frequence_1 * t + phase) # Signal à 50 Hz
y2 = amplitude * [Link](2 * [Link] * frequence_2 * t + phase) # Signal à 120 Hz
# Signal combiné des deux fréquences
y_combined = y1 + y2
# Calcul de la transformée de Fourier du signal combiné
Y = [Link](y_combined) # Calcul de la FFT du signal combiné
n = len(Y) # Nombre de points
f = [Link](n, 1/frequence_echantillonnage) # Fréquences associées à chaque
composante
# Ne garder que les fréquences positives pour la représentation
f_pos = f[:n // 2]
Y_pos = [Link](Y[:n // 2]) # Magnitude de la transformée (valeurs absolues)
# Tracer le signal sinusoïdal combiné dans le domaine temporel
[Link](figsize=(12, 6))
# Tracé du signal temporel combiné
[Link](2, 1, 1) # Diviser la figure en 2 sous-graphes
[Link](t, y_combined, label=f"Signal combiné à {frequence_1} Hz et {frequence_2} Hz")
[Link]("Signal Sinusoïdal Combiné de Fréquences 50 Hz et 120 Hz")
[Link]("Temps (secondes)")
[Link]("Amplitude")
[Link](True)
[Link]()
# Tracé du spectre de fréquence du signal combiné
[Link](2, 1, 2) # Le second sous-graphe
[Link](f_pos, Y_pos, label="Spectre de fréquence", color='orange')
[Link]("Spectre de Fréquence du Signal Combiné")
[Link]("Fréquence (Hz)")
[Link]("Amplitude")
[Link](True)
[Link]()
# Afficher les graphiques
plt.tight_layout()
[Link]()
3-2) Graphe de programme
Le programme affiche deux graphiques qui sont les suivants :
Figure 3: Graphe de 50Hz et
120Hz
3-3) Interprétation graphique
Le signal oscille de manière complexe en raison de la superposition des deux sinusoïdes
à 50 Hz et 120 Hz. On peut voir des oscillations rapides et lentes, car le signal est
constitué de deux fréquences différentes.
Le signal à 50 Hz produit une oscillation lente (un cycle toutes les 0,02 secondes), tandis
que le signal à 120 Hz produit des oscillations plus rapides (un cycle toutes les 0,0083
secondes).
Cette combinaison génère un motif plus irrégulier que si vous aviez un seul signal
sinusoïdal.
4) Ajouter un signal bruité
4-1) Programme
Maintenant on ajoute un signal bruité au programme précédent en entrant ces
commandes
# Importation des bibliothèques nécessaires
import numpy as np
import [Link] as plt
# Paramètres du signal
frequence1 = 50 # Fréquence du premier signal en Hz
frequence2 = 120 # Fréquence du second signal en Hz
amplitude = 1 # Amplitude du signal
phase = 0 # Phase du signal en radians
duree = 1 # Durée du signal en secondes
frequence_echantillonnage = 1000 # Fréquence d'échantillonnage en Hz
# Paramètres du bruit
amplitude_bruit = 0.5# Amplitude du bruit gaussien
# Génération de l'axe temporel
t = [Link](0, duree, int(frequence_echantillonnage * duree), endpoint=False) #
temps de 0 à duree, avec un pas défini par la fréquence d'échantillonnage
# Calcul des deux signaux sinusoïdaux
y1 = amplitude * [Link](2 * [Link] * frequence1 * t + phase)
y2 = amplitude * [Link](2 * [Link] * frequence2 * t + phase)
# Somme des deux signaux pour créer un signal composite
y = y1 + y2
# Ajout du bruit gaussien au signal composite
bruit = amplitude_bruit * [Link](size=len(t)) # Bruit gaussien
y_bruite = y + bruit # Signal composite avec bruit
# Transformation de Fourier (FFT) du signal bruité
Y = [Link](y_bruite) # Appliquer la FFT
n = len(Y) # Nombre d'échantillons
frequences = [Link](n, d=1/frequence_echantillonnage) # Calcul des fréquences
associées
Y_magnitude = [Link](Y) # Magnitude de la FFT (on prend la partie réelle et imaginaire)
# Filtrer les fréquences et magnitudes pour limiter à 150 Hz
mask = (frequences >= 0) & (frequences <= 150) # Créer un masque pour les fréquences
entre 0 et 150 Hz
frequences_filtrees = frequences[mask] # Appliquer le masque pour obtenir les
fréquences filtrées
Y_magnitude_filtree = Y_magnitude[mask] # Appliquer le même masque pour obtenir
les magnitudes filtrées
# Tracer le signal temporel
[Link](figsize=(12, 8))
# Signal composite bruité
[Link](2, 1, 1) # Placer les graphiques dans une disposition 2x1 (2 lignes, 1
colonne)
[Link](t, y_bruite, label=f"Signal composite à 50 Hz et 120 Hz avec bruit",
color='orange')
[Link]("Signal Composite à 50 Hz et 120 Hz avec Bruit (Temps)")
[Link]("Temps (secondes)")
[Link]("Amplitude")
[Link](True)
[Link]()
# Tracer le spectre de fréquence (limité à 150 Hz)
[Link](2, 1, 2)
[Link](frequences_filtrees[:n//2], Y_magnitude_filtree[:n//2], label="Spectre de
fréquence (0-150 Hz)", color='green')
[Link]("Spectre de fréquence du Signal avec Bruit (0-150 Hz)")
[Link]("Fréquence (Hz)")
[Link]("Amplitude")
[Link](True)
[Link]()
# Afficher les deux graphiques
plt.tight_layout()
[Link]()
4-2) Graphe de programme
Figure 4: Graphe de signal bruité
par 0.5
4-3) Interprétation graphique
Domaine temporel :
Vous verrez le signal combiné avec du bruit ajouté sur les premières 0.5 secondes.
Le bruit introduit des fluctuations aléatoires et rend le signal plus irrégulier,
surtout dans la première moitié du signal.
Domaine fréquentiel :
Le spectre montrera deux pics principaux à 50 Hz et 120 Hz, mais vous
remarquerez également un légère élargissement ou "contamination" des
fréquences autour de ces pics à cause du bruit ajouté. Le bruit peut également
introduire une légère augmentation de l'amplitude sur des fréquences plus
élevées et plus basses, mais les deux pics principaux devraient rester dominants.
4-4) Ajout d’un bruit de 1s
Figure 5: Graphe de signal avec un
bruit de 1s
Figure 6: Graphe de signal bruité avec
2,87s
4-5) Ajout d’un bruit de 2,87s :
4-6) Interprétations graphiques
Dans le domaine temporel, le signal composite commence avec des sinusoïdes bien
définies à 50 Hz et 120 Hz, mais à partir de 1 seconde, le bruit aléatoire crée des
fluctuations imprévisibles et plus importantes.
Dans le domaine fréquentiel, le spectre montre clairement les composantes de fréquence
aux valeurs 50 Hz et 120 Hz, mais aussi l'impact du bruit, qui génère des composantes
non périodiques et perturbe l'aspect global du spectre, rendant la représentation plus
disséminée.
Une durée courte (0,5 seconde) produit un signal plus propre, tandis qu'une durée plus
longue (2,87 secondes) permet au bruit de perturber beaucoup plus fortement l'analyse
du signal.
5) Synthèse finale
En résumé, l'impact du bruit sur un signal sinusoïdal dépend largement de la durée du
signal. Sur des durées courtes, l'impact du bruit est minimal et le signal reste identifiable
dans le domaine temporel et fréquentiel. À mesure que la durée du signal augmente, le
bruit devient plus significatif, perturbant la forme du signal et introduisant de nouvelles
fréquences dans le spectre. Cela met en évidence l'importance de la durée dans l'analyse
des signaux et la manière dont le bruit peut interférer avec la qualité du signal.
Ces résultats illustrent bien l'importance du temps d'observation pour analyser les
signaux dans des conditions bruitées. Plus le temps d'échantillonnage est long, plus
l'effet du bruit peut être étudié et pris en compte, tout en ayant un impact plus
important sur les signaux sinusoïdaux.