Transformée de Fourier discrète#

Importation des modules…

import numpy as np
import matplotlib.pyplot as plt
import scipy.fft as fft

Après avoir importé les modules nécessaires, le créneau est généré sur \(N=\) 100 échantillons. Attention, les 10 premiers échantillons (de 0 à 9) sont égaux à 1, les suivants (de 10 à 99) sont nuls !

N = 100
n = np.arange(N)
x = np.where(n<10, 1, 0)

On peut vérifier certaines valeurs (l’échantillon \(-1\) correspond au dernier échantillon) :

for m in [0, 9, 10, -1]:
    print(f"x[{m}] = {x[m]}")
x[0] = 1
x[9] = 1
x[10] = 0
x[-1] = 0

Un conseil, affichez le signal pour vérifier qu’il est bien construit !

plt.figure(figsize=(12,4))
plt.stem(n, x, basefmt=" ")
plt.xlabel("n")
plt.ylabel("x[n]")
plt.grid()
plt.show()
../_images/a2f0affad00cb415fe2aac663b82e84753749968c4098f1ca8a1d888ec1dbb63.png

TFD entre \(0\) et \(N-1\)#

FFT est un algorithme très rapide pour calculer une transformée de Fourier discrète (TFD). Il est implémenté en Python dans scipy.fft.fft. Par défaut, FFT calcule une TFD entre \(0\) et \(N-1\). Pour la représenter, il faut donc définir les abscisses \(k\) entre \(0\) et \(N-1\).

k = np.arange(N)
X = fft.fft(x)

N’oubliez pas : la TFD est très souvent complexe, c’est pourquoi on la représente avec deux graphes : le module et l’argument.

../_images/b123792c88973e0415a07c6dadf07f0dc4f8b00aea2908479f9049b6cf9acc8c.png

Dans certains cas, il peut y avoir des impulsions bizarres sur la phase : ce sont des erreurs numériques que l’on peut supprimer en forçant à 0 les échantillons de \(X\) qui sont très faibles :

X[abs(X)<1e-9] = 0
../_images/9d6a09d0594d8ec4d9c0f88d9ab7888ab01d8c8a3503fa7cc3c2e5fae8d0a92f.png

Le signal temporel étant un créneau, on peut l’interpréter comme un signal porte périodisé. Par conséquent, le module de son spectre est bien la TFD d’une porte (un sinus cardinal) périodisé.

TFD entre \(-N/2\) et \(N/2-1\)#

Il suffit de redéfinir les abscisses, et d’appliquer scipy.fft.fftshift sur le spectre pour inverser les parties gauche et droite.

k = np.arange(-N/2, N/2)
X = fft.fftshift(X)
../_images/24297c18ab76c5e7089c12ea8af972c9739085dfd35af6af469636e6b2b35763.png

TFD centrée en fonction des fréquences#

Dans ce cas, le module et la phase du spectre ne changent pas. Seule l’abscisse est à redéfinir.

Te = 2.5e-3
fe = 1/Te
f = k*fe/N
../_images/a0a3b0094c3d4932e400c63b88f46a8104642825f657e8402d1b46f2b9be2096.png