Décomposition en série de Fourier

Rappels

On admet que les fonctions périodiques qui définissent les signaux fréquemment utilisés en physique (signaux sinusoïdaux, carrés, triangulaires, en dents de scie…​), sont toutes décomposables en série de Fourier.

Ainsi, pour toute fonction T-périodique f(t), l’expression de sa décomposition en série de Fourier Sf(t) est :

serie fourier

Si f(t) est paire alors tous les bn son nuls. On a alors :

serie fourier fnct paire

Si f(t) est impaire alors tous les an son nuls. On a alors :

serie fourier fnct impaire

💻 Travail n° 1 Décomposition d’un signal carré

🕮 Énoncé :

On considère le signal carré 2π-périodique suivant :

signal carre

défini sur [0, π[ à l’aide de la fonction paire suivante :

signal carre fnct

Comme la fonction est paire, tous les bn sont nuls et :

signal carre a0

puis :

signal carre an

Ci-dessous le script Python qui permet de tracer la décomposition en série de Fourier de la fonction :

serie-fourier-carre.py
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as tck

# Définition de la fonction 2π-périodique paire correspondante
# à un signal carré d'amplitude 1 centré sur 0
# f(t)=1 si t ∈ [0,π/2[ et f(t)=0 si t ∈ [π/2,π[
def f(t):
    # Calcul du modulo 2π avec symétrie paire
    x =  (abs((t + np.pi) % (2*np.pi) - np.pi)) % np.pi

    return np.where(
        (x >= 0) &
        (x <= np.pi/2)
        , 1
        , 0
    )

# POINT D'ENTREE DU SCRIPT PYTHON
if __name__ == "__main__":

    # Etendue du tracé
    t = np.linspace(-2*np.pi, 2*np.pi, 2000)

    S_f = np.zeros_like(t)

    # Calcul des termes de la série de Fourier

    # . Rang désiré (rang >= 1)
    rang = 1

    # . Calcul des coefficents :
    #   * les 'bn' sont nuls car fonction paire

    # .. Calcul de 'a0'
    S_f = 1/2

    # .. Calcul de la somme 'a1', 'a3', 'a5', ...
    #    Forme non simplifiée :
    for n in range(1, rang+1) :
        an = (2/(n * np.pi)) * np.sin(n*np.pi/2)
        S_f +=  an * np.cos(n * t)

    # Construction des courbes
    fig, ax = plt.subplots(layout="constrained")

    # . Tracé du signal carré
    ax.plot(t, f(t), color="gray", linestyle="--")

    # . Tracé de la série de Fourier
    ax.plot(t, S_f, color="blue", linestyle="-")

    # . Titre de la figure
    fig.suptitle("Série de Fourier d'un signal carré")

    # . Légende de la figure
    plt.ylim(-0.5, 1.5) # On fixe les limites de l'axe des ordonnées pour permettre d'afficher la légende
    ax.legend(['$f(t)$ : signal carré', '$S_f(t)$ : approximation par série de Fourier'], loc='lower right')

    # . Configuration de la grille de la courbe :
    #   * styles des grilles principales et secondaires
    ax.grid(which='major', color='#CCCCCC', linestyle='-')
    ax.grid(which='minor', color='#CCCCCC', linestyle='--')
    #   * une graduation horizontale principale toutes les 1 unités
    ax.xaxis.set_major_locator(tck.MultipleLocator(np.pi))
    ax.xaxis.set_major_formatter(tck.FuncFormatter(
        lambda val,pos: '{:.0g}$\pi$'.format(val/np.pi) if val !=0 else '0'
    ))
    #   * une graduation horizontale secondaire toutes les 0.2 unités
    ax.xaxis.set_minor_locator(tck.MultipleLocator(np.pi/2))
    #   * une graduation verticale principale toutes les 1 unités
    ax.yaxis.set_major_locator(tck.MultipleLocator(1))
    #   * une graduation verticale secondaire toutes les 0.5 unités
    ax.yaxis.set_minor_locator(tck.MultipleLocator(0.5))

    # . Tracé des axes
    plt.axhline()
    plt.axvline()

    # . Affichage de la figure
    plt.show()

🎯 Travail à faire :

  1. Exécuter le script dans un environnement Python disposant des modules numpy et matplotlib (→ Environnement en ligne basthon link ou environnement local virtuel comath dans conda)

  2. Quelle variable du script permet de spécifier le n° du terme jusqu’auquel on désire tracer la décomposition en série de Fourier ?
    Visualiser la courbe obtenue lorsqu’elle prend les valeurs 1, 2, 3, 4, 5

  3. Calculer les valeurs de an pour n de 1 à 9.

  4. En déduire une expression simplifiée de an.

  5. Modifier le code Python en conséquence.

💻 Travail n° 2 Décomposition d’un signal en dents de scie

🕮 Énoncé :

On considère le signal dents de scie 2π-périodique suivant :

signal dents de scie

défini sur [0, π[ à l’aide de la fonction impaire suivante :

signal dents de scie fnct

🎯 Travail à faire :

  1. Le développement en série de Fourier de cette fonction contiendra-t-il :

    • des sinus et des cosinus ?

    • que des cosinus ?

    • que des sinus ?

    • que des sinus et la valeur moyenne ?

    • que des cosinus et la valeur moyenne ?

    Justifier la réponse.

  2. Sachant que :

    integrale t sin nt

    Déterminer l’expression générale de bn.

    On rappelle que :

    integrale def

    F étant une primitive de f

    Réponse attendue
    signal dents de scie bn
  3. Reprendre le script Python du travail précédent et l’adapter pour qu’il trace la décomposition en série de Fourier du signal en dents de scie.

🞄  🞄  🞄