Contenu principal

butter

Design de filtres de Butterworth

Description

[b,a] = butter(n,Wn) crée un filtre de Butterworth numérique passe-bas d’ordre n avec une fréquence de coupure normalisée Wn. La fonction butter renvoie les coefficients de numérateur et de dénominateur de la fonction de transfert du filtre.

exemple

[b,a] = butter(n,Wn,ftype) crée un filtre de Butterworth numérique passe-bas, passe-haut, passe-bande ou coupe-bande selon la valeur de ftype et le nombre d’éléments de Wn. Les designs de filtres passe-bande et coupe-bande obtenus sont d’ordre 2n.

Remarque

Des instabilités numériques peuvent survenir lors du design de filtres IIR avec des fonctions de transfert pour des ordres aussi faibles que 4. Pour plus d’informations sur les problèmes numériques affectant la formation de la fonction de transfert, veuillez consulter Fonctions de transfert et CTF.

exemple

[z,p,k] = butter(___) crée un filtre de Butterworth numérique et renvoie ses zéros, ses pôles et son gain. Cette syntaxe peut inclure les arguments d’entrée indiqués dans les syntaxes précédentes.

exemple

[A,B,C,D] = butter(___) crée un filtre de Butterworth numérique et renvoie les matrices qui définissent sa représentation d’état.

exemple

[___] = butter(___,"s") crée un filtre de Butterworth analogique avec un ou plusieurs arguments d’entrée ou de sortie des syntaxes précédentes.

exemple

[B,A] = butter(n,Wn,"ctf") crée un filtre de Butterworth numérique passe-bas avec des Fonctions de transfert en cascade (CTF) de second ordre. La fonction renvoie des matrices qui répertorient les coefficients polynomiaux de dénominateur et de numérateur de la fonction de transfert du filtre, représentée comme une cascade de sections de filtre. Cette approche génère des filtres IIR offrant une plus grande stabilité numérique que les fonctions de transfert à section unique. (depuis R2024b)

[___] = butter(n,Wn,ftype,"ctf") crée un filtre de Butterworth numérique passe-bas, passe-haut, passe-bande ou coupe-bande et renvoie sa représentation au format CTF. Les sections du design obtenu sont d’ordre 2 (filtres passe-bas et passe-haut) ou 4 (filtres passe-bande et coupe-bande). (depuis R2024b)

exemple

[___,gS] = butter(___) renvoie également le gain total du système. Vous devez spécifier "ctf" pour renvoyer gS. (depuis R2024b)

Exemples

réduire tout

Créez un filtre de Butterworth passe-bas d’ordre 6 avec une fréquence de coupure de 300 Hz, ce qui correspond à 0.6π rad/échantillon pour des données échantillonnées à 1 000 Hz. Tracez ses réponses en amplitude et en phase. Utilisez-le pour filtrer un signal aléatoire de 1 000 échantillons.

fc = 300;
fs = 1000;

[b,a] = butter(6,fc/(fs/2));

freqz(b,a,[],fs)

subplot(2,1,1)
ylim([-100 20])

Figure contains 2 axes objects. Axes object 1 with title Phase, xlabel Frequency (Hz), ylabel Phase (degrees) contains an object of type line. Axes object 2 with title Magnitude, xlabel Frequency (Hz), ylabel Magnitude (dB) contains an object of type line.

dataIn = randn(1000,1);
dataOut = filter(b,a,dataIn);

Créez un filtre de Butterworth coupe-bande d’ordre 6 avec des fréquences limites normalisées de 0.2π et 0.6π rad/échantillon. Tracez ses réponses en amplitude et en phase. Utilisez-le pour filtrer des données aléatoires.

[b,a] = butter(3,[0.2 0.6],'stop');
freqz(b,a)

Figure contains 2 axes objects. Axes object 1 with title Phase, xlabel Normalized Frequency (\times\pi rad/sample), ylabel Phase (degrees) contains an object of type line. Axes object 2 with title Magnitude, xlabel Normalized Frequency (\times\pi rad/sample), ylabel Magnitude (dB) contains an object of type line.

dataIn = randn(1000,1);
dataOut = filter(b,a,dataIn);

Créez un filtre de Butterworth passe-haut d’ordre 9. Spécifiez une fréquence de coupure de 300 Hz, ce qui correspond à 0.6π rad/échantillon pour des données échantillonnées à 1 000 Hz. Tracez les réponses en amplitude et en phase. Convertissez les zéros, les pôles et le gain en sections de second ordre. Affichez la réponse en fréquence du filtre.

[z,p,k] = butter(9,300/500,"high");
sos = zp2sos(z,p,k);
freqz(sos)

