Soit u(t) un signal de période T développable en série de Fourier :
Les coefficients de Fourier sont, pour :
On considère un échantillonnage de u(t) de N points, avec :
Une approximation des coefficients de Fourier peut être obtenue par la méthode des rectangles :
La formule obtenue définit une suite de période N. Il suffit donc de calculer, pour :
L'application qui associe à la suite de N nombres uk la suite Sn est la transformée de Fourier discrète (TFD). Sn est une approximation du coefficient de Fourier cn, correspondant à l'harmonique de fréquence :
La fonction permettant de calculer la TFD (par l'algorithme de transformée de Fourier rapide) est :
Fourier[{s0,s1,...,sN-1},FourierParameters->{a,b}]qui calcule la somme suivante (indice n de 1 à N) :
Pour obtenir la TFD définie plus haut, il faut donc poser a=-1 et b=-1.
On définit un signal sous forme de polynôme trigonométrique de période T :
T = 1; w0 = 2*Pi*T; signal[t_] := 1 + 2*Cos[w0*t] + 0.5*Cos[2*w0*t] + 1*Sin[3*w0*t] + 0.2*Cos[10*w0*t];
Plot[signal[t], {t, 0, 1},AxesLabel->{'t','s'}]plotA.pdf
Échantillonnage du signal :
npoints = 50; (* nombre de points *) te = T/npoints; (* temps d'echantillonnage *) temps[k_] := (k - 1)*te; echantillons = Table[signal[temps[k]], {k, npoints}];
Calcul de la TFD et tracé du spectre (module de |Sn|) :
coefFourier = Fourier[echantillons, FourierParameters -> {-1, -1}]; frequences[k_] := (k - 1)/T; raies = Table[Line[{{frequences[k], 0}, {frequences[k], Abs[coefFourier[[k]]]}}], {k, npoints}];
Show[Graphics[{RGBColor[1,0,0],raies},Frame->True,PlotRange->{{0,npoints/T},{0,1}}, AspectRatio->0.6,FrameLabel->{'f','|Sn|'}]]plotB.pdf
On reconnait sur la première moitié du spectre les coefficients de Fourier c0=1, c1=2/2, c2=0.5/2, c3=-j/2, c10=0.2/2
On remarque la propriété suivante :
En effet, si la fonction u(t) est à valeurs réelles, on a :
La deuxième partie du spectre (appelée aussi l'image du spectre) correspond donc aux coefficients de Fourier d'indices négatifs :
Il y a par ailleurs la périodicité de la suite Sn :
On obtient donc un spectre dont la périodicité est la fréquence d'échantillonnage
C'est effectivement le spectre d'un signal échantillonné à cette fréquence.
Pour simplifier, définissons une fonction calculant le spectre pour une fréquence d'échantillonnage donnée :
raiesSpectre[npoints_]:=Module[{te,temps,echantillons,frequences}, te = T/npoints; temps[k_] := (k - 1)*te; echantillons = Table[signal[temps[k]], {k, npoints}]; coefFourier = Fourier[echantillons, FourierParameters -> {-1, -1}]; frequences[k_] := (k - 1)/T; Return[Table[Line[{{frequences[k], 0}, {frequences[k], Abs[coefFourier[[k]]]}}], {k, npoints}]]; ]
D'après le théorème de Shannon, la fréquence d'échantillonnage doit être supérieure (strictement) au double de la plus grande fréquence présente dans le spectre du signal (10 fois 2 sur l'exemple précédent). Voyons ce qu'il advient si cette condition n'est pas vérifiée :
npoints=15; raies = raiesSpectre[npoints];
Show[Graphics[{RGBColor[1,0,0],raies},Frame->True,PlotRange->{{0,npoints/T},{0,1}}, AspectRatio->0.6,FrameLabel->{'f','|Sn|'}]]plotC.pdf
On remarque l'apparition d'une harmonique de rang n=5, position qui correspond en fait à l'image de l'harmonique de rang 10. Ce phénomène est appelé le repliement de bande. Il se produit lorsqu'une partie non négligeable du spectre se superpose à son image.
Considérons le cas d'un signal périodique comportant une fréquence maximale dans son spectre, c'est-à-dire qu'il existe tel que cn=0 pour |n|>p. Dans ce cas, le signal est un polynôme trigonométrique. La condition imposée par le théorème de Shannon est suffisante pour obtenir les coefficients de Fourier de u(t), aux erreurs d'arrondis près. Vérifions-le sur l'exemple précédent en adoptant N=21, c'est-à-dire f_e=21>20.
npoints=21; raies = raiesSpectre[npoints];
Show[Graphics[{RGBColor[1,0,0],raies},Frame->True,PlotRange->{{0,npoints/T},{0,1}}, AspectRatio->0.6,FrameLabel->{'f','|Sn|'}]]plotD.pdf
L'harmonique de rang 10 est bien correctement calculée.
Cet exemple met en évidence les problèmes liés à l'existence de hautes fréquences dans le spectre. On définit le signal sur l'intervalle [0,T] :
T=1 signal[t_]:=If[t<T/2,1,-1];
Dans ce cas, il n'existe pas de fréquence maximale dans le spectre. La précision du calcul sera d'autant plus grande que N est grand.
npoints=100; raies = raiesSpectre[npoints];
Show[Graphics[{RGBColor[1,0,0],raies},Frame->True,PlotRange->{{0,npoints/T},{0,1}}, AspectRatio->0.6,FrameLabel->{'f','|Sn|'}]]plotE.pdf
La valeur relativement importante des harmoniques au voisinage de fe/2 laisse deviner un phénomène de repliement de bande non négligeable. En théorie, les coefficients de Fourier impairs de la fonction créneau vérifient :
Le tableau suivant permet de déterminer la précision du calcul par la TFD :
indices=Table[2*p-1,{p,1,20}]; precision=Table[Abs[coefFourier[[2]]]/Abs[coefFourier[[2*p]]]/(2*p-1),{p,1,20}];
n | |S1|/(n|Sn|) |
1 | 1 |
3 | 0.998684 |
5 | 0.996057 |
7 | 0.992122 |
9 | 0.986892 |
11 | 0.980376 |
13 | 0.972592 |
15 | 0.963556 |
17 | 0.953292 |
19 | 0.941822 |
21 | 0.929174 |
23 | 0.915377 |
25 | 0.900464 |
27 | 0.884471 |
29 | 0.867433 |
31 | 0.849391 |
33 | 0.830387 |
35 | 0.810465 |
37 | 0.789671 |
39 | 0.768054 |
On constate que l'erreur dépasse 5 pour cent à partir du rang n=19. Cela est du au repliement des harmoniques de rang supérieur à fe/2 (50) sur les harmoniques de rang inférieur. Pour améliorer la précision, augmentons N :
npoints=500; raies = raiesSpectre[npoints]; indices=Table[2*p-1,{p,1,20}]; precision=Table[Abs[coefFourier[[2]]]/Abs[coefFourier[[2*p]]]/(2*p-1),{p,1,20}];
n | |S1|/(n|Sn|) |
1 | 1 |
3 | 0.999947 |
5 | 0.999842 |
7 | 0.999684 |
9 | 0.999474 |
11 | 0.999211 |
13 | 0.998895 |
15 | 0.998527 |
17 | 0.998106 |
19 | 0.997633 |
21 | 0.997107 |
23 | 0.99653 |
25 | 0.995899 |
27 | 0.995217 |
29 | 0.994482 |
31 | 0.993695 |
33 | 0.992857 |
35 | 0.991966 |
37 | 0.991023 |
39 | 0.990029 |
L'augmentation du nombre de points est coûteuse en calcul, surtout si l'on cherche les harmoniques de rang élevé. Une autre solution consiste à appliquer un filtrage passe-bas au signal avant de calculer la TFD. En effet, considérons un filtre passe-bas qui élimine, ou atténue fortement, les harmoniques à partir du rang n=40. Une bonne précision sur le calcul du spectre pour n< 40 pourra être obtenue avec seulement N=80. Le filtre utilisé doit avoir une réponse la plus constante possible dans la bande passante, de manière à ne pas altérer les harmoniques à calculer.