Contenu principal

fir1

Design de filtres FIR avec des fenêtres

Description

b = fir1(n,Wn) utilise une fenêtre de Hamming pour créer un filtre FIR passe-bas, passe-bande ou multibande d’ordre n à phase linéaire. Le type de filtre dépend du nombre d’éléments de Wn.

exemple

b = fir1(n,Wn,ftype) crée un filtre passe-bas, passe-haut, passe-bande, coupe-bande ou multibande selon la valeur de ftype et le nombre d’éléments de Wn.

exemple

b = fir1(___,window) crée le filtre en utilisant le vecteur défini dans window et un ou plusieurs arguments des syntaxes précédentes.

exemple

b = fir1(___,scaleopt) indique également si la réponse en amplitude du filtre est normalisée.

Remarque : Utilisez fir2 pour les filtres fenêtrés à réponse en fréquence arbitraire.

Exemples

réduire tout

Créez un filtre FIR passe-bande d’ordre 48 avec la bande passante 0.35πω0.65π rad/échantillon. Affichez ses réponses en amplitude et en phase.

b = fir1(48,[0.35 0.65]);
freqz(b,1,512)

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.

Chargez le fichier chirp.mat. Il contient un signal y dont la puissance est majoritairement au-dessus de Fs/4, soit la moitié de la fréquence de Nyquist. La fréquence d’échantillonnage est de 8 192 kHz.

Créez un filtre FIR passe-haut d’ordre 34 pour atténuer les composantes du signal en dessous de Fs/4. Utilisez une fréquence de coupure de 0,48 et une fenêtre de Tchebychev avec une ondulation de 30 dB.

load chirp

t = (0:length(y)-1)/Fs;

bhi = fir1(34,0.48,"high",chebwin(35,30));
freqz(bhi,1)

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.

Filtrez le signal. Affichez le signal d’origine et le signal filtré passe-haut. Utilisez la même échelle d’axe des y pour les deux tracés.

outhi = filter(bhi,1,y);

tiledlayout("flow")
nexttile
plot(t,y)
title("Original Signal")
ys = ylim;

nexttile
plot(t,outhi)
title("Highpass Filtered Signal")
xlabel("Time (s)")
ylim(ys)

Figure contains 2 axes objects. Axes object 1 with title Original Signal contains an object of type line. Axes object 2 with title Highpass Filtered Signal, xlabel Time (s) contains an object of type line.

Créez un filtre passe-bas avec les mêmes spécifications. Filtrez le signal et comparez le résultat au signal d’origine. Utilisez la même échelle d’axe des y pour les deux tracés.

blo = fir1(34,0.48,chebwin(35,30));

outlo = filter(blo,1,y);

tiledlayout("flow")
nexttile
plot(t,y)
title("Original Signal")
ys = ylim;

nexttile
plot(t,outlo)
title("Lowpass Filtered Signal")
xlabel("Time (s)")
ylim(ys)

Figure contains 2 axes objects. Axes object 1 with title Original Signal contains an object of type line. Axes object 2 with title Lowpass Filtered Signal, xlabel Time (s) contains an object of type line.

Créez un filtre FIR d’ordre 46 qui atténue les fréquences normalisées en dessous de 0.4π rad/échantillon ainsi qu’entre 0.6π et 0.9π rad/échantillon. Appelez-le bM. Calculez sa réponse en fréquence.

ord = 46;

low = 0.4;
bnd = [0.6 0.9];

bM = fir1(ord,[low bnd]);
[hbM,f] = freqz(bM,1);

Modifiez le design de bM pour qu’il laisse passer les bandes qu’il atténuait et qu’il coupe les autres fréquences. Appelez ce nouveau filtre bW. Affichez les réponses en fréquence des filtres.

bW = fir1(ord,[low bnd],"DC-1");

[hbW,~] = freqz(bW,1);
plot(f/pi,mag2db(abs(hbM)),f/pi,mag2db(abs(hbW)))
legend("bM","bW",Location="best")
ylim([-75 5])
grid

Figure contains an axes object. The axes object contains 2 objects of type line. These objects represent bM, bW.

Modifiez le design de bM avec une fenêtre de Hann. (L’utilisation de "DC-0" est facultative.) Comparez les réponses en amplitude des designs de Hamming et de Hann.

