TP3: Optimisation & Filtrage
f = [0 .4 .4 .6 .6 1];
M = [0 0 1 1 0 0];
fs = 1000;
fhz = f * fs / 2;
Méthode de Yulewalk
Calcul des coeficients du filtre
[B, A] = yulewalk(8, f, M);
[Hy, wy] = freqz(B, A, 1024, fs);
plot(fhz, M, wy, abs(Hy));
Ajout des paramètres supplémentaires
wp = [.4 .6];
ws = [.3 .7];
Rp = 3;
Rs = 40;
Méthode de Butterworth
[Nb, wb] = buttord(wp, ws, Rp, Rs);
[Bb, Ab] = butter(Nb, wb);
[Hb, wb] = freqz(Bb, Ab, 1024, fs);
plot(fhz, M, wb, abs(Hb));
Augmenter la valeur de Rs améliore la fonction et rapproche le signal du carré.
Méthode de Tchebychev
[Nc, wc] = cheb1ord(wp, ws, Rp, Rs);
% Nc: ordre du filtre
% wc: fréquence de coupure
[Bc, Ac] = cheby1(Nc, Rp, wc);
% Calcul des coeficients de H(z)
% Bc: vecteur qui contient les coefs du numérateur
% Ac: vecteur qui contient les coefs du dénominateur
[Hc, wc] = freqz(Bc, Ac, 1024, fs);
plot(fhz, M, wc, abs(Hc));
La fonction de Tchebychev produit une fonction de transfert qui oscille en bande passante (inconvénient) mais en contrepartie la bande de transition est plus étroite et l'ordre est plus faible (avantages).
Méthode de Tchebychev inversé
[Nd, wd] = cheb2ord(wp, ws, Rp, Rs);
[Bd, Ad] = cheby2(Nd, Rs, wd);
[Hd, wd] = freqz(Bd, Ad, 1024, fs);
plot(fhz, M, wd, abs(Hd));
La fonction de Tchebychev inversé produit une fonction de transfert qui oscille en bande atténuée et plate en bande passante.
Filtre Passe-Bas
fs = 2000; % Fréquence de coupure
wp = 100 / (fs / 2);
ws = 120 / (fs / 2);
[Ne, we] = cheb1ord(wp, ws, 0.5, 20);
[Be, Ae] = cheby1(Ne, Rp, we);
[He, we] = freqz(Be, Ae, 1024, fs);
plot(we, abs(He));
Filtre Passe-Haut
fs = 2000; % Fréquence de coupure
wp = 170 / (fs / 2);
ws = 150 / (fs / 2);
Rp = 3;
Rs = 40;
[Nf, wf] = cheb2ord(wp, ws, Rp, Rs);
[Bf, Af] = cheby2(Nf, Rs, wf, "high");
[Hf, wf] = freqz(Bf, Af, 1024, fs);
plot(wf, abs(Hf));
Filtre Passe-Bande
fs = 2000;
wp_haut = 9000;
ws_haut = 17000;
Rp = 0.5;
Rs = 35;
wp_bas = 2000;
ws_bas = 1200;
% 's': Analogique
[Ngh, wgh] = cheb2ord(wp_haut, ws_haut, Rp, Rs, 's');
[Ngb, wgb] = cheb1ord(wp_bas, ws_bas, Rp, Rs, 's');