Figure contains 2 axes objects. Axes object 1 with title Phase, xlabel Normalized Frequency (\times\pi rad/sample), ylabel Phase (degrees) contains an object of type line. Axes object 2 with title Magnitude, xlabel Normalized Frequency (\times\pi rad/sample), ylabel Magnitude (dB) contains an object of type line.

Créez un filtre de Butterworth passe-bande d’ordre 20 avec une fréquence de coupure inférieure de 500 Hz et une fréquence de coupure supérieure de 560 Hz. Spécifiez une fréquence d’échantillonnage de 1 500 Hz. Utilisez la représentation d’état. Convertissez la représentation d’état en sections de second ordre. Visualisez les réponses en fréquence.

fs = 1500;
[A,B,C,D] = butter(10,[500 560]/(fs/2));
sos = ss2sos(A,B,C,D);
freqz(sos,[],fs)

Figure contains 2 axes objects. Axes object 1 with title Phase, xlabel Frequency (Hz), ylabel Phase (degrees) contains an object of type line. Axes object 2 with title Magnitude, xlabel Frequency (Hz), ylabel Magnitude (dB) contains an object of type line.

Créez un filtre identique avec designfilt. Visualisez les réponses en fréquence.

d = designfilt("bandpassiir",FilterOrder=20, ...
    HalfPowerFrequency1=500,HalfPowerFrequency2=560, ...
    SampleRate=fs);
freqz(d,[],fs)

Figure contains 2 axes objects. Axes object 1 with title Phase, xlabel Frequency (Hz), ylabel Phase (degrees) contains an object of type line. Axes object 2 with title Magnitude, xlabel Frequency (Hz), ylabel Magnitude (dB) contains an object of type line.

Créez un filtre de Butterworth passe-bas analogique d’ordre 5 avec une fréquence de coupure de 2 GHz. Multipliez la fréquence par 2π pour la convertir en radians par seconde. Calculez la réponse en fréquence du filtre à 4 096 points.

n = 5;
wc = 2*pi*2e9;
w = 2*pi*1e9*logspace(-2,1,4096)';

[zb,pb,kb] = butter(n,wc,"s");
[bb,ab] = zp2tf(zb,pb,kb);
[hb,wb] = freqs(bb,ab,w);
gdb = -diff(unwrap(angle(hb)))./diff(wb);

Créez un filtre de Tchebychev de type I d’ordre 5 avec la même fréquence limite et une ondulation dans la bande passante de 3 dB. Calculez sa réponse en fréquence.

[z1,p1,k1] = cheby1(n,3,wc,"s");
[b1,a1] = zp2tf(z1,p1,k1);
[h1,w1] = freqs(b1,a1,w);
gd1 = -diff(unwrap(angle(h1)))./diff(w1);

Créez un filtre de Tchebychev de type II d’ordre 5 avec la même fréquence limite et une atténuation dans la bande coupée de 30 dB. Calculez sa réponse en fréquence.

[z2,p2,k2] = cheby2(n,30,wc,"s");
[b2,a2] = zp2tf(z2,p2,k2);
[h2,w2] = freqs(b2,a2,w);
gd2 = -diff(unwrap(angle(h2)))./diff(w2);

Créez un filtre elliptique d’ordre 5 avec la même fréquence limite, une ondulation dans la bande passante de 3 dB et une atténuation dans la bande coupée de 30 dB. Calculez sa réponse en fréquence.

[ze,pe,ke] = ellip(n,3,30,wc,"s");
[be,ae] = zp2tf(ze,pe,ke);
[he,we] = freqs(be,ae,w);
gde = -diff(unwrap(angle(he)))./diff(we);

Créez un filtre de Bessel d’ordre 5 avec la même fréquence limite. Calculez sa réponse en fréquence.

[zf,pf,kf] = besself(n,wc);
[bf,af] = zp2tf(zf,pf,kf);
[hf,wf] = freqs(bf,af,w);
gdf = -diff(unwrap(angle(hf)))./diff(wf);

Tracez l’atténuation en décibels. Exprimez la fréquence en gigahertz. Comparez les filtres.

fGHz = [wb w1 w2 we wf]/(2e9*pi);
plot(fGHz,mag2db(abs([hb h1 h2 he hf])))
axis([0 5 -45 5])
grid on
xlabel("Frequency (GHz)")
ylabel("Attenuation (dB)")
legend(["butter" "cheby1" "cheby2" "ellip" "besself"])

Figure contains an axes object. The axes object with xlabel Frequency (GHz), ylabel Attenuation (dB) contains 5 objects of type line. These objects represent butter, cheby1, cheby2, ellip, besself.

