L'objectif de ces TP est d'apprendre à obtenir le spectre d'un signal échantillonné au moyen de la transformée de Fourier discrète. L'analyse spectrale nous permettra de comprendre plus en détail la condition de Nyquist-Shannon. Lorsque cette condition n'est pas vérifiée, on observe en effet un phénomène de repliement de spectre, bien visible sur la représentation fréquentielle du signal.
Dans cette première partie, on verra comment faire l'analyse spectrale d'un signal dont la période est parfaitement connue.
Avertissement : les connaissances à acquérir sur la condition de Nyquist-Shannon et sur la transformée de Fourier discrète sont seulement empiriques : des éléments théoriques sont donnés en annexe pour information mais ne sont pas à connaître.
On considère un signal périodique, représenté par une fonction u d'une variable t réelle, à valeurs réelles, de plus petite période T et de classe par morceaux.
La fréquence fondamentale du signal est :
D'après le théorème de Fourier, cette fonction peut s'écrire comme une somme de sinusoïdes dont les fréquences sont multiples de la fréquence fondamentale. La somme obtenue est la série de Fourier :
Dans certains cas, la somme peut être stoppée à un rang P fini. Dans d'autres cas, il faut en principe considérer la limite .
Le terme de rang n est nommé l'harmonique de rang n du signal : c'est une sinusoïde de fréquence
L'harmonique de rang n est défini par son amplitude Cn (positive) et sa phase à l'origine ϕn.
Le terme constant C0/2, qui peut être vu comme le terme de fréquence nulle, est la valeur moyenne du signal :
La valeur moyenne est notée C0/2 car, comme nous le verrons, l'analyse spectrale fournit le double de la valeur moyenne, soit C0.
Considérons comme exemple une fonction dont la série de Fourier s'arrête au rang P=3 (signal comportant trois harmoniques). Par convention, la période est égale à 1. On place les amplitudes et les phases des harmoniques dans deux listes.
import numpy as np from matplotlib.pyplot import * C = [0.2,1.0,0.5,0.1] phi = [0,0,np.pi/3,np.pi/4] f1 = 1.0 omega = 2*np.pi*f1 def u(t): return C[0]/2+C[1]*np.cos(omega*t)\ + C[2]*np.cos(2*omega*t+phi[1])\ + C[3]*np.cos(3*omega*t+phi[2])
Pour tracer ce signal, il faut l'échantillonner à une fréquence grande devant la fréquence de l'harmonique de rang 3. On peut par exemple calculer 600 points pour deux périodes, ce qui fait 100 points par période pour cet harmonique.
N = 600 Tmax = 2.0 Te = Tmax/N t = np.arange(0,N)*Te x = u(t) figure(figsize=(10,4)) plot(t,x) xlabel('t') ylabel('u') axis([0,2,-3,3]) grid()Figure pleine page
Le spectre du signal est la représentation graphique de l'amplitude Cn en fonction de la fréquence. Un signal périodique a en théorie un spectre discret formé de raies, chacune correspondant à un harmonique. Pour cet exemple, il y a 4 raies : une pour la valeur moyenne (fréquence nulle) et 3 raies pour les harmoniques de rang 1, 2 et 3 :
figure(figsize=(8,4)) stem([0,1,2,3],C,'r') xlabel('f') ylabel('C') axis([-1,5,0,2]) grid()Figure pleine page
Ce spectre constitue une représentation fréquentielle du signal, alors que la courbe tracée plus haut (u en fonction du temps) est sa représentation temporelle.
Dans l'exemple précédent, le spectre comporte une fréquence maximale fmax, la fréquence de l'harmonique de rang 3. Une fonction de classe admet une fréquence maximale car ses coefficients de Fourier sont nuls à partir d'un certain rang. On dit que le spectre est à bande de fréquences limitée s'il existe une fréquence maximale, c'est-à-dire dire si la série de Fourier peut être stoppée à un rang P. On a bien sûr fmax=Pf1.
Condition de Nyquist-Shannon : l'échantillonnage d'un signal périodique dont le spectre est à bande de fréquences limitée, c.a.d. qu'il admet une fréquence maximale , doit se faire à une fréquence d'échantillonnage strictement supérieure au double de la fréquence maximale :
Si cette condition est vérifiée, il est théoriquement possible de reconstruire entièrement le signal à partir des échantillons. Ce résultat constitue le théorème de Shannon, dont l'énoncé complet (qui n'est pas à connaître) est donné en annexe avec la formule théorique permettant de reconstruire le signal.
Cette condition est très importante en pratique, car elle indique la fréquence d'échantillonnage minimale qu'il faut adopter pour ne pas perdre l'information contenue dans le signal analogique d'origine.
Un exemple de signal dont le spectre n'est pas à bande limitée est le signal créneau idéal. Il est théoriquement impossible d'échantillonner un signal créneau idéal sans perdre d'information sur ce signal. On comprend en effet que les discontinuités du signal ne peuvent être restituées à partir du signal échantillonné, quelle que soit la fréquence d'échantillonnage. Il en va de même pour un signal continu dont la dérivée n'est pas continue (par ex. le signal triangulaire).
Certains signaux réels sont à bande de fréquences limitée mais la fréquence maximale est si grande qu'il est impossible de satisfaire la condition de Nyquist-Shannon avec le matériel dont on dispose. Dans ce cas, il faut trouver une fréquence d'échantillonnage assez grande pour que les harmoniques dont la fréquence est supérieure à la moitié de aient un effet négligeable sur la forme du signal.
Nous allons voir comment la représentation fréquentielle d'un signal permet de comprendre la condition de Nyquist-Shannon.
La transformée de Fourier discrète (TFD) est la transformation mathématique qui permet d'obtenir le spectre d'un signal numérique (c.a.d. d'un signal échantillonné). La TFD est définie en annexe pour information. La définition précise de la TFD n'est pas à connaître et la lecture de cette annexe n'est pas nécessaire en première approche, mais elle permet de comprendre les propriétés de la TFD que nous allons observer et qu'il faut connaître.
La TFD est une application qui, à partir de N échantillons consécutifs d'un signal numérique, fournit N nombres complexes :
\begin{align} {\rm TFD} :\ &\mathbb{R}^N\rightarrow \mathbb{C}^N\\ &(u_0,u_1,\ldots u_{N-1})\rightarrow (\underline F_0,\underline F_1,\ldots \underline F_{N-1}) \end{align}Lorsqu'on connaît la période du signal (c'est rarement le cas en pratique), on choisit ces N échantillons répartis sur exactement une période. On peut le faire avec l'exemple précédent, en respectant la condition de Nyquist-Shannon. Voici un échantillonnage comportant 30 échantillons répartis sur une période :
N = 30 T = 1.0 Te = T/N t = np.arange(0,N)*Te x = u(t) figure(figsize=(10,4)) plot(t,x,"o") xlabel('t') ylabel('u') grid()Figure pleine page
Remarque : l'échantillon de l'instant t=T ne doit pas figurer dans le tableau, car il figure déjà à l'instant t=0. Il ne faut donc pas utiliser la fonction numpy.linspace pour générer le tableau des instants.
Pour calculer la transformée de Fourier discrète, on utilise l'algorithme de transformée de Fourier rapide. C'est pourquoi la fonction qui le fait dans python est numpy.fft.fft (FFT : Fast Fourier Transform). Voici comment on l'utilise :
from numpy.fft import fft tfd = fft(x)
On obtient ainsi le tableau des N nombres complexes .
On suppose que l'échantillonnage a été fait en respectant la condition de Nyquist-Shannon. Comme expliqué en annexe, les N/2 premiers éléments de la TFD sont les coefficients de Fourier complexes du signal (à condition que T soit exactement sa période) :
Par ailleurs, est le complexe conjugué de (pour ).
Si N est pair, la TFD est donc constituée des coefficients de Fourier et de leurs conjugués dans l'ordre suivant :
Si N est impair, la TFD est constituée des coefficients de Fourier et de leurs conjugués dans l'ordre suivant :
La fréquence associée à l'élément d'indice n est égale à n fois la fréquence fondamentale :
Plus généralement, nous verrons que T n'est pas nécessairement la période du signal mais désigne la durée du signal échantillonné (nombre d'échantillons multiplié par la période d'échantillonnage). L'échelle de fréquence associée à la TFD se construit en utilisant la règle suivante : la résolution fréquentielle de la TFD est l'inverse de la durée du signal échantillonné. Les fréquences sont 0, 1/T, 2/T, etc. Voici donc comment on construit la liste des N fréquences :
freq = np.arange(N)*1.0/T
La transformée de Fourier discrète d'un signal échantillonné, de durée T et comportant N échantillons, conduit à un spectre constitué de N raies dont les fréquences sont espacées de
La première fréquence du spectre est nulle, la dernière est .
Pour obtenir le spectre, on doit calculer le module de la TFD et multiplier par 2/N (voir annexe pour la justification de ce coefficient) :
figure(figsize=(10,5)) spectre = np.absolute(tfd)*2.0/N stem(freq,spectre) xlabel("f") ylabel("Amplitude") grid()Figure pleine page
Dans la partie à gauche, on reconnaît le spectre du signal analogique, avec le terme constant, le fondamental et les harmoniques de rang 2 et 3. On remarque que le terme de fréquence nulle est bien C0, c'est-à-dire le double de la valeur moyenne.
On voit dans la partie à droite des raies de même hauteur mais disposées symétriquement par rapport à la fréquence médiane (ici 15). Une réplique de la raie de fréquence f1 se trouve à la fréquence fe-f1, une réplique de la raie de fréquence 2f1 se trouve à la fréquence fe-2f1, et une réplique de la raie de fréquence 3f1 se trouve à la fréquence fe-3f1.
Pour un signal échantillonné, à chaque raie du spectre de fréquence f (strictement positive) est associée une raie image de même amplitude située à la fréquence fe-f. Les valeurs complexes d'une raie et de sa raie image sont conjuguées.
Si l'on s'intéresse au spectre du signal analogique, on ne retient que la première moitié, pour les fréquences allant de 0 à 15. Il faut noter que la fréquence médiane, appelée aussi fréquence de Nyquist, est la moitié de la fréquence d'échantillonnage. Le dernier point du spectre correspond à la fréquence fe-1/T.
Comme il est démontré en annexe, le spectre complet d'un signal échantillonné à la fréquence fe est en fait périodique, de période fe. Il faut donc imaginer une répétition périodique du spectre précédent, aussi bien à gauche qu'à droite. Voici une représentation du spectre sur 3 périodes :
spectre_etendu = np.concatenate((spectre,spectre,spectre)) figure(figsize=(10,5)) stem(spectre_etendu) xlabel("f") ylabel("Amplitude") grid()Figure pleine page
Le spectre d'un signal échantillonné à la fréquence fe est périodique, de période fe.
Pour que la première moitié du spectre du signal échantillonné (fréquences de 0 à fe/2) corresponde effectivement au spectre du signal analogique, il faut que l'échantillonnage soit fait en respectant la condition de Nyquist-Shannon. Dans cet exemple, c'est encore le cas avec 7 échantillons par période :
N = 7 Te = T/N t = np.arange(0,N)*Te x = u(t) tfd = fft(x) freq = np.arange(0,N)*1.0/T figure(figsize=(10,5)) stem(freq,np.absolute(tfd)*2.0/N) xlabel("f") ylabel("Amplitude") axis([0,7,0,1]) grid()Figure pleine page
Voici ce qu'il arrive si la condition de Nyquist-Shannon n'est pas vérifiée, avec seulement 5 échantillons par périodes :
N = 5 Te = T/N t = np.arange(0,N)*Te x = u(t) tfd = fft(x) freq = np.arange(0,N)*1.0/T figure(figsize=(10,5)) stem(freq,np.absolute(tfd)*2.0/N) xlabel("f") ylabel("Amplitude") axis([0,5,0,1]) grid()Figure pleine page
Le spectre obtenu dans la première moitié ne comporte que trois raies, de fréquences 0,1 et 2. Il ne correspond pas au spectre du signal analogique, ce qui montre qu'une information a été perdue lors de l'échantillonnage.
Plus généralement, supposons que le spectre du signal analogique possède une fréquence maximale fmax (signal à bande de fréquences limitée). La figure suivante montre le spectre du signal échantillonné lorsque la condition de Nyquist-Shannon est vérifiée et lorsqu'elle ne l'est pas. Dans le premier cas (échantillonnage suffisant), le spectre du signal analogique et le spectre image ne se recouvrent pas. On conçoit alors qu'un filtrage passe-bas du signal échantillonné permette en principe de reconstruire le signal analogique (filtre passe-bas idéal avec une fréquence de coupure fe/2). En revanche, dans le second cas (sous-échantillonnage), le spectre du signal échantillonné présente un recouvrement entre le spectre du signal analogique et son spectre image. Ce phénomène est nommé repliement spectral car le spectre image se replie dans la bande de fréquence [0,fe/2]. Dans ce cas, la recontruction du signal par un filtrage passe-bas idéal de fréquence de coupure fe/2 donnerait un signal analogique différent du signal de départ car son spectre dans la bande de recouvrement est modifié.
Figure pleine pageCette partie est un travail numérique à réaliser en Python, dans un notebook à enregistrer dans le dossier partage/TP/TP2 et dans un sous-dossier nommé NOM1-NOM2.
L'analyse spectrale d'un signal périodique consiste à déterminer ses coefficients de Fourier au moyen de la TFD et à tracer son spectre. Si le signal est à bande de fréquences limitée, les coefficients de Fourier sont nuls à partir d'un rang P+1. Cependant, des erreurs d'arrondis font que les coefficients de Fourier obtenus par la TFD ne sont pas tout à fait nuls à partir du rang P+1. En conséquence, la valeur de P ne peut pas être déterminée avec certitude et on doit se contenter de choisir une valeur de P raisonnable, au delà de laquelle on considère que les coefficients de Fourier sont négligeables.
On cherche à faire l'analyse spectrale d'un signal défini par une fonction Python. Pour récupérer cette fonction, aller dans le dossier partage/TP/TP2 et copier les fichiers signalA.npy et signalPeriodiqueA.py dans votre sous-dossier NOM1-NOM2. L'importation de la fonction signal se fait par :
from signalPeriodiqueA import signal
La signature de cette fonction est signal(t). La période du signal est T=1.
[1] Obtenir une représentation temporelle du signal sur l'intervalle [0,1] avec N=1000 échantillons.
[2] Au moyen de la transformée de Fourier discrète, obtenir une représentation fréquentielle du signal. Déterminer si le signal est à bande de fréquences limitée. Si c'est le cas, combien possède-t-il d'harmoniques ?
[3] Afficher les coefficients de Fourier complexe du signal. D'après ces valeurs, quelle est la valeur moyenne du signal ?
[4] Avec ces coefficients, calculer la somme partielle de Fourier pour reconstituer le signal. Tracer ce signal reconstitué avec le signal échantillonné et comparer.
[5] À quelle condition sur N la condition de Nyquist-Shannon est-elle satisfaite pour ce signal ?
[6] Réaliser un échantillonnage avec un nombre d'échantillons égal au nombre minimal. Montrer la représentation temporelle et le spectre. Obtient-on les mêmes coefficients de Fourier que précédemment ?
[7] Réaliser un échantillonnage avec un nombre d'échantillons égal à la valeur minimale moins un. Montrer la représentation temporelle et le spectre. Commenter le spectre obtenu. Quel phénomène observe-t-on sur le dernier harmonique ?
[8] Réaliser un échantillonnage avec un nombre d'échantillons égal à la valeur minimale moins deux. Montrer la représentation temporelle et le spectre. Quelles raies du spectre sont affectées par le repliement ?
Considérons à présent le signal défini par la fonction suivante :
Cette fonction périodique est de classe , ce qui implique que son spectre est à bande de fréquences limitée.
[9] Faire une analyse spectrale de ce signal. Déterminer le nombre d'harmoniques qu'on peut attribuer à ce signal.
[10] Avec les coefficients de Fourier calculés par l'analyse spectrale, tracer la somme partielle de Fourier et comparer à .
Soit un signal u(t) dont le spectre admet une fréquence maximale fmax et un échantillonnage effectué à une fréquence d'échantillonnage fe telle que :
Le signal u(t) peut être entièrement reconstitué à partir des échantillons, selon la relation :
La formule ci-dessus (formule de Shannon) suppose que l'on dispose d'une infinité d'échantillons, ce qui est bien sûr impossible en réalité. En raison du nombre fini d'échantillons, la reconstruction du signal à partir des échantillons est imparfaite, mais elle est d'autant meilleure que la fréquence d'échantillonnage est grande devant 2fmax. En pratique, on n'utilise pas la formule de Shannon pour reconstruire un signal car sa mise en œuvre est beaucoup trop complexe d'un point de vue calculatoire : l'évaluation de u(t) à un instant donné nécessiterait le calcul de la somme de N termes, ce qui fait une complexité globale en aN2 pour calculer aN échantillons. Il est en revanche possible de reconstruire le signal en utilisant des méthodes de traitement de signal numérique (augmentation de la fréquence d'échantillonnage et filtrage numérique passe-bas). Lorsque c'est possible, il est préférable de réaliser un sur-échantillonnage () et de faire la reconstruction par interpolation linéaire.
Le coefficient de Fourier complexe d'une fonction u(t) de période T est défini par :
Soit un échantillonnage de N points répartis sur l'intervalle [0,T] :
La méthode des rectangles permet d'obtenir une approximation du coefficient de Fourier complexe :
On pose donc :
La transformée de Fourier discrète de rang N d'un signal échantillonnée est l'application définie par :
\begin{align} {\rm TFD} :\ &\mathbb{R}^N\rightarrow \mathbb{C}^N\\ &(u_0,u_1,\ldots u_{N-1})\rightarrow (\underline F_0,\underline F_1,\ldots \underline F_{N-1}) \end{align}Si n<N/2, le nombre complexe , multiplié par 2/N, est une approximation du coefficient de Fourier complexe de la fonction périodique de période T. La TFD définit le spectre du signal échantillonné. Le nombre complexe , multiplié par 2/N, est la composante de fréquence n/(NTe) du spectre du signal échantillonné.
Théorème : si la fonction u(t) de période T est à bande de fréquence limitée et si elle est échantillonnée sur l'intervalle [0,T] en respectant la condition de Nyquist-Shannon, alors pour n<N/2. Dans ce cas, la TFD donne exactement les coefficients de Fourier (au facteur 2/N près). Il s'agit d'une égalité théorique : en réalité, le calcul de la TFD est affecté d'erreurs d'arrondis qui fait que n'est pas nul même si le coefficient de Fourier correspondant est nul.
Considérons le terme N-n de la TFD, avec :
où désigne le complexe conjugé de z. La représentation du spectre en amplitude consiste à tracer le module de en ordonnée et la fréquence en abscisse. La propriété :
implique que la composante du spectre de fréquence a la même amplitude que celle de fréquence .
Une autre propriété importante de est :
Le spectre du signal échantillonné est défini par la relation pour $n\in\mathbb{Z}$. Le spectre du signal échantillonné est donc de période N et la donnée des N nombres complexes définit entièrement ce spectre.