Les filtres classiques et Biquadsreste une chose, c'est quoi les fonctions de transfert des filtres classiques ?
on pense aux filtres calssiques : Low pass, high pass, (Butt, Bessel, LR) et aussi aux autres : PEQ, band pass, low shelve, high shelve, etc
La plupart de ces filtres ont été étudiés et on trouve un peu partout leur fonction de transfert imaginaire
wikipedia par exemple donne celle d'un low pass du 2eme ordre : en fonction de sa fréquence f0 et de son Q

la façon d'écrire H(jw) c'est pour dire que c'est la réponse complexe pour la pulsation w
Donc
soit on connait toutes les fonctions de transfert des filtres dont on a besoin et on les implémente,
soit, on passe par les
biquads. C'est le choix que j'ai fait.
Pourquoi passer par les biquads ?
dabord parce que j'ai eu du mal a trouver les fonctions de transfert complexes de tous les filtres qui m'intéressent et aussi parce que je voulais pouvoir vérifier les coefficients (bénéfice collatéral)
Passer par les biquads comme étape intermédiaire est intéressant parce que :
- on peut exprimer n'importe quel filtre sous forme de biquad ou de cascade de biquads et
- la fonction de transfert d'un biquad est parfaitement connue.

le code vba correspondant :
Code : Tout sélectionner
' pour chaque fréquence Freq :
w = 2 * PI * Freq / Fs
Zb = Complexe(Cos(w), -Sin(w)) ' zb est l'inverse de z
Zb2 = ImPower(Zb, 2) ' zb2 est le carré de zb
' H = (b0 + b1*zb + b2*zb2) / (1 + a1*zb + a2*zb2)
Hnum = ImSum(b0, ImProduct(b1, Zb), ImProduct(b2, Zb2))
Hdenom = ImSum(1, ImProduct(a1, Zb), ImProduct(a2, Zb2))
H = ImDiv(Hnum, Hdenom)
Amplitude = 20 log(module(H))
Phase = 180/Pi(Arg(H))
Suffit de savoir déterminer les coefficients des biquads.
Grace au succès des DSP ça a été fait pour toutes sortes de filtres classiques et moins classiques.
Le cookbook de Robert Bristow Jones donne les clés pour calculer les coefficients de biquads pour les filtres de base. La moitié du web s'est inspirée de ses travaux !
http://www.musicdsp.org/files/Audio-EQ-Cookbook.txtEnsuite, pour les filtres LP et HP spéciaux (Butt, Be, LR de différents ordres) on peut les faire par composition des filtres de base et en adaptant Fc et Q selon les tables calculées par nos ancêtres.
http://www.ti.com/lit/an/sloa049b/sloa049b.pdfpar exemple :
- un BUTT12 est un filtre du second ordre avec Q=0,707. Nécessite un biquad.
- un BUTT24 c'est le chainage de deux BUTT12, le premier avec Q=0,5412 et le second avec Q=1,3017. Nécessite deux biquads.
Voici dans un pdf comment combiner les filtres de base du second ordre pour obtenir les filtres classiques (BUT, Bessel, LR) dans des ordres plus élevés.
download/file.php?id=1534En sachant faire des biquads, on sait tout faire ou presque

Voilà le code en VBA de mon excel pour le calcul des coeffs des filtres de base. Se lit comme du pseudo code :
Code : Tout sélectionner
' intermediate variables
w0 = 2 * PI * Fc / Fs
Select Case Filter
Case "LPF6"
' Low Pass 1rst order
'
K = Tan(w0 / 2)
alpha = 1 + K
b0 = K / alpha
b1 = b0
b2 = 0
a0 = 1
a1 = -((1 - K) / alpha)
a2 = 0
Case "HPF6"
' High Pass 1rst order
'
K = Tan(w0 / 2)
alpha = 1 + K
b0 = 1 / alpha
b1 = -b0
b2 = 0
a0 = 1
a1 = -((1 - K) / alpha)
a2 = 0
Case "LPF12"
' Low Pass 2nd order
' LPF6: H(s) = 1 / (s^2 + s/Q + 1)
alpha = Sin(w0) / (2 * Q)
b0 = (1 - Cos(w0)) / 2
b1 = 1 - Cos(w0)
b2 = (1 - Cos(w0)) / 2
a0 = 1 + alpha
a1 = -2 * Cos(w0)
a2 = 1 - alpha
Case "HPF12"
' High Pass 2nd order
' HPF6: H(s) = s^2 / (s^2 + s/Q + 1)
alpha = Sin(w0) / (2 * Q)
b0 = (1 + Cos(w0)) / 2
b1 = -(1 + Cos(w0))
b2 = (1 + Cos(w0)) / 2
a0 = 1 + alpha
a1 = -2 * Cos(w0)
a2 = 1 - alpha
Case "PEQ"
' Peaking EQ
'
alpha = Sin(w0) / (2 * Q)
A = Sqr(10 ^ (Gain / 20))
b0 = 1 + alpha * A
b1 = -2 * Cos(w0)
b2 = 1 - alpha * A
a0 = 1 + alpha / A
a1 = -2 * Cos(w0)
a2 = 1 - alpha / A
Case "APF"
' AllPass filter.
'
alpha = Sin(w0) / (2 * Q)
b0 = 1 - alpha
b1 = -2 * Cos(w0)
b2 = 1 + alpha
a0 = 1 + alpha
a1 = -2 * Cos(w0)
a2 = 1 - alpha
Case "LSH"
' LowShelve filter.
'
alpha = Sin(w0) / (2 * Q)
A = Sqr(10 ^ (Gain / 20))
b0 = A * ((A + 1) - (A - 1) * Cos(w0) + 2 * Sqr(A) * alpha)
b1 = 2 * A * ((A - 1) - (A + 1) * Cos(w0))
b2 = A * ((A + 1) - (A - 1) * Cos(w0) - 2 * Sqr(A) * alpha)
a0 = (A + 1) + (A - 1) * Cos(w0) + 2 * Sqr(A) * alpha
a1 = -2 * ((A - 1) + (A + 1) * Cos(w0))
a2 = (A + 1) + (A - 1) * Cos(w0) - 2 * Sqr(A) * alpha
Case "HSH"
' HighShelve filter.
'
alpha = Sin(w0) / (2 * Q)
A = Sqr(10 ^ (Gain / 20))
b0 = A * ((A + 1) + (A - 1) * Cos(w0) + 2 * Sqr(A) * alpha)
b1 = -2 * A * ((A - 1) + (A + 1) * Cos(w0))
b2 = A * ((A + 1) + (A - 1) * Cos(w0) - 2 * Sqr(A) * alpha)
a0 = (A + 1) - (A - 1) * Cos(w0) + 2 * Sqr(A) * alpha
a1 = 2 * ((A - 1) - (A + 1) * Cos(w0))
a2 = (A + 1) - (A - 1) * Cos(w0) - 2 * Sqr(A) * alpha
Case Else
' error
MsgBox ("Erreur fonction BQcoeffs. Filtre " & Filter & " inconnu.")
Exit Function
End Select
coeffs(1) = b0 / a0
coeffs(2) = b1 / a0
coeffs(3) = b2 / a0
coeffs(4) = a1 / a0
coeffs(5) = a2 / a0