user
Comment écrire un programme python qui trace le diagramme de BODE à partir de l'équation de récurrence d'un filtre numérique
alphonsio

Voici un programme Python qui trace le diagramme de Bode (gain et phase) à partir de l'équation de récurrence d'un filtre numérique. Il utilise la bibliothèque scipy.signal pour calculer la réponse en fréquence du filtre à partir de ses coefficients.

import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import freqz

def plot_bode_diagram(b_coeffs, a_coeffs):
    """
    Trace le diagramme de Bode (module et phase) d'un filtre numérique.
    :param b_coeffs: Coefficients du numérateur (b0, b1, ..., bN)
    :param a_coeffs: Coefficients du dénominateur (a0, a1, ..., aM)
    """
    w, h = freqz(b_coeffs, a_coeffs, worN=1024)
    freq = w / np.pi  # Normalisation de la fréquence (échelle en pi radians/échantillon)
    
    # Magnitude en dB
    magnitude_db = 20 * np.log10(abs(h))
    
    # Phase en degrés
    phase_deg = np.angle(h, deg=True)
    
    # Tracé du gain
    plt.figure(figsize=(10, 6))
    plt.subplot(2, 1, 1)
    plt.plot(freq, magnitude_db, 'b')
    plt.xlabel('Fréquence normalisée (x π rad/échantillon)')
    plt.ylabel('Gain (dB)')
    plt.title('Diagramme de Bode - Module')
    plt.grid()
    
    # Tracé de la phase
    plt.subplot(2, 1, 2)
    plt.plot(freq, phase_deg, 'r')
    plt.xlabel('Fréquence normalisée (x π rad/échantillon)')
    plt.ylabel('Phase (degrés)')
    plt.title('Diagramme de Bode - Phase')
    plt.grid()
    
    plt.tight_layout()
    plt.show()

# Exemple d'utilisation avec un filtre passe-bas de Butterworth d'ordre 2
b = [0.2929, 0.5858, 0.2929]  # Coefficients du numérateur

a = [1.0000, 0.0000, 0.1716]  # Coefficients du dénominateur

plot_bode_diagram(b, a)

Ce programme devrait afficher le diagramme ci-dessous:

Diagramme de Bode tracé à partir de l'équation de récurrence

Ce programme :

  1. Utilise freqz de scipy.signal pour obtenir la réponse en fréquence du filtre.
  2. Calcule le gain en dB et la phase en degrés.
  3. Trace les deux courbes sur un graphique.

Tester l'exemple en ligne :