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:

Ce programme :
freqz de scipy.signal pour obtenir la réponse en fréquence du filtre.Tester l'exemple en ligne :