Fabriquer une sinusoïde à partir d'un créneau (capacité numérique)
Exercice de TD · niveau 3 (difficile) · électricité (MPSI), chapitre 6 — Filtrage linéaire · D. Action d'un filtre sur un signal
Énoncé
Un générateur ne délivre qu'un créneau symétrique de fréquence , d'amplitude , dont la décomposition est fournie : . On veut en tirer une sinusoïde à l'aide d'un filtre passe-bande d'ordre 2 de fréquence centrale et de facteur de qualité : On mesure la pureté de la sortie par son taux de distorsion harmonique , où est l'amplitude de la raie en sortie et la raie que l'on veut garder.
1) Avant tout calcul : pourquoi un filtre linéaire ne peut-il que modifier l'amplitude et la phase des raies du créneau ? Que vaut le THD du créneau lui-même ?
2) Écrire un script Python qui, pour et donnés, calcule le gain et la phase sur chaque harmonique (), affiche le THD et l'amplitude de la raie gardée, et trace l'entrée et la sortie sur deux périodes.
3) : THD pour , , , . Quel assure un THD de 1 % ? Expliquer la loi observée.
4) (on veut une sinusoïde à ) : mêmes calculs. Pourquoi faut-il un dix fois plus grand ? Quelle raie domine le résidu ?
5) Quelle est l'amplitude de la sinusoïde obtenue dans chaque cas, et sa phase ? Comparer, pour , avec un passe-bas d'ordre 1 de coupure (une ligne du script à changer). Conclure sur le choix du modèle de filtre.
Corrigé
1) Ce que la linéarité permet et interdit. Le créneau est une somme de sinusoïdes ; un filtre linéaire transforme chacune en une sinusoïde de même fréquence, multipliée par et déphasée de , et la sortie est la somme de ces sorties. Il ne crée donc aucune raie, et il ne peut pas en supprimer une exactement (sauf si s'annule pile à sa fréquence) : il ne fait que changer les proportions.
Le THD du créneau : , donc . C'est le complément des 81 % de l'exercice 1 : .
2) Le script. Il applique exactement la méthode du cours : spectre fourni, gain et phase raie par raie, somme.
import numpy as np
import matplotlib.pyplot as plt
f0 = 1000.0 # frequence du creneau (Hz)
n = np.arange(1, 2000, 2) # harmoniques impaires, n <= 1999
A = 4 / (np.pi * n) # spectre FOURNI du creneau
def passe_bande(f, fr, Q):
return 1 / (1 + 1j * Q * (f / fr - fr / f))
def filtrer(fr, Q, H=passe_bande):
Hn = H(n * f0, fr, Q) # gain et phase, raie par raie
B = A * np.abs(Hn) # amplitudes de sortie
k = (n == round(fr / f0)) # la raie que l'on garde
thd = np.sqrt(np.sum(B[~k]**2)) / B[k][0]
return thd, B[k][0], np.degrees(np.angle(Hn[k][0])), Hn
def tracer(fr, Q):
t = np.linspace(0, 2 / f0, 2000)
Hn = filtrer(fr, Q)[3]
w = 2 * np.pi * n[:, None] * f0 * t
e = np.sum(A[:, None] * np.sin(w), axis=0)
s = np.sum((A * abs(Hn))[:, None]
* np.sin(w + np.angle(Hn)[:, None]), axis=0)
plt.plot(t * 1e3, e, t * 1e3, s); plt.xlabel("t (ms)")
plt.show()
print("THD du creneau :", np.sqrt(np.sum(A[1:]**2)) / A[0])
for fr in (f0, 3 * f0):
for Q in (1, 3, 10, 30):
thd, a, phi, _ = filtrer(fr, Q)
print(f"fr={fr:.0f} Hz Q={Q:>2} : THD={100*thd:6.2f} %"
f" amplitude={a:.3f} phase={phi:+.1f} deg")
Q = 1.0
while filtrer(fr, Q)[0] > 0.01:
Q += 0.1
print(f"fr={fr:.0f} Hz : THD = 1 % pour Q = {Q:.1f}")
pb = lambda f, fr, Q: 1 / (1 + 1j * f / fr) # passe-bas, fc = f0
thd, a, phi, _ = filtrer(f0, None, H=pb)
print(f"passe-bas ordre 1 : THD={100*thd:.1f} %"
f" amplitude={a:.3f} phase={phi:+.0f} deg")
tracer(f0, 10)La suite du corrigé est sur Adloun
Le corrigé rédigé en entier, avec les autres exercices du chapitre et le tuteur qui guide sans donner la réponse.
Voir le corrigé completGratuit : il suffit de créer un compte (e-mail, nom d'utilisateur, mot de passe, classe), et tu arrives directement sur le corrigé.
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.