Table des matières Mathematica

Transformée de Fourier discrète: série de Fourier

1. Coefficients de Fourier

Soit u(t) un signal de période T développable en série de Fourier :

u(t)=n=-cnexp(j2πnTt)

Les coefficients de Fourier sont, pour nZ :

cn=1T0Tu(t)exp(-j2πnTt)dt

On considère un échantillonnage de u(t) de N points, avec 0kN-1 :

tk=kTNuk=u(tk)

Une approximation des coefficients de Fourier peut être obtenue par la méthode des rectangles :

cn1Tk=0N-1ukexp(-j2πnkN)TN

La formule obtenue définit une suite de période N. Il suffit donc de calculer, pour 0nN-1 :

Sn=1Nk=0N-1ukexp(-j2πnkN)

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 :

fn=nT

2. TFD avec Mathematica

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) :

1N(1-a)/2k=1Nukexp(j2πb(n-1)k-1N)

Pour obtenir la TFD définie plus haut, il faut donc poser a=-1 et b=-1.

3. Applications

3.a. Polynôme trigonométrique

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.pngplotA.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.pngplotB.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 :

|Sn|=|SN-n|

En effet, si la fonction u(t) est à valeurs réelles, on a :

SN-n=Sn*

La deuxième partie du spectre (appelée aussi l'image du spectre) correspond donc aux coefficients de Fourier d'indices négatifs :

c-nSN-n

Il y a par ailleurs la périodicité de la suite Sn :

Sn=SN+n

On obtient donc un spectre dont la périodicité est la fréquence d'échantillonnage

fe=NT

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.pngplotC.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 pN 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.pngplotD.pdf

L'harmonique de rang 10 est bien correctement calculée.

3.b. Signal en créneau

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.pngplotE.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 :

|c1||cn|=n

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|)
11
30.998684
50.996057
70.992122
90.986892
110.980376
130.972592
150.963556
170.953292
190.941822
210.929174
230.915377
250.900464
270.884471
290.867433
310.849391
330.830387
350.810465
370.789671
390.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|)
11
30.999947
50.999842
70.999684
90.999474
110.999211
130.998895
150.998527
170.998106
190.997633
210.997107
230.99653
250.995899
270.995217
290.994482
310.993695
330.992857
350.991966
370.991023
390.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.

Creative Commons LicenseTextes et figures sont mis à disposition sous contrat Creative Commons.