Tracez le retard de groupe en nombre d’échantillons. Exprimez la fréquence en gigahertz et le retard de groupe en nanosecondes. Comparez les filtres.

gdns = [gdb gd1 gd2 gde gdf]*1e9;
gdns(gdns<0) = NaN;
loglog(fGHz(2:end,:),gdns)
grid on
xlabel("Frequency (GHz)")
ylabel("Group delay (ns)")
legend(["butter" "cheby1" "cheby2" "ellip" "besself"])

Figure contains an axes object. The axes object with xlabel Frequency (GHz), ylabel Group delay (ns) contains 5 objects of type line. These objects represent butter, cheby1, cheby2, ellip, besself.

Les filtres de Butterworth et de Tchebychev de type II ont des bandes passantes plates et des bandes de transition larges. Les filtres de Tchebychev de type I et elliptique offrent un roll-off plus rapide, mais présentent des ondulations dans la bande passante. La fréquence passée en entrée à la fonction du filtre de Tchebychev de type II définit le début de la bande atténuée plutôt que la fin de la bande passante. Le filtre de Bessel présente un délai de groupe à peu près constant tout au long de la bande passante.

Créez un filtre de Butterworth passe-haut d’ordre 9 avec une fréquence de coupure de 300 Hz et une fréquence d’échantillonnage de 1 000 Hz. Renvoyez les coefficients du système de filtre sous la forme d’une cascade de sections de second ordre.

Wn = 300/(1000/2);
[B,A] = butter(9,Wn,"high","ctf")
B = 5×3

    0.2544   -0.2544         0
    0.2544   -0.5088    0.2544
    0.2544   -0.5088    0.2544
    0.2544   -0.5088    0.2544
    0.2544   -0.5088    0.2544

A = 5×3

    1.0000    0.1584         0
    1.0000    0.3264    0.0561
    1.0000    0.3575    0.1570
    1.0000    0.4189    0.3554
    1.0000    0.5304    0.7165

Tracez la réponse en amplitude du filtre.

filterAnalyzer(B,A)

Arguments d'entrée

réduire tout

Ordre du filtre, défini par un scalaire entier inférieur ou égal à 500. Pour les designs passe-bande et coupe-bande, n représente la moitié de l’ordre du filtre.

Types de données : double

Fréquence de coupure, définie par un scalaire ou un vecteur à deux éléments. La fréquence de coupure est la fréquence à laquelle la réponse en amplitude du filtre est 1 / √2.

  • Si Wn est un scalaire, butter crée un filtre passe-bas ou passe-haut avec la fréquence de coupure Wn.

    Si Wn est le vecteur à deux éléments [w1 w2], où w1 < w2, butter crée un filtre passe-bande ou coupe-bande avec une fréquence de coupure inférieure w1 et une fréquence de coupure supérieure w2.

  • Pour les filtres numériques, les fréquences de coupure doivent être comprises entre 0 et 1, où 1 correspond à la fréquence de Nyquist, c’est-à-dire la moitié de la fréquence d’échantillonnage ou π rad/échantillon.

    Pour les filtres analogiques, les fréquences de coupure doivent être exprimées en radians par seconde et peuvent avoir n’importe quelle valeur positive.

Types de données : double

Type de filtre, défini comme suit :

  • "low" définit un filtre passe-bas avec une fréquence de coupure Wn. "low" est le type par défaut lorsque Wn est un scalaire.

  • "high" définit un filtre passe-haut avec une fréquence de coupure Wn.

  • "bandpass" définit un filtre passe-bande d’ordre 2n si Wn est un vecteur à deux éléments. "bandpass" est le type par défaut lorsque Wn contient deux éléments.

  • "stop" définit un filtre coupe-bande d’ordre 2n si Wn est un vecteur à deux éléments.

Arguments de sortie

réduire tout

Coefficients de la fonction de transfert du filtre, renvoyés sous la forme de vecteurs lignes. Pour un filtre d’ordre n, la fonction renvoie b et a avec r échantillons, où r = n+1 pour les filtres passe-bas et passe-haut et r = 2*n+1 pour les filtres passe-bande et coupe-bande.

La fonction de transfert est exprimée en fonction de b = [b1 b2br] et a = [a1 a2ar] comme suit :

  • H(z)=b1+b2z1++brz(r1)a1+a2z1++arz(r1) pour les filtres numériques.

  • H(s)=b1sr1+b2sr2++bra1sr1+a2sr2++ar pour les filtres analogiques.

Types de données : double

