PYTHON TP 2 matplotlib, numpy,scipy Vous devez rendre des programmes commentés et expliquer vos choix de conception : choix des structures de données, enchaînement des fonctions,.... 1. Prise en main de matplotlib Références : numpy : http://docs.scipy.org http://wiki.scipy.org/Tentative_NumPy_Tutorial matplotlib : http://matplotlib.org/ Depuis l'interpréteur python afficher la courbe représentative de la fonction : y ( x )=4⋅e−0.5x⋅sin (2x) sur l'intervalle [-4;4] avec 1000 points. On utilisera les modules numpy et matplotlib.pyplot et notamment : arange ou linspace, plot, show et savefig. Utilisez les fonctions mathématiques de numpy de préférence aux fonctions de même nom de math car elles peuvent prendre directement des vecteurs en paramètres (array de numpy ou liste de python). Ajouter votre nom en titre et modifier les couleurs pour obtenir ceci : Tp2 python P3 1/1 PYTHON TP 2 matplotlib, numpy,scipy Sauver le graphique en png. Donner la liste des instructions utilisées. Ajouter sur les mêmes axes la fonction en couleur verte : z ( x )=4⋅e−0.3x⋅sin(3x) Créer un graphique montrant y et z comme ci dessous (dans un programme python) : Tp2 python P3 2/1 PYTHON TP 2 matplotlib, numpy,scipy 2. Exploiter des données issues d'un fichier De nombreux fichiers de mesures utilisent le format CSV (coma separated value). Les bibliothèques matplotlib, numpy et scipy proposent des fonctions évoluées pour lire des fichiers. Cependant les fichiers sont rarement standards et il est important de savoir écrire ses propres fonctions de lectures pour pouvoir s'adapter à chaque cas particulier. Les fichiers DATALOGxxxxx.TXT contiennent des données issues d'une station de mesures implantée sur l'île de Port Cros. L'organisation des fichiers est donnée dans le fichier format_station_v1.txt. A partir d'un fichier de mesures, créer 3 fichiers distincts. Le premier contenant les messages de service, le deuxième les données principales, le troisième les données de lumière. Le nom des fichiers sera formé à partir du nom du fichier de base avec les extensions service , all et lum pour respectivement service, données principales et lumière. Attention : ces fichiers ont été obtenu lors du test de la station qui à ce stade présentait un bug qui fait que la trame $ est parfois tronquée. Dans ce cas la trame % qui suit se trouve sur la même ligne. Essayez de récupérer le plus de données possibles. Les données absentes des trames $ tronquées seront remplacées par --Afficher les températures moyenne, maximale et minimale pour un fichier. Donner le temps à laquelle on a les valeurs maximale et minimale. Tracer l'évolution de la température en fonction du temps. Tracer l'évolution de l'écart entre les deux capteurs de température en fonction du temps. Tracer l'évolution de la température et de l'humidité en fonction du temps sur un même graphique : même axe des x et deux axes y distincts (voir twinx) Tracer l'évolution de la tension batterie en fonction du temps. Attention aux données absentes. Tracer l'évolution des données de lumière du jour. Faire apparaître les saturations. NB : On demande des "beaux graphiques" exploitant la richesse des fonctionnalités de matplotlib. En particulier doivent apparaître au minimum : le nom du fichier de mesure, les unités et une légende. Tp2 python P3 3/1 PYTHON TP 2 matplotlib, numpy,scipy 3. Curve Fitting Le fichier thermistance.csv contient la valeur de la résistance mesurée en fonction de la température pour deux thermistances. Le format est le suivant : #t(°C);Rth1(Ohm);Rth2(Ohm) ­40;57658;101275 ­35;42410;76325 .… Faire un graphique de la résistance en fonction de la température. R(T )=RT ⋅e(B (1/T −1/T )) 0 0 En première approximation, la résistance d'une thermistance suit la loi : où T est la température absolue en kelvin : T ( K )=t (° C )+ 273,15 K et R T est la résistance à la température absolue T 0 0 L'objectif est de trouver la "meilleure" valeur pour les paramètres R T et B en fonction des valeurs mesurées. On cherche la valeur des paramètres qui minimisent l'erreur entre la courbe réelle et la courbe estimée par la formule. En général on choisit un critère quadratique (somme des carrés des écarts) à minimiser. Voir : méthode des moindres carrés (least square). Les algorithmes peuvent être assez complexes car il faut éviter de s'arrêter sur des minimums locaux. 0 La bibliothèque python scpipy fournit une fonction d'optimisation très puissante utilisant cette méthode appelée curve_fit Voir : docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.curve_fit.html (et bien comprendre l'exemple) Les fonctions à optimiser doivent être écrites en python avec les fonctions mathématiques de numpy car elles doivent pouvoir être utilisées avec des listes (et des array de numpy). En particulier utilisez np.add pour les additions. Estimer les paramètres R T et B pour les deux thermistances en fixant t 0 à 25°C. 0 Tp2 python P3 4/1 PYTHON TP 2 matplotlib, numpy,scipy Faire un graphique montrant les points de mesures, la courbe estimée obtenue ainsi que l'écart (en Ohm) entre les valeurs mesurées et les valeurs calculées. Pour améliorer l'approximation on peut utiliser la formule : R(T )=RT ⋅e ( A+ B C D + + ) T T 2 T3 0 Estimer les paramètres R T , A,B,C,D pour les deux thermistances. Faire un graphique montrant les points de mesures, la courbe estimée obtenue ainsi que l'écart (en Ohm) entre les valeurs mesurées et les valeurs calculées. 0 4. Estimation de la fréquence à l'aide de la Transformée de Fourrier Discrète Le format wav est un format très utilisé pour stocker des fichiers audio. Comme il s'agit d'un format non compressé (en général), on peut l'utiliser pour stocker un signal échantillonné quelconque issu d'une expérience. Le fichier sample.wav contient les valeurs d'un signal échantillonné à 8kHz. Le module scipy.io contient des fonctions de lecture et d'écriture de fichier wav. Créer un graphique de ce fichier et montrer que le signal présente principalement deux fréquences. Estimer ces deux fréquences. Faire un graphique du signal entre 2.95 et 3,02s dans lequel la plus haute fréquence apparaît en rouge et la plus basse en vert. La Transformée de Fourier Discrète (TFD) est une opération mathématique qui permet d'obtenir le spectre échantillonné d'un signal échantillonné. Si on dispose de N valeurs d'un signal aux instants n⋅T s , n∈[0...N−1] , la TFD donne N valeurs (en général complexes) de la transformée de Fourier de ce signal aux fréquences k⋅ f s / N avec k ∈[−N /2 ; N / 2−1] et f s =1/T s Pour un signal réel, les valeurs pour k et -k sont complexes conjuguées (le spectre est symétrique par rapport à la fréquence 0). Le spectre en amplitude est obtenu en prenant le module de valeurs de la TFD. Voir : http://fr.wikipedia.org : Transformée de Fourier Discrète http://docs.scipy.org/doc/numpy/reference/routines.fft.html#module-numpy.fft Pour calculer la TFD, on utilise souvent l’algorithme rapide appelé FFT. Cet algorithme est implémenté dans le module fft de numpy. Tp2 python P3 5/1 PYTHON TP 2 matplotlib, numpy,scipy Il faut bien comprendre comment sont classés les coefficients (voir Implementation details). On peut utiliser fftfreq pour retrouver les fréquences réelles en fonction de fe Tracez le spectre du signal de l'exercice précédent entre 0 et 4kHz pour faire apparaître les deux fréquences détectées précédemment. 5. Décodage d'un signal DTMF Le code DTMF est utilisé pour la numérotation en téléphonique analogique ainsi que pour l'interface utilisateur des serveurs vocaux (messageries, hotline, etc...). On peut encoder 16 caractères par un signal composé de deux fréquences choisies parmi deux groupes de quatre. Généralement on encode les touches que l'on trouve sur les claviers des téléphones : les chiffres de 0 à 9 ainsi que les caractères A,B,C,D, * et #. Chaque code est composé d'une fréquence du groupe haut (1029,1336,1477,1633Hz) et d'une fréquence du groupe bas (697,770,852,941 Hz) selon le tableau ci dessous : 697 Hz 770 Hz 852 Hz 941 Hz 1 209 Hz 1 4 7 * 1 336 Hz 2 5 8 0 1 477 Hz 3 6 9 # 1 633 Hz A B C D 5.1 / Justifier le choix des valeurs des fréquences. 5.2/ Le fichier dtmf.wav contient une séquence DTMF numérisée à 8kHz. (On trouve de nombreux sites qui permettent de générer des fichiers wav contenant une séquence DTMF donnée. Par exemple : http://dialabc.com/sound/generate/ ) On souhaite écrire un programme qui décode la séquence DTMF. Pour cela on propose l'algorithme rudimentaire (mais néanmoins fonctionnel) suivant : On calcule le spectre d'une tranche de 100ms du signal et on s'intéresse aux valeurs présentes dans les échantillons dont les fréquences correspondent le mieux aux 8 fréquences attendues. On considère que la fréquence basse transmise est la fréquence pour laquelle le niveau est le maximum parmi les 4 échantillons de la DFT correspondant aux Tp2 python P3 6/1 PYTHON TP 2 matplotlib, numpy,scipy fréquences basses. On procède de même pour la fréquence haute. De manière à pouvoir distinguer les pauses entre les codes, on ne considère qu'un code est valide seulement si les niveaux de la fréquence haute et de la fréquence basse sont supérieurs à un seuil. Montrer que la résolution fréquentielle de la DFT est suffisante pour ce problème pour 100ms de signal échantillonné à 8kHz. Programmer cet algorithme. Attention un code peut durer plus de 100ms, le décodeur ne doit délivrer qu'un seul code, si le même code est présent sur plusieurs tranches de 100ms. Votre programme doit être facilement paramétrable pour s'adapter à différentes fréquences d'échantillonnage (supérieure à 8kHz). 5.3/ Dans une application réelle les séquences audio à traiter sont souvent bruitées et peuvent comporter des signaux qui ne sont pas des codes DTMF : voix, bruits ambiants,musiques. Améliorer votre algorithme en calculant un critère de confiance sur le code DTMF détecté. La sortie du décodeur ne sera exploitée que lors le niveau de confiance sera suffisant. Évaluer votre algorithme dans différentes situations à partir de fichiers audio. Tp2 python P3 7/1