Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place. Commercial Alternative to JupyterHub.
Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place. Commercial Alternative to JupyterHub.
Image: ubuntu2204
Lab IV : Identification des paramètres d'une sinusoïde de fréquence connue
Cours "Physique du Numérique" - Portail René Descartes - AMU
Préparé par :
Jean-Marc Themlin (v. 2021-09), Aix-Marseille Université © Contenus à diffusion restreinte, dans le cadre de ce cours.
Remarque
A toutes fins utiles, on rappelle ici qu'une solution de secours (moins pratique, et probablement moins stable) permet d'accéder aux énoncés sur des notebooks fonctionnels sur un serveur distant (Binder) uniquement depuis votre navigateur. Vous pourrez exécuter, modifier et compléter les cellules de code et remplir les cellules de texte ; à l'issue de votre travail, vous pourrez importer (commande Download
dans le menu File) le notebook complété pour le stocker localement sur votre PC et le déposer sur AMeTICE. Pour accéder à Binder pour travailler ce premier TP, il suffit de cliquer sur l'icône ci-dessous et de sélectionner dans le répertoire des fichiers accessibles, le notebook Enonce_Lab_4_Identification_Sinusoides.ipynb ; soyez patient, ça peut prendre quelques minutes pour lancer l'environnement :
Introduction
Le produit scalaire, qui permet de quantifier la ressemblance entre deux signaux numériques et définis sur le même domaine, est défini par : où est la période d'échantillonnage commune aux deux signaux numériques.
Dans ce TP, vous allez utiliser le produit scalaire pour déterminer (identifier) l'amplitude et la phase à l'origine d'une (co)sinusoïde de fréquence connue, qu'on supposera échantillonnée sur l'intervalle entre les temps et par la (co)sinusoïde discrète , avec une période d'échantillonnage . Le signal (co)sinusoïdal d'entrée à analyser est donc représenté par N échantillons de la sinusoïde numérique , avec .
Nous avons montré au cours l'intérêt d'utiliser le produit scalaire entre et une exponentielle complexe de référence (elle fixera notamment l'instant qui détermine le déphasage recherché) à la fréquence , la même que celle de .
Avec l'hypothèse que la durée du signal est un multiple de , le résultat du produit scalaire entre et , qui est un nombre complexe, s'exprime en effet : Par conséquent, le calcul numérique du produit scalaire fournit directement les paramètres estimés : ParseError: KaTeX parse error: Undefined control sequence: \eqalign at position 2: \̲e̲q̲a̲l̲i̲g̲n̲{ & A_{Est} \…
Programmation : Quelques fonctions Python utiles
Exécutez Help(nom_de_la_fonction)
ou nom_de_la_fonction?
pour afficher l'aide des fonctions ci-dessous et comprendre ce qu'elles réalisent.
Dans la bibliothèque standard : len(x), abs(z) où z est un nombre complexe qui s'écrit z = a*1j+b
ou z = c exp(1j*d)
.
Dans la bibliothèque math : floor(x)
Dans la bibliothèque numpy : np.size(t), np.zeros(N), np.angle(z) où z est un nombre complexe.
Dans la bibliothèque matplotlib.pyplot : plt.subplot(2,1,n=1,2)
Boucles for : Examinez l'exemple ci-dessous, qui contient deux exemples de boucles for
. Dans le second, on remplit séquentiellement une liste avec un élément calculé dans la boucle, ce qui nous sera très utile par la suite.
Problème IV-1 : Paramètres d'une sinusoïde
Utilisez la cellule de code ci-dessous pour générer une (co)sinusoïde discrète
Q1: A partir du graphe, déterminez visuellement les paramètres de cette (co)sinusoïde d'expression générale .
Q1-R: Votre réponse ici : A = 25 f0 = 1/6 Phi = -2
Q2: En utilisant le vecteur comme support temporel, vérifiez la validité de votre estimation en superposant au graphe précédent la sinusoïde reconstituée à partir de vos estimations
Q2-R: Votre réponse ici : déterminer les paramètres graphiquement n'est jamais assez précis.
Problème IV-2 : Estimer l'amplitude et la phase d'un signal sinusoïdal de fréquence connue
Utilisez la cellule de code ci-dessous pour construire une fonction Python apc pour calculer l'amplitue et la phase à l'origine d'un signal (co)sinusoïdal discret de fréquence connue .
Les paramètres d'entrée de la fonction seront :
le vecteur support temporel du signal
le signal à analyser (dont vous allez estimer les paramètres)
la fréquence de ce signal
Les paramètres retournés par la fonction seront :
, l'amplitude estimée de la sinusoïde
, la phase à l'origine estimée de la sinusoïde
Test de la fonction
Test 1
Dans la cellule ci-dessous, utilisez le signal généré au IV-1 pour vérifier vos estimations initiales.
Q3 : Remplissez la table ci-dessous avec les résultats de l'estimation visuelle ( IV-1) et de l'estimation numérique.
Estimation "manuelle" | 25 | -2 |
Estimation "automatique" | 25.552487373916517 | -2.0176943010216557 |
Dans la cellule ci-dessous, pour vérifier la validité de l'estimation, superposez dans un graphe la sinusoïde initiale ( IV-1) et la (co)sinusoïde générée à partir des paramètres estimés numériquement (avec apc).
Test 2
Vous allez à présent tester le bon fonctionnement de votre fonction apc sur un signal de paramètres inconnus, hormis bien sûr sa fréquence . Les premières instructions de la cellule ci-dessous vont télécharger dans l'environnement le fichier lab_data.mat, qui contient les variables suivantes :
le vecteur support t_samp
le vecteur signal s_samp, qui contient les échantillons d'une sinusoïde discrète d'une fréquence .
Les valeurs retournées par votre fonction seront les suivants :
la période d'échantillonnage
le nombre total de points que contiennent chacun de ces deux vecteurs
la valeur de l'amplitude estimée
la valeur de la phase à l'origine estimée
Pour vérifier la validité de l'estimation, complétez la cellule de code ci-dessous avec les instructions Python permettant de superposer dans un graphe la sinusoïde initiale (s_samp en fonction de t_samp) avec la (co)sinusoïde générée à partir des paramètres estimés numériquement.
Problème IV-3 : Tests de robustesse de la fonction d'estimation apc
Pour qu'un programme informatique soit opérationnel, il doit être testé de façon très approfondie lors de son développement. Ceci implique notamment d'explorer la plus large zone possible de l'espace des paramètres d'entrée du programme.
Cas non-idéal : Durée du signal différente d'un multiple de
Les formules qui donnent les paramètres estimés ont été établies dans l'hypothèse que la durée du signal est un multiple (entier) de la période du signal , soit .
Mais que se passe-t'il si vous appliquez la fonction apc sur un signal sinusoïdal qui ne contient pas un nombre entier de périodes ?
Dans la cellule de code ci-dessous, générez le signal indiqué :
Q4 : Que vaut la période de ? Combien de périodes (chiffre décimal !) contient le signal ?
Q4-R (votre réponse ici) : la période s[n] est 3. le signal s[n] contient D/T = 8/3 = 2,67périodes.
Q5 : Que valent les paramètres de cette (co)sinusoïde d'expression générale ?
Q5-R (votre réponse ici) : d'après la fonction apc A = 7.802284479558461 phi = -1.5250792646745612 f0 = 1/3
Complétez la cellule de code ci-dessus pour estimer avec apc l'amplitude et la phase à l'origine de .
Complétez la table ci-dessous en y incluant les écarts absolus ( et ) et relatifs ( et ) :
Valeur exacte | Valeur estimée | Ecart absolu | Ecart relatif | |
---|---|---|---|---|
Amplitude | > 7.802284479558461 |
8 | environ 0,2 | | | Phase à l'origine | -1.5250792646745612 | -pi/2 | | |
Visualiser la dépendance de l'estimation en fonction de la durée de la sinusoïde
Il est instructif de rechercher les tendances de l'évolution des valeurs estimées par apc en fonction de la durée D du signal sinusoïdal. Le but est de produire une figure montrant comment les résultats de l'estimation évoluent avec la longueur du signal.
A cet effet, dans la cellule de code ci-dessous, l'idée est d'initialiser un vecteur dur (un numpy.array de dimension 1) contenant des valeurs croissantes de la longueur D du signal et de son support temporel.
Ensuite, on utilisera une boucle for
d'indice n pour construire des vecteurs t et s de longueur croissante, t variant entre 0 et une durée variable contenue dans Dur[n]. Dans la même boucle, on applique l'estimateur apc et on stocke les valeurs estimées dans deux vecteurs distincts, qui contiendront toutes les valeurs estimées de et de , qu'on pourra tracer ensuite dans une figure à deux graphes.
Pour fixer les idées, vous pouvez utiliser les paramètres suivants :
Paramètres de la sinusoïde :
Un vecteur D contenant des valeurs croissantes entre 0.25 et
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
/tmp/ipykernel_227/2591129225.py in <cell line: 8>()
9 t = np.linspace(0, n, 1000)
10 s = A*np.cos(2*np.pi*f_0*t + phi)
---> 11 A_prime, Phi_prime = apc(t,s,f0)
12 A_estimation.append(A_prime)
13 Phi_estimation.append(Phi_prime)
NameError: name 'apc' is not defined
Le résultat devrait faire apparaître des oscillations ainsi qu'une décroissance asymptotique de l'erreur des estimations fournies par apc. En vous basant sur l'examen de la figure, répondez aux questions suivantes :
Q6 : Pour quelles valeurs (relatives à ) les estimations de la phase et de l'amplitude égalent-elles les valeurs vraies des paramètres ? De ce fait, proposez une modification de la condition sur la durée (qui doit être égale à un multiple entier de la période ) pour obtenir une estimation exacte.
Q6-R (votre réponse ici) : Les multiples de 1 / f0 sont égalent au vrais valeursD = n*T0
Q7 : A partir de quelle durée l'estimation de l'amplitude diffère-t'elle de moins de 1% de la valeur vraie ?
Indication : L'instruction
plt.ylim(A,A*1.01)
vous permet de restreindre l'échelle en y entre les deux valeurs spécifiées.
Q7-R (votre réponse ici) : A partir de 9 secondes
Q8 : On considérant l'allure des courbes, pouvez-vous dire si on on a en moyenne plus de chances d'obtenir une valeur estimée en excès (supérieure à la valeur vraie) ou une valeur estimée par défaut (inférieure à la valeur vraie) ?
Q8-R (votre réponse ici) : Nous avons plus de chances d'obtenir une valeur estimée en excès
Effet d'une constante ajoutée à
Dans la cellule ci-dessous, générez quelques périodes d'une sinusoïde discrète d'amplitude 1 à laquelle vous ajouterez une constante réelle (positive ou négative). Affichez le résultat dans une figure.
Testez le comportement de votre fonction apc sur ce signal . Vous testerez plusieurs valeurs de la constante pour valider vos observations et votre conclusion.
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
/tmp/ipykernel_227/3042458683.py in <cell line: 3>()
1 t = np.linspace(0,20, 2000)
2 x = np.cos(2*np.pi*1*t+2)+10000
----> 3 plt.plot(t,x)
4 A,phi = apc(t,x,1)
5 print(A,phi)
NameError: name 'plt' is not defined
Q9 : Dans quelle mesure l'estimation réalisée par est-elle affectée par l'addition d'une valeur constante ?
Q9-R (votre réponse ici) :
IV-4 : Compléments : Autres tests de robustesse de la fonction d'estimation apc
Vous n'aurez probablement pas le temps d'effectuer ces exercices de compléments lors de la séance de TP en présentiel. Nous vous conseillons pourtant vivement d'essayer de les résoudre par vous-même, car ils sont très instructifs, et qu'ils inspireront certainement les questions de l'examen de TP terminal.
Effet d'une incertitude sur la fréquence
La fréquence de la sinusoïde est connue avec une certaine précision. Dans cette dernière partie, que vous travaillerez en devoir, le but est de tester la validité de l'estimation de l'amplitude et de la phase lorsque la fréquence supposée connue , celle que l'on fournit à apc, est légèrement différente de la véritable .
Dans la cellule ci-dessous, à l'aide d'une boucle for
, générez un graphe qui permet de visualiser la valeur de l'erreur (absolue ou relative) sur les paramètres estimés et en fonction de la valeur de la fréquence fournie à apc ; on maintiendra à de sa valeur vraie .
Q10 : Dans quelle plage de fréquence l'erreur relative sur l'estimation de l'amplitude reste-t'elle inférieure à 40% ?
Q10-R (votre réponse ici) :
Effet d'un bruit additif gaussien
Si apc devait être utilisée pour estimer phase et amplitude de signaux réels (issus de capteurs ou d'un canal de communication), il y a de fortes chances que ces signaux soient affectés d'un bruit plus ou moins intense.
On peut très facilement simuler un bruit additif gaussien en ajoutant à chaque échantillon du signal des valeurs aléatoires réparties selon une loi normale, i.e. une gaussienne de moyenne et de variance . En Python, l'instruction nois=np.random.randn(N)
génère un vecteur nois comprenant N valeurs (pseudo-)aléatoires distribuées selon la loi normale. On admettra que la puissance de ce bruit est donnée par la variance . Pour obtenir un bruit additif gaussien de puissance , il suffira de multiplier nois par la valeur .
Le rapport signal-sur-bruit (en abrégé SNR pour Signal-to-Noise ratio) quantifie en décibels l'amplitude relative du signal utile et du bruit. Il s'exprime ici : où est l'amplitude de la sinusoïde .
Dans la cellule ci-dessous, générez quelques périodes d'une sinusoïde discrète d'amplitude 1 affectée d'un bruit additif gaussien de puissance , et affichez le résultat dans une figure. Répétez le processus pour les puissances croissantes , et affichez le résultat dans une unique figure (Indication : utilisez
plt.subplot
).Testez le comportement de votre fonction apc sur une sinusoïde d'amplitude fixée à et une puissance de bruit prenant les valeurs successives . Stockez le résultat des estimations successives de l'amplitude et de la phase dans deux vecteurs, et montrez dans une seconde figure leur évolution en fonction de .
Conclusions personnelles
Indiquez ci-dessous le temps approximatif que vous passé à travailler ce TP en-dehors de la séance.
Q11-R (votre réponse ici) : 5h
Ecrivez ci-dessous, en guise de conclusions, quelques phrases décrivant ce que ce TP vous a appris.
Q12 - R : Conclusions personnelles (votre réponse ici) : je n'ai pas bien compris