Zéros, pôles et gain du filtre, renvoyés sous la forme de deux vecteurs colonnes et d’un scalaire. Pour un filtre d’ordre n, la fonction renvoie z et p avec r échantillons, où r = n pour les filtres passe-bas et passe-haut et r = 2*n pour les filtres passe-bande et coupe-bande.

La fonction de transfert est exprimée en fonction de z = [z1 z2zr], p = [p1 p2pr] et k comme suit :

  • H(z)=k(1z1z1)(1z2z1)(1zrz1)(1p1z1)(1p2z1)(1prz1) pour les filtres numériques.

  • H(s)=k(sz1)(sz2)(szr)(sp1)(sp2)(spr) pour les filtres analogiques.

Types de données : double

Représentation d’état du filtre, renvoyée sous la forme de matrices. Si r = n pour les designs passe-bas et passe-haut et r = 2n pour les filtres passe-bande et coupe-bande, A est égal à r × r, B est égal à r × 1, C est égal à 1 × r et D est égal à 1 × 1.

Les matrices de représentation d’état mettent en relation le vecteur d’état x, l’entrée u et la sortie y via l’un des systèmes d’équations suivants.

  • Pour les filtres numériques :

    x(k+1)=Ax(k)+Bu(k)y(k)=Cx(k)+Du(k).

  • Pour les filtres analogiques :

    x˙=Ax+Buy=Cx+Du.

Types de données : double

Depuis R2024b

Coefficients de la CTF (fonction de transfert en cascade), renvoyés sous la forme d’un vecteur ligne ou d’une matrice. B et A indiquent respectivement les coefficients de numérateur et de dénominateur de la fonction de transfert en cascade.

B et A sont respectivement de taille L x (m+1) et L x (n+1). La fonction renvoie la première colonne de A comme égale à 1, de sorte que A(1)=1 lorsque A est un vecteur ligne.

  • L représente le nombre de sections de filtre.

  • m représente l’ordre des numérateurs du filtre.

  • n représente l’ordre des dénominateurs du filtre.

La fonction butter renvoie les coefficients CTF avec les spécifications d’ordre suivantes :

  • m = n = 2 pour les filtres passe-bas et passe-haut.

  • m = n = 4 pour les filtres passe-bande et coupe-bande.

Remarque

Pour personnaliser le calcul des coefficients CTF, par exemple en leur appliquant un ordre différent ou en modifiant l’échelle de gain, spécifiez de renvoyer z,p,k puis utilisez zp2ctf pour obtenir B,A.

Pour plus d’informations sur le format de la fonction de transfert en cascade et les matrices de coefficients, veuillez consulter Renvoyer des filtres numériques au format CTF.

Depuis R2024b

Gain total du système, renvoyé sous la forme d’un scalaire à valeur réelle.

  • Si vous spécifiez de renvoyer gS, la fonction butter normalise les coefficients de numérateur pour que la première colonne de B soit égale à 1 et elle renvoie le gain total du système dans gS.

  • Si vous ne spécifiez pas de renvoyer gS, la fonction butter répartit uniformément le gain du système entre toutes ses sections avec la fonction scaleFilterSections.

En savoir plus

réduire tout

Algorithmes

Les filtres de Butterworth présentent une réponse en amplitude la plus plate possible dans la bande passante et globalement monotone. Cette régularité s’obtient au détriment du roll-off, qui est moins prononcé. Les filtres elliptiques et de Tchebychev offrent généralement un roll-off plus raide pour un ordre de filtre donné.

La fonction butter utilise un algorithme en cinq étapes :

  1. Elle détermine les pôles, les zéros et le gain du prototype analogique passe-bas avec la fonction buttap.

  2. Elle convertit les pôles, les zéros et le gain en représentation d’état.

  3. Si nécessaire, elle utilise une transformation de représentation d’état pour convertir le filtre passe-bas en filtre passe-bande, passe-haut ou coupe-bande avec les contraintes de fréquence souhaitées.

  4. Pour le design de filtres numériques, elle utilise la fonction bilinear pour convertir le filtre analogique en filtre numérique à l’aide d’une transformation bilinéaire avec pré-distorsion de la fréquence. Un ajustement soigneux de la fréquence permet aux filtres analogiques et numériques d’avoir la même amplitude de réponse en fréquence à Wn ou à w1 et w2.

  5. Elle reconvertit le filtre de représentation d’état en fonction de transfert ou au format zéro-pôle-gain selon les besoins.

Références

[1] Lyons, Richard G. Understanding Digital Signal Processing. Upper Saddle River, NJ: Prentice Hall, 2004.

Capacités étendues

développer tout

Génération de code C/C++
Générez du code C et C++ avec MATLAB® Coder™.

Historique des versions

Introduit avant R2006a

développer tout