{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "a05c687c",
   "metadata": {},
   "source": [
    "# Traitement du Signal - TDM4 : Transformée de Fourier\n",
    "\n",
    "---\n",
    "\n",
    "Aujourd'hui, place à la transformée de Fourier. On va voir étape par étape comment faire une bonne transformée de Fourier, sa transformée inverse, comment bien afficher les résultats, bref, la base de la base. Donc prenez le temps de bien comprendre, cela ne va pas être très technique."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "af692984",
   "metadata": {},
   "outputs": [],
   "source": [
    "# A COMPLETER\n",
    "# Chargement des librairies\n",
    "..."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a59e9c07",
   "metadata": {},
   "source": [
    "## Exercice 1 : Comment on fait une bonne transformée de Fourier ?\n",
    "\n",
    "On commence tranquillement, avec un signal simple : une sinusoïde. \n",
    "\n",
    "\\begin{equation*}\n",
    "    s(t) = A  \\sin(2 \\pi f_{0} t)\n",
    "\\end{equation*}\n",
    "\n",
    "Avec $A = 1$ et $f_{0} = 50 Hz$.\n",
    "\n",
    "Le signal évoluera de 0 à 0.1 secondes avec une fréquence d'échantillonage $f_e = 1000 Hz$.\n",
    "\n",
    "Construisez l'axe temporel, le signal sinusoïdal et tracez tout ça."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "15a25b9a",
   "metadata": {},
   "outputs": [],
   "source": [
    "# A COMPLETER\n",
    "# Création de l'axe temporel\n",
    "...\n",
    "\n",
    "# Création du signal sinuisoïdal\n",
    "...\n",
    "\n",
    "# Afficage du signal\n",
    "..."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ca6e94c4",
   "metadata": {},
   "source": [
    "**_QUESTION :_** Avant de faire notre première FFT via NumPy, quelle est l'allure attendue du spectre d'amplitude de $S(f)$ ? Et celle du spectre de phase ?"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2dd5ea6b",
   "metadata": {},
   "source": [
    "**_REPONSE :_**"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5815e79d",
   "metadata": {},
   "source": [
    "Ok, il est l'heure de sauter le pas. On va enfin faire notre première FFT ! Je sais, l'excitation est palpable !\n",
    "\n",
    "Pour cela, nous allons nous appuyer sur la package *numpy.fft*, qui propose plein de fonctions pour réaliser facilement les transformées de Fourier et autre (oui, je ne vous fait pas coder la FFT de A à Z aujourd'hui, je ne suis pas taré non plus). \n",
    "\n",
    "La documentation du package du jour : https://numpy.org/doc/2.0/reference/routines.fft.html\n",
    "\n",
    "**_QUESTION :_** Quelle fonction permet de faire une transformée de Fourier classique ? Que prend-elle en entrée et que renvoit-elle en sortie ?"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "dacd553f",
   "metadata": {},
   "source": [
    "**_REPONSE :_**"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7da43cce",
   "metadata": {},
   "source": [
    "Calculez la transformée de Fourier $S(f)$ de notre signal $s(t)$, et tracez le résultat brut de la sortie."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5893d3d2",
   "metadata": {},
   "outputs": [],
   "source": [
    "# A COMPLETER\n",
    "# Transformée de Fourier du signal s(t) et affichage du signal fréquentiel S(f)\n",
    "..."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5e1bcb63",
   "metadata": {},
   "source": [
    "**_QUESTION :_** Est-ce que le résultat ressemble à quelque chose ?"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2ea41b5a",
   "metadata": {},
   "source": [
    "**_REPONSE :_**"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0076fdf4",
   "metadata": {},
   "source": [
    "Comme vous le voyez, appeler simplement *np.fft.fft* n'est pas suffisant, la fonction ne fait pas tout. On va voir ensemble les étapes manquantes afin d'avoir une transformée de Fourier correcte et interprétable.\n",
    "\n",
    "Tout d'abord, le signal renvoyé est complexe. C'est logique, au vu du calcul effectué. Dans un premier temps, il faut extraire les spectres d'amplitude et de phase du signal *S(f)*, donc la sortie de *np.fft.fft*."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "46326fee",
   "metadata": {},
   "source": [
    "**_QUESTION :_** Comment obtenir théoriquement les spectres d'amplitude et de phase de la transformée de Fourier ?\n",
    "\n",
    "*Note : si vous ne vous en rappelez plus, allez voir dans votre cours...*"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4719f3ef",
   "metadata": {},
   "source": [
    "**_REPONSE :_**"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3d0940b8",
   "metadata": {},
   "source": [
    "Calculez les spectres d'amplitude et de phase de $S(f)$ et tracez les deux résultats **sur deux figures différentes**. \n",
    "\n",
    "*Note : la fonction np.angle va vous être utile*"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "50eef4bb",
   "metadata": {},
   "outputs": [],
   "source": [
    "# A COMPLETER\n",
    "# Calcul et affichage des spectres d'amplitude et de phase de S(f)\n",
    "..."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "dce8996a",
   "metadata": {},
   "source": [
    "**_QUESTION  :_** Est-ce que le résultat correspond à ce que vous aviez prédit précédemment ? Sinon, que constatez-vous ?"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5801f42e",
   "metadata": {},
   "source": [
    "**_REPONSE :_**"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a376acb0",
   "metadata": {},
   "source": [
    "Ok, bon, on voit que c'est loi d'être correct. On va continuer à corriger cela.\n",
    "\n",
    "Comme vous avez pu le constater, l'axe fréquentiel ici est inexistant. C'est normal, on ne l'a pas calculer. Et pour cela, il va nous falloir une fonction NumPy."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b138a794",
   "metadata": {},
   "source": [
    "**_QUESTION :_** Quelle fonction NumPy permet de calculer l'axe fréquentiel de la transformée de Fourier ? Quels sont les paramètres d'entrée, et que renvoit la fonction en sortie ?\n",
    "\n",
    "*Note : pour la retrouver, vous pouvez partir de la documentation de la fonction np.fft.fft*"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fbbe447b",
   "metadata": {},
   "source": [
    "**_REPONSE :_**"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "39528e23",
   "metadata": {},
   "source": [
    "Grâce à votre nouvelle fonction, calculez l'axe fréquentiel de la transformée de Fourier, et tracez les spectres d'amplitude et de phase corrigés"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "82fef6b3",
   "metadata": {},
   "outputs": [],
   "source": [
    "# A COMPLETER\n",
    "# Calcul de l'axe fréquentiel\n",
    "..."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e4d9dd18",
   "metadata": {},
   "source": [
    "**_QUESTION :_** Alors, est-ce que les spectres sont corrects ? Et sinon, que constatez-vous ?"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a7317f9a",
   "metadata": {},
   "source": [
    "**_REPONSE :_**"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d30261aa",
   "metadata": {},
   "source": [
    "Il reste encore 2 étapes ici. D'abord, en utilisant la fonction de tracé *plt.plot*, on remarque que:\n",
    "- Sur le spectre de phase, on voit une discontinuité à 0\n",
    "- Sur les deux spectres, on remarque un trait entre la dernière et la première valeur du spectre : ces points sont reliés\n",
    "\n",
    "Alors, pourquoi ce comportement ? La réponse se trouve dans nos vecteurs.\n",
    "\n",
    "Affichez les valeurs de l'axe fréquentiel (les valeurs du vecteurs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "7eadd289",
   "metadata": {},
   "outputs": [],
   "source": [
    "# A COMPLETER\n",
    "# Affichage des valeurs de l'axe fréquentiel\n",
    "..."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0cbc1ffe",
   "metadata": {},
   "source": [
    "On remarque ici qu'on commence avec les fréquences positives accroissantes (de 0 à 490 Hz), puis les fréquences négatives accroissantes (de -500 à -10 Hz). Cela explique ici les liens entre dernière et première valeur de l'affichage (les fréquences 490 Hz et -500 Hz), et la discontinuité en milieu de graphique (de -10 Hz à 0 Hz). \n",
    "\n",
    "Quelle est la raison de ce phénomène ? C'est lié à la formule utilisée pour calculer la transformée de Fourier discrète (TFD), mais on ne va pas rentrer dans le détail aujourd'hui (on verra ça en détail dans la 2ème partie du semestre durant un autre TDM).\n",
    "\n",
    "Comment corriger ce phénomène ? Avec une autre fonction NumPy ! (Encore, ça fait beaucoup là non ?). On va utiliser une fonction spécifique au package *np.fft*, qui va effectuer un décalage des vecteurs (axe temporel et transformée de Fourier)."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "273c4bd8",
   "metadata": {},
   "source": [
    "**_QUESTION :_** Quelle fonction NumPy permet de calculer le décalage à effectuer sur la transformée de Fourier et l'axe fréquentiel ? Quels sont les paramètres d'entrée, et que renvoit la fonction en sortie ?\n",
    "\n",
    "*Note : pour la retrouver, vous pouvez également partir de la documentation de la fonction np.fft.fft*"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d39b89a1",
   "metadata": {},
   "source": [
    "**_REPONSE :_**"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6e688b47",
   "metadata": {},
   "source": [
    "Appliquez votre fonction retrouvée sur l'axe fréquentiel **ET** la transformée de Fourier et affichez les spectres d'amplitude et de phase"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ec1d3f07",
   "metadata": {},
   "outputs": [],
   "source": [
    "# A COMPLETER\n",
    "# Décalage de l'axe fréquentiel et de la transformée de Fourier et affichage des spectres d'amplitude et de phase\n",
    "..."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1258053a",
   "metadata": {},
   "source": [
    "**_QUESTION :_** Alors, est-ce que les spectres sont corrects ? Et sinon, que constatez-vous ?"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "50663de5",
   "metadata": {},
   "source": [
    "**_REPONSE :_**"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4a51d5d6",
   "metadata": {},
   "source": [
    "On finit avec 2 ajustements, sur chacun des spectres:\n",
    "- Le spectre d'amplitude n'est pas correct, car l'amplitude est fausse. Cela est lié à l'échantillonnage du signal qui n'est pas pris en compte ici dans le calcul. Pour avoir le réel spectre d'amplitude, il faut le diviser par la longueur du signal (taille du tableau), ce qui correspond à la durée du signal (en secondes) multiplié par la fréquence d'échantillonnage (en Hz).\n",
    "- Le spectre de phase est en réalité correct ici, mais c'est juste que pour la quasi totalité du spectre, la phase est calculée sur des valeurs quasi nulles. Il faut donc faire un filtrage pour visualiser le spectre correctement (pour coller à nos attentes), en mettant les valeurs de phase à 0 si l'amplitude est inférieur 1% du maximum de l'amplitude sur le spectre\n",
    "\n",
    "Effectuez les dernières corrections et affichez le résultat final "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "86c6e222",
   "metadata": {},
   "outputs": [],
   "source": [
    "# A COMPLETER\n",
    "# Correction du spectre d'amplitude, filtrage du spectre de phase et affichage des spectres corrigés\n",
    "..."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4aedcf05",
   "metadata": {},
   "source": [
    "Bon, normalement, vous devriez avoir des spectres corrects ! \n",
    "\n",
    "*Si vous n'êtes pas sûrs, appelez votre enseignant, qu'ils vous confirment tout ça...*\n",
    "\n",
    "Comme la précédente séance, je vous invite donc à compléter cette **golden cellule**, permettant de récapituler proprement comment calculer et tracer correctement une bonne transformée de Fourier"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "2bcaa832",
   "metadata": {},
   "outputs": [],
   "source": [
    "# GOLDEN CELLULE A COMPLETER\n",
    "# Transformée de Fourier d'un signal et affichage des spectres d'amplitude et de phase\n",
    "\n",
    "# Paramètres (MODIFIEZ AVEC VOS NOMS DE VARIABLES)\n",
    "# ... : un signal temporel NumPy\n",
    "# ... : la durée du signal \n",
    "# ... : la fréquence d'échantillonnage\n",
    "..."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "387972ca",
   "metadata": {},
   "source": [
    "Voilà, vous savez faire une transformée de Fourier... C'est cool... Maitenant, est-ce que vous savez faire l'inverse ?"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9e0a06a5",
   "metadata": {},
   "source": [
    "---\n",
    "\n",
    "## Exercice 2 : ? reirouF ed eémrofsnart ennob enu taif no tnemmoC\n",
    "\n",
    "Maintenant que vous savez faire une transformée de Fourier, il faut savoir faire la transformée de Fourier inverse. Bon,ce n'est pas très complet non plus, il vous faut pour cela trouver les **2 fonctions** NumPy qui vous permettra de retrouver le signal temporel ainsi que l'axe temporel.\n",
    "\n",
    "On va donc partir d'un signal $X(f)$ fréquentiel et un axe fréquentiel. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "98a6f228",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Création du signal X(f) et de l'axe fréquentiel\n",
    "fe = 2000 # Fréquence d'échantillonnage\n",
    "N = 100\n",
    "\n",
    "df = fe / N\n",
    "\n",
    "freq_X = np.arange(N) * df\n",
    "freq_X -= fe/2\n",
    "\n",
    "# Construction du spectre X(f)\n",
    "X = np.zeros(N, dtype=complex)\n",
    "\n",
    "X[freq_X == 100]  = 250\n",
    "X[freq_X == -100] = 250\n",
    "\n",
    "plt.figure()\n",
    "plt.subplot(2,1,1)\n",
    "plt.plot(freq_X, np.abs(X) / len(X))\n",
    "plt.xticks(np.arange(min(freq_X), max(freq_X)+1, 200.0))\n",
    "plt.title(\"Spectre d'amplitude\")\n",
    "plt.xlabel(\"Fréquence\")\n",
    "plt.ylabel(\"Amplitude\")\n",
    "plt.subplot(2,1,2)\n",
    "plt.plot(freq_X, np.angle(X))\n",
    "plt.xticks(np.arange(min(freq_X), max(freq_X)+1, 200.0))\n",
    "plt.title(\"Spectre de phase\")\n",
    "plt.xlabel(\"Fréquence\")\n",
    "plt.ylabel(\"Phase\")\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f37422d0",
   "metadata": {},
   "source": [
    "**_QUESTION :_** Au vu des spectres de $X(f)$, quel signal $x(t)$ devrait-on obtenir après transformée de Fourier inverse ?"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2734f6f3",
   "metadata": {},
   "source": [
    "**_REPONSE :_**"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "87358043",
   "metadata": {},
   "source": [
    "**_QUESTION :_** Quelles sont les 2 fonctions NumPy à utiliser pour calculer la transformée de Fourier inverse ? Quels paramètres prennent-elles en entrée, et que retournent-elles en sortie ?\n",
    "\n",
    "*Note : Pour trouver ces fonctions, partes de la docuementation de np.fft.fft... oui, encore...*"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fb742fac",
   "metadata": {},
   "source": [
    "**_REPONSE :_**"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "02a2f8e5",
   "metadata": {},
   "source": [
    "A vous de jouer, calculez la transformée de Fourier inverse du signal $X(f)$ et affichez le signal temporel original. 2 indications importantes:\n",
    "\n",
    "- Comme vous avez pu le voir, il n'y a pas de fonction pour calculer l'axe temporel. Maintenant, on sait que le signal commence à 0 seconde, et que la fréquence d'échantillonnage $f_e$ est donnée, donc on peut le recalculer facilement via $np.arange$\n",
    "- Même si le signal temporel peut être uniquement réel, le retour de la transformée de Fourier inverse est un **tableau NumPy complexe**. Il faut donc extraire les composantes réelles et complexes, que vous pouvez tracer sur 2 figures."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "9c4396f2",
   "metadata": {},
   "outputs": [],
   "source": [
    "# GOLDEN CELLULE A COMPLETER\n",
    "# Transformée de Fourier inverse d'un signal fréquentiel et affichage du signal temporel\n",
    "\n",
    "# Paramètres (MODIFIEZ AVEC VOS NOMS DE VARIABLES)\n",
    "# ... : un signal fréquentiel NumPy\n",
    "# ... : la fréquence d'échantillonnage\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "19421f70",
   "metadata": {},
   "source": [
    "**_QUESTION :_** Est-ce que le résultat correspond à ce que vous attendiez ?"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0811669b",
   "metadata": {},
   "source": [
    "**_REPONSe :_**"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "069ff916",
   "metadata": {},
   "source": [
    "---\n",
    "\n",
    "## Exercice 3 : Propriétés de la TF\n",
    "\n",
    "Pour cet exercice, pas de code. Je vous invite à découvrir la plateforme web (encore en cours de développement...) pour visualiser les transformées de Fourier de signaux. Créez plusieurs signaux (fonctions usuelles), et répondez aux questions suivantes."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b47073ef",
   "metadata": {},
   "source": [
    "**_QUESTION :_** Comment un retard $\\tau$ ($y(t) = x(t - \\tau)$) affecte la transformée de Fourier d'un signal ? (en terme d'amplitude et de phase)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ff5123af",
   "metadata": {},
   "source": [
    "**_REPONSE :_**"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5276c767",
   "metadata": {},
   "source": [
    "**_QUESTION :_** Comment un offset $C$ ($y(t) = x(t) + C$) affecte la transformée de Fourier d'un signal ? (en terme d'amplitude et de phase)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "eaafc5e1",
   "metadata": {},
   "source": [
    "**_REPONSE :_**"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ad653612",
   "metadata": {},
   "source": [
    "**_QUESTION :_** Pour 2 signaux $a(t)$ et $b(t)$ (en fréquentiel $A(f)$ et $B(f)$), que donnent les spectres de $c(t) = a(t) + b(t)$ après transformée de Fourier ?"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "57bd0ce9",
   "metadata": {},
   "source": [
    "**_REPONSE :_**"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ee57d56d",
   "metadata": {},
   "source": [
    "Reprenez le signal sinsuoïdal de l'exercice 1 (avec le même échantillonnage et la même durée), sur la plateforme web, mais modifiez la fréquence du signal avec $f_0 = 10,5 Hz$."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5157a698",
   "metadata": {},
   "source": [
    "**_QUESTION :_** Que constatez-vous sur les spectres après transformée de Fourier ? Est-ce que le résultat est en raccord avec ce qu'on devrait avoir théoriquement ?"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cfadece7",
   "metadata": {},
   "source": [
    "**_REPONSE :_**"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d7c80d33",
   "metadata": {},
   "source": [
    "Ce cas illustre la problématique de **fuite spectrale** (vous verrez ça dans quelques semaines en CM et en TDM). Cela est dû à la nature de la FFT : nous ne faisons pas une transformée de Fourier mais une **transformée de Fourier discrète (DFT)**. Cette opération a quelques limitations au niveau du calcul en fonction du signal d'entrée. Bref, on verra ça plus tard, mais c'est pour que voyez bien qu'on ne fait pas exactement une transformée de Fourier avec *np.fft.fft*."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5973d8bd",
   "metadata": {},
   "source": [
    "---\n",
    "\n",
    "## Exercice 4 : Oskour, mon audio est bruité !\n",
    "\n",
    "J'ai fait un enregistrement d'une chanson que j'aime bien, mais je ne sais pas ce qu'il s'est passé, il y a un bruit ultra désagréable. Ca doit être un problème de larsen sûrement. Vous pouvez m'aider ?"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1800e7a4",
   "metadata": {},
   "source": [
    "Chargez le fichier *audio.wav*, et tracez le signal (avec le bon axe temporel hein !)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4253548b",
   "metadata": {},
   "outputs": [],
   "source": [
    "# A COMPLETER\n",
    "# Chargement de l'extrait audio\n",
    "...\n",
    "\n",
    "# Reconstruction de l'axe temporel\n",
    "...\n",
    "\n",
    "# Tracé du signal audio\n",
    "..."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4f92a82b",
   "metadata": {},
   "source": [
    "**_QUESTION :_** A l'écoute de l'audio, que constatez-vous ? A quoi ressemble le bruit ? "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c3c9ca60",
   "metadata": {},
   "source": [
    "**_REPONSE :_**"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b78fc9a7",
   "metadata": {},
   "source": [
    "Effectuez une FFT sur votre audio pour obtenir $A(f)$ et affichez uniquement l'amplitude fréquentielle. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c4125057",
   "metadata": {},
   "outputs": [],
   "source": [
    "# A COMPLETER\n",
    "# Transformée de Fourier réelle du signal de l'audio et affichage du spectre fréquentiel\n",
    "..."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9db77f6c",
   "metadata": {},
   "source": [
    "**_QUESTION :_** Que constatez-vous sur le spectre d'amplitude ?"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "38422669",
   "metadata": {},
   "source": [
    "**_REPONSE :_**"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "93bc41cf",
   "metadata": {},
   "source": [
    "Récupérez les fréquences du bruit à partir des vecteurs créés (non, vous ne l'estimez pas tout seul à partir du graphique...). Pour cela, utilisez des fonctions de recherche au niveau des indices, comme *np.argwhere* par exemple"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4356192f",
   "metadata": {},
   "outputs": [],
   "source": [
    "# A COMPLETER\n",
    "# Récupération des fréquences du bruit\n",
    "..."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cd78def7",
   "metadata": {},
   "source": [
    "Eliminez le bruit identifié en mettant les valeurs de $A(f)$ à zéro aux fréquences identifiées comme celles correspondant au bruit. Affichez de nouveau le spectre d'amplitude de $A(f)$ corrigé."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0d0ddd08",
   "metadata": {},
   "outputs": [],
   "source": [
    "# A COMPLETER\n",
    "# Mise à zéro de A(f) aux alentours du pic du bruit\n",
    "..."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d81c1c0e",
   "metadata": {},
   "source": [
    "Effectuez la transformée de Fourier inverse pour retrouver le signal temporel corrigé, et tracez le signal de l'audio corrigé."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "50e7e400",
   "metadata": {},
   "outputs": [],
   "source": [
    "# A COMPLETER\n",
    "# Transformée de Fourier inverse réelle du signal A(f) et affichage du signal audio filtré\n",
    "..."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a5167d2d",
   "metadata": {},
   "source": [
    "Dernière étape : exportez votre audio corrigé.\n",
    "\n",
    "*Attention : pour l'enregistrer, il faut que votre signal soit codé dans un certain type de données (16 bits entier). Vous pouvez changer le type de données d'un signal x via la ligne suivante:*\n",
    "\n",
    "`x = x.astype(np.int16)`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c3321556",
   "metadata": {},
   "outputs": [],
   "source": [
    "# A COMPLETER\n",
    "# Export du meilleur extrait en fichier WAV\n",
    "..."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "aee153a1",
   "metadata": {},
   "source": [
    "**_QUESTION :_** A l'écoute, comment est l'audio corrigé ? Avez-vous résolu le problème ? Est-ce que l'audio principal est impacté ?"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a65f80dd",
   "metadata": {},
   "source": [
    "**_REPONSE :_**"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d9bb9653",
   "metadata": {},
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "deep",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