hM = fir1(ord,[low bnd],'DC-0',hann(ord+1));

hhM = freqz(hM,1);
plot(f/pi,mag2db(abs(hbM)),f/pi,mag2db(abs(hhM)))
legend("Hamming","Hann",Location="northwest")
ylim([-75 5])
grid

Figure contains an axes object. The axes object contains 2 objects of type line. These objects represent Hamming, Hann.

Modifiez le design de bW avec une fenêtre de Tukey. Comparez les réponses en amplitude des designs de Hamming et de Tukey.

tW = fir1(ord,[low bnd],'DC-1',tukeywin(ord+1));

htW = freqz(tW,1);
plot(f/pi,mag2db(abs(hbW)),f/pi,mag2db(abs(htW)))
legend("Hamming","Tukey",Location="best")
ylim([-75 5])
grid

Figure contains an axes object. The axes object contains 2 objects of type line. These objects represent Hamming, Tukey.

Arguments d'entrée

réduire tout

Ordre du filtre, défini par un scalaire entier.

Pour les configurations passe-haut et coupe-bande, fir1 utilise toujours un ordre de filtre pair. En effet, les filtres FIR symétriques d’ordre impair doivent avoir un gain nul à la fréquence de Nyquist. Si vous indiquez une valeur n impaire pour un filtre passe-haut ou coupe-bande, fir1 incrémente n de 1.

Types de données : double

Contraintes de fréquence, définies par un scalaire ou par un vecteur à deux éléments ou à éléments multiples. Tous les éléments de Wn doivent être strictement supérieurs à 0 et strictement inférieurs à 1, où 1 correspond à la fréquence de Nyquist : 0 < Wn < 1. La fréquence de Nyquist est égale à la moitié de la fréquence d’échantillonnage ou π rad/échantillon.

  • Si Wn est un scalaire, fir1 crée un filtre passe-bas ou passe-haut avec la fréquence de coupure Wn. La fréquence de coupure est la fréquence à laquelle le gain normalisé du filtre est de –6 dB.

  • Si Wn est le vecteur à deux éléments [w1 w2], où w1 < w2, fir1 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.

  • Si Wn est le vecteur à éléments multiples [w1 w2 ... wn], où w1 < w2 < … < wn, fir1 renvoie un filtre multibande d’ordre n avec les bandes 0 < ω < w1, w1 < ω < w2, …, wn < ω < 1.

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 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 si Wn est un vecteur à deux éléments.

  • 'DC-0' indique que la première bande d’un filtre multibande est une bande atténuée. 'DC-0' est le type par défaut lorsque Wn contient plus de deux éléments.

  • 'DC-1' indique que la première bande d’un filtre multibande est une bande passante.

Fenêtre, définie par un vecteur. Le vecteur de fenêtre doit contenir n + 1 éléments. Si vous ne spécifiez pas window, fir1 utilise une fenêtre de Hamming. Pour une liste des fenêtres disponibles, veuillez consulter Windows.

fir1 n’augmente pas automatiquement la longueur de window si vous essayez de créer un filtre passe-haut ou coupe-bande d’ordre impair.

Exemple : kaiser(n+1,0.5) définit une fenêtre de Kaiser avec un paramètre de forme égal à 0,5 à utiliser avec un filtre d’ordre n.

Exemple : hamming(n+1) revient à ne pas spécifier la fenêtre à utiliser.

Types de données : double

Option de normalisation, définie par 'scale' ou par 'noscale'.

  • 'scale' normalise les coefficients pour que la réponse en amplitude du filtre au centre de la bande passante soit égale à 1 (0 dB).

  • 'noscale' ne normalise pas les coefficients.

Arguments de sortie

réduire tout

Coefficients de filtre, renvoyés sous la forme d’un vecteur ligne de longueur n + 1. Les coefficients sont triés par puissances décroissantes de la variable z, qui correspond à la transformée en Z :

B(z) = b(1) + b(2)z–1 + … + b(n+1)z–n.

Algorithmes

fir1 utilise une approximation par moindres carrés pour calculer les coefficients du filtre puis lisse la réponse impulsionnelle avec window.

Références

[1] Digital Signal Processing Committee of the IEEE Acoustics, Speech, and Signal Processing Society, eds. Programs for Digital Signal Processing. New York: IEEE Press, 1979, Algorithm 5.2.

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