{ "cells": [ { "cell_type": "markdown", "id": "turned-vector", "metadata": {}, "source": [ "# TD1 exo 1 sur le TFSD (Sujet Octave)\n", "\n", "Exécution interactive en ligne ici [![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/balaise31/Signal/master?labpath=discret%2Ftd%2FFREQ_code%2Fexo1_tfsd_octave.ipynb)\n", "\n", "| | Sujet | Corrigé |\n", "|--------|-------|---------|\n", "|Python | [sujet python](./exo1_tfsd.ipynb) | [corrigé python](./exo1_tfsd_corr.ipynb) |\n", "|Octave | [sujet octave](./exo1_tfsd_octave.ipynb) | [corrigé octave](./exo1_tfsd_corr_octave.ipynb) |\n", "\n", "\n", "\n", "Retour au [sujet de TD papier](../TFSD.ipynb)\n", "\n", "\n", "L'axe des temps est discret donc facilement représentable avec $t=k\\,Te$, il suffit de créer un vecteur du temps discret $k$ de -5 à 5 par exemple et de calculer le vecteur temps $t$ qui y correspond (utile pour l'affichage)\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "id": "interested-costs", "metadata": {}, "outputs": [], "source": [ "clear all; close all;\n", "graphics_toolkit(\"gnuplot\"); # pour windows\n", "Fe=0.1; \n", "Te = 1/Fe; \n", "## VOTRE CODE calculant k de -5 à 5: utilisez \"dep:step:fin\" pas de boucle\n", "\n", "\n", "## VOTRE CODE calculant t : le produit entre scalaire et vecteur existe en math\n", "# donc aussi en octave\n", "\n", "\n", "## SHIFT + ENTER pour exécuter la cellule de code.\n", "# pour afficher il suffit de ne pas mettre de ; à la fin d'un calcul" ] }, { "cell_type": "markdown", "id": "protected-purse", "metadata": {}, "source": [ "Dans la TFSD les fréquences sont continues entre 0 et $F_e$ et impossible à stocker dans un ordinateur.\n", "On s'en rapproche avec une résolution très fine $\\Delta_f=0.001$ 𝐻𝑧 (par exemple) comparée à la fréquence d'échantillonnage 𝐹𝑒=1 arbitraire. \n", "\n", "On peut choisir d'échantillonner en fréquence avec 1000 points entre 0 et $F_e$ et en déduire la résolution $\\Delta_f=\\frac{F_e}{1000}$. On peut calculer **inutilement** la TFSD pour des fréquences au-delà de $F_e$ pour vérifier la périodicité du spêctre. " ] }, { "cell_type": "code", "execution_count": null, "id": "other-pickup", "metadata": {}, "outputs": [], "source": [ "Df= Fe/1000; #résolution fine\n", "\n", "## VOTRE CODE: f=\n", "# déclarant le vecteur f de -2.Fe à 2.Fe par pas de Df\n", "\n", "\n", "## VOTRE CODE: N = \n", "# utilisez la fonction 'length' pour calculer le nombre N\n", "# de points du vecteur f \n", "\n", "# une commande magique de jupyter (ce n'est pas du octave) permet de voir les variables\n" ] }, { "cell_type": "markdown", "id": "defined-joint", "metadata": {}, "source": [ "On définit la fonction impulsion unité $\\delta_0[k] = 1$ uniquement si $k=0$, elle joue le même rôle que l'impulsion de Dirac. \n", "\n", "Pour cela on aurait pu faire un fichier dirac.m contenant :\n", "``` octave\n", "function val = delta(k)\n", " if k == 0 \n", " val= 1\n", " else \n", " val = 0\n", " end\n", " return val\n", "``` \n", "Pour faire le *si alors sinon* en une seule ligne on peut profiter d'une astuce où un booléen vrai vaut 1 et un faux vaut 0, donc l'expression \"k == 0\" est un booléen, mais aussi une valeur numérique qui convient. La fonction deviendrait \n", "``` octave\n", "function val = delta(k)\n", " return (k==0)\n", "``` \n", "\n", "Si la fonction tient en une ligne alors on profite des fonctions anonymes. Par exemple f = x^2 -3 deviendrait\n", "``` octave\n", " f = @(x) x.^2 -3\n", "``` \n", "Cette fonction est vectorisée et donc ```f(1:10)``` retourne bien un vecteur de la fonction évaluée en 10 points.\n", "\n", "Déclarez delta et affichez-la :" ] }, { "cell_type": "code", "execution_count": null, "id": "designing-ranking", "metadata": {}, "outputs": [], "source": [ "%% VOTRE CODE : delta = \n", "% déclarant la fonction k |---> delta[k]\n", "\n", "\n", "%% VOTRE CODE : x0 = \n", "% stockez dans un vecteur x0 la valeur de delta \n", "% calculée pour toute les valeur du vecteur k (pas de boucle !)\n", "\n", "\n", "l=2;\n", "%% VOTRE CODE : xl = \n", "% |__c'est un l minuscule pas un 1 ! \n", "% le vecteur des valeurs de delta[k-l]\n", "\n", "\n", "% On affiche vos signaux (pas de : et la valeur est listé)\n", "% première ligne le temps, deuxième les valeurs\n", "signal_x0=[k ; x0] \n", "signal_xl=[k ; xl]\n", "\n", " " ] }, { "cell_type": "markdown", "id": "b2780a60-ac34-42bb-a485-a49dd59d92b8", "metadata": {}, "source": [ "On va utiliser les fonctions d'affichage `stem` et `plot` pour représenter ces signaux.\n", "Pour accéder à de l'aide et tester des commandes : utilisez la console.\n", "\n", "> **Ouvrez une console** :\n", "> File→New→Console (onglet) ou File→New console for notebook (console en bas) \n", "> Choisissez le kernel (octave ici)\n", "\n", "Dans la console tapez `help stem` pour obtenir de l'aide" ] }, { "cell_type": "code", "execution_count": null, "id": "6d089325-24c9-4118-8770-960d1fd5545f", "metadata": {}, "outputs": [], "source": [ "%% VOTRE CODE : stem(...)\n", "% affichant les deux signaux \n", "\n", "% éventuellement utilisez 'hold on' pour ne pas effacer un graphique\n", "% changez le style d'affichage 'r--' rouge avec tirets 'sk' des 'Squares' en blacK\n" ] }, { "cell_type": "markdown", "id": "common-rugby", "metadata": {}, "source": [ "Il suffit ensuite de faire un script TFSD qui fait le calcul pour chaque fréquence contenue dans le vecteur f (supposé être continu de 0 à Fe) avec tous les instants contenu dans k (qui est bien un vecteur d'entiers, mais supposé être infini...)\n", "\n", "C'est déjà fait ! \n", "Faites `help tfsd` dans la console et jetez un œil au script [tfsd](tfsd.m) qui ressemble beaucoup aux scripts de deuxieme année.\n", "\n", "Pour les affichages à gauche temporel, à droite fréquentiel, en haut partie réelle et en bas partie imaginaire, je vous ai fait la fonction [plot_dual](plot_dual.m).\n", "\n", "À vous de mettre les bonnes légendes avec les bonnes sunités." ] }, { "cell_type": "code", "execution_count": null, "id": "accredited-business", "metadata": {}, "outputs": [], "source": [ "%% VOTRE CODE tfsd_x0 =\n", "% appelle la fonction tfsd avec le signal x0 \n", "% pour obtenir de spoints de la tfsd de x0 pour toutes valeur de f\n", "\n", "\n", "%% VOTRE CODE tfsd_xl= \n", "\n", "%% COMPLETEZ les ? : l'appel de plot dual pour indiquer les unités\n", "plot_dual([k; k],\"Unite temps ?\",\n", " [x0; xl],\"Unites Ordonnees ?\",\n", " [f;f],\"Unite frequence ?\",\n", " [tfsd_x0; tfsd_xl],\"Unites Ordonnees ?\",\n", " [\"impulsion 0\";\"impulsion en 2\"],\n", " primalDiscret=true,\n", " dualDiscret=false);" ] }, { "cell_type": "markdown", "id": "distributed-senator", "metadata": {}, "source": [ "On a donc bien tfsd$[\\delta_0][n]= 1$ et tfsd$[\\delta_2][n]= e^{-i\\,2\\pi\\,f\\;2T_e}$\n", "\n", "On peut vérifier autrement qu'à l'œil, en calculant l'énergie de l'erreur entre le calcul et la formule :" ] }, { "cell_type": "code", "execution_count": null, "id": "light-shock", "metadata": {}, "outputs": [], "source": [ "% On calcule exp(-i.2.pi.f.l.Te) pour toutes valeur de f\n", "tfsd_xl_theorique = exp(i*2*pi*f*l*Te);\n", "\n", "% on calcule le vecteur d'erreur entre calcul numérique \n", "% et formule théorique\n", "erreur = tfsd_xl - tfsd_xl_theorique;\n", "\n", "% on calcule la norme au carré de l'erreur \n", "% ||erreur||^2 = <>\n", "norme_carre_erreur = transpose(erreur) * erreur;\n", "size(norme_carre_erreur)" ] }, { "cell_type": "markdown", "id": "tough-andrews", "metadata": {}, "source": [ "Oups le calcul n'est pas bien formé le produit scalaire n'est pas scalaire, mais une grosse matrice !\n", "\n", "> Corrigez ce produit de manière à avoir un produit scalaire !\n" ] }, { "cell_type": "code", "execution_count": null, "id": "impaired-offense", "metadata": { "scrolled": true }, "outputs": [], "source": [ "%% VOTRE CODE : norme_carre_erreur =\n", "% corrigeant l'erreur de dimension des vecteurs\n", "\n" ] }, { "cell_type": "markdown", "id": "3ba6c49e-edb3-49c5-92af-e886496b20f8", "metadata": {}, "source": [ "La norme de l'erreur n'est pas positive !\n", "> Attention `transpose(v)` et `v'` ne sont pas la même chose ! \n", "> `v' = conj(transpose(v))` où v est le conjugué\n", "\n", "Corrigez encore !" ] }, { "cell_type": "code", "execution_count": null, "id": "1847237a-0f95-4627-b5cf-db2cfd5e76bf", "metadata": {}, "outputs": [], "source": [ "%% VOTRE CODE: norme_carre_erreur =\n", "% la norme doit être positive\n" ] }, { "cell_type": "markdown", "id": "82b99f14-6588-4406-b8ab-c867d8050b9a", "metadata": {}, "source": [ "La norme est positive, mais vaut 8000 et donc pas nulle !\n", "\n", "> J'ai mis une erreur bêêêêêête dans l'un des deux signaux (la norme doit être bonne maintenant) \n", "> Affichez les deux signaux `tfsd_xl` et `tfsd_xl_theorique` pour voir qui est faux et quelle erreur bête " ] }, { "cell_type": "code", "execution_count": null, "id": "6a2f2a81-db97-430a-aae5-be7f755af1dd", "metadata": {}, "outputs": [], "source": [ "%% VOTRE CODE : affichant le signal \n" ] }, { "cell_type": "markdown", "id": "c049c394-2d66-45e5-afa4-8ebb6297831f", "metadata": {}, "source": [ "On corrige : on voit que la partie imaginaire est opposée (impaire)....\n", "\n", ">Ça sent l'erreur de signe dans une exponentielle !" ] }, { "cell_type": "code", "execution_count": null, "id": "0706ed44-0e17-46c7-a962-cd0500971d64", "metadata": {}, "outputs": [], "source": [ "%% VOTRE CODE : corrigeant l'erreur et recalculant\n" ] }, { "cell_type": "markdown", "id": "de7f3ae2-69c4-4c57-9af2-9058a582174e", "metadata": {}, "source": [ "Ouf on est bon ! \n", "\n", "On peut **regarder le corrigé** pour voir les différences de style et différents langages\n", " - [exo1 tfsd corrigé octave](exo1_tfsd_corr_octave.ipynb)\n", " - [exo1 tfsd corrigé python](exo1_tfsd_corr_oython.ipynb)\n" ] } ], "metadata": { "kernelspec": { "display_name": "Octave", "language": "octave", "name": "octave" }, "language_info": { "file_extension": ".m", "help_links": [ { "text": "GNU Octave", "url": "https://www.gnu.org/software/octave/support.html" }, { "text": "Octave Kernel", "url": "https://github.com/Calysto/octave_kernel" }, { "text": "MetaKernel Magics", "url": "https://metakernel.readthedocs.io/en/latest/source/README.html" } ], "mimetype": "text/x-octave", "name": "octave", "version": "4.2.2" }, "latex_envs": { "LaTeX_envs_menu_present": true, "autoclose": false, "autocomplete": true, "bibliofile": "biblio.bib", "cite_by": "apalike", "current_citInitial": 1, "eqLabelWithNumbers": true, "eqNumInitial": 1, "hotkeys": { "equation": "Ctrl-E", "itemize": "Ctrl-I" }, "labels_anchors": false, "latex_user_defs": false, "report_style_numbering": false, "user_envs_cfg": false } }, "nbformat": 4, "nbformat_minor": 5 }