Contenu principal

filtfilt

Filtrage numérique à phase zéro

Description

y = filtfilt(b,a,x) applique un filtrage numérique à phase zéro en traitant les données d’entrée x à la fois en sens avant et arrière. Après avoir filtré les données en sens avant, la fonction reproduit les conditions initiales pour minimiser les transitoires de démarrage et de fin, inverse la séquence filtrée et refait passer la séquence inversée par le filtre. Le résultat présente les caractéristiques suivantes :

  • Distorsion de phase nulle

  • Fonction de transfert de filtre égale à l’amplitude au carré de la fonction de transfert de filtre d’origine

  • Ordre de filtre égal au double de l’ordre du filtre défini par b et a

filtfilt implémente l’algorithme proposé par Gustafsson [1].

N’utilisez pas filtfilt avec des filtres FIR différenciateurs et de Hilbert, car le fonctionnement de ces filtres dépend fortement de leur réponse en phase.

exemple

y = filtfilt(sos,g,x) applique un filtrage à phase zéro aux données d’entrée x, en utilisant le filtre à sections de second ordre (biquadratique) représenté par la matrice sos et les valeurs d’échelle g.

y = filtfilt(d,x) applique un filtrage à phase zéro aux données d’entrée x, en utilisant un filtre numérique d. Utilisez designfilt pour générer d selon des spécifications de réponse en fréquence.

exemple

y = filtfilt(B,A,x,"ctf") applique un filtrage à phase zéro aux données d’entrée x, en utilisant des Cascaded Transfer Functions (CTF) définies par les coefficients de numérateur B et de dénominateur A. (depuis R2024b)

Remarque

Spécifiez l’option "ctf" pour distinguer les matrices de numérateurs CTF B à six colonnes des matrices de sections de second ordre en entrée sos lorsque vous définissez A sous forme de scalaire ou de vecteur.

exemple

y = filtfilt({B,A,g},x) inclut les valeurs scalaires g du filtre dans le filtrage des données d’entrée x. (depuis R2024b)

exemple

Exemples

réduire tout

Le filtrage à phase zéro permet de conserver les caractéristiques d’une forme d’onde temporelle filtrée en les faisant apparaître exactement au même endroit que dans le signal non filtré.

Appliquez un filtre à phase zéro à une forme d’onde d’électrocardiogramme (ECG) synthétique. La fonction qui génère la forme d’onde se trouve à la fin de l’exemple. Le complexe QRS est une caractéristique importante de l’ECG. Ici, il commence vers le point temporel 160.

wform = ecg(500);

plot(wform)
axis([0 500 -1.25 1.25])
text(155,-0.4,"Q")
text(180,1.1,"R")
text(205,-1,"S")

Figure contains an axes object. The axes object contains 4 objects of type line, text.

Altérez l’ECG avec du bruit additif. Réinitialisez le générateur de nombres aléatoires pour obtenir des résultats reproductibles. Créez un filtre FIR passe-bas à ondulations constantes et filtrez la forme d’onde bruitée en utilisant à la fois un filtrage à phase zéro et conventionnel.

rng("default")

x = wform' + 0.25*randn(500,1);
d = designfilt("lowpassfir", ...
    PassbandFrequency=0.15,StopbandFrequency=0.2, ...
    PassbandRipple=1,StopbandAttenuation=60, ...
    DesignMethod="equiripple");
y = filtfilt(d,x);
y1 = filter(d,x);

tiledlayout("flow")
nexttile
plot([y y1])
title("Filtered Waveforms")
legend(["Zero-phase Filtering" "Conventional Filtering"])

nexttile
plot(wform)
title("Original Waveform")

Figure contains 2 axes objects. Axes object 1 with title Filtered Waveforms contains 2 objects of type line. These objects represent Zero-phase Filtering, Conventional Filtering. Axes object 2 with title Original Waveform contains an object of type line.

Le filtrage à phase zéro réduit le bruit dans le signal et fait apparaître le complexe QRS au même moment que dans le signal d’origine. Le filtrage conventionnel réduit le bruit dans le signal mais retarde le complexe QRS.

Répétez le filtrage, cette fois avec un filtre de Butterworth à sections de second ordre.

d1 = designfilt("lowpassiir",FilterOrder=12, ...
    HalfPowerFrequency=0.15,DesignMethod="butter");
y = filtfilt(d1,x);

figure
plot(x)
hold on
plot(y,LineWidth=3)
hold off
legend(["Noisy ECG" "Zero-Phase Filtering"])

Figure contains an axes object. The axes object contains 2 objects of type line. These objects represent Noisy ECG, Zero-Phase Filtering.

La fonction suivante génère la forme d’onde de l’ECG.

function x = ecg(L)
%ECG Electrocardiogram (ECG) signal generator.
%   ECG(L) generates a piecewise linear ECG signal of length L.
%
%   EXAMPLE:
%   x = ecg(500).';
%   y = sgolayfilt(x,0,3); % Typical values are: d=0 and F=3,5,9, etc. 
%   y5 = sgolayfilt(x,0,5); 
%   y15 = sgolayfilt(x,0,15); 
%   plot(1:length(x),[x y y5 y15]);

%   Copyright 1988-2002 The MathWorks, Inc.

a0 = [0,1,40,1,0,-34,118,-99,0,2,21,2,0,0,0]; % Template
d0 = [0,27,59,91,131,141,163,185,195,275,307,339,357,390,440];
a = a0/max(a0);
d = round(d0*L/d0(15)); % Scale them to fit in length L
d(15)=L;

for i=1:14
       m = d(i):d(i+1)-1;
       slope = (a(i+1)-a(i))/(d(i+1)-d(i));
       x(m+1) = a(i)+slope*(m-d(i));
end

end

Depuis R2024b

Utilisez des fonctions de transfert en cascade pour appliquer un filtrage à phase zéro.

Créez un filtre elliptique avec une ondulation dans la bande passante de 0,1 dB et une atténuation dans la bande coupée de 40 dB. Spécifiez une fréquence d’échantillonnage de 2 000 Hz. Tracez la réponse en fréquence du filtre.

Fs = 2000;
[B,A] = ellip(20,0.1,40,[0.3 0.7],"ctf");
freqz(B,A,2048,Fs,"ctf")

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

Filtrez un signal chirp à balayage linéaire où la fréquence de Nyquist se produit à 1 seconde. Comparez les spectres des signaux d’entrée et de sortie.

t = 0:1/Fs:1;
x = chirp(t,0,t(end),Fs/2)';
y = filtfilt(B,A,x,"ctf");
pspectrum([x y],Fs,Leakage=1,FrequencyResolution=1)

Figure contains an axes object. The axes object with title Fres = 1 Hz, xlabel Frequency (kHz), ylabel Power Spectrum (dB) contains 2 objects of type line.

Depuis R2024b

Recréez des artefacts sinusoïdaux bruités avec un filtrage à phase zéro par fonction de transfert. Filtrez un signal oscillatoire avec une CTF et des valeurs d’échelle.

Créez le signal u composé de bruit normalement distribué et de trois formes d’onde sinusoïdales. La fréquence d’échantillonnage est de 1 kHz.

rng("default")
Fs = 1e3;
ts = (0:1/Fs:2)';

a0 = [3 2 1];
f0 = [0.1 0.5 0.9]*Fs/2;
p0 = [0 pi/4 pi/2];

u = 0.1*randn(size(ts)) + 0.1*sin(2*pi*f0.*ts+p0)*a0';

Recréez des artefacts sinusoïdaux bruités en filtrant n0 avec un filtre de Butterworth numérique coupe-bande de troisième ordre et créez le signal v.

[b,a] = butter(3,[0.15 0.85],"stop");
v = filtfilt(b,a,u);

Comparez u et v. Remarquez que les deux signaux sont en phase.

tiledlayout("flow")
nexttile
strips([u(ts<0.1) v(ts<0.1)],0.1,Fs)
legend(["u" "v"],Location="southeast")
xlabel("Time (seconds)")
nexttile
pspectrum([u v],Fs)
legend(["u" "v"],Location="southeast")

Figure contains 2 axes objects. Axes object 1 with xlabel Time (seconds) contains 2 objects of type line. These objects represent u, v. Axes object 2 with title Fres = 1.2821 Hz, xlabel Frequency (Hz), ylabel Power Spectrum (dB) contains 2 objects of type line. These objects represent u, v.

Créez le signal oscillatoire commandé en tension x. Ajoutez les artefacts sinusoïdaux bruités représentés par le signal v.

vo = exp(-2*abs(ts-1)).*sin(8*pi*ts);
x = vco(vo,[0.25 0.75]*Fs/2,Fs) + v;

Filtrez le signal x avec un filtre de Tchebychev de type II d’ordre 24. Utilisez le format CTF et des valeurs d’échelle (B,A,g).

[B,A,g] = cheby2(24,50,[0.2 0.8],"ctf");
y = filtfilt({B,A,g},x);

Comparez l’amplitude au carré des transformées de Fourier à court terme. Remarquez la forte diminution d’amplitude dans les bandes atténuées.

tiledlayout("flow")
nexttile
stft(x,Fs,Window=bohmanwin(128),OverlapLength=120, ...
    FFTLength=512,FrequencyRange="onesided")
title("Input x")
nexttile
stft(y,Fs,Window=bohmanwin(128),OverlapLength=120, ...
    FFTLength=512,FrequencyRange="onesided")
title("Output y")

Figure contains 2 axes objects. Axes object 1 with title Input x, xlabel Time (s), ylabel Frequency (Hz) contains an object of type image. Axes object 2 with title Output y, xlabel Time (s), ylabel Frequency (Hz) contains an object of type image.

Arguments d'entrée

réduire tout

Coefficients de la fonction de transfert, définis par des vecteurs. Si vous utilisez un filtre tout-pôle, définissez b à 1. Si vous utilisez un filtre tout-zéro, définissez a à 1.

Exemple : b = [1 3 3 1]/6 et a = [3 0 1 0]/3 définissent un filtre de Butterworth de troisième ordre avec une fréquence à 3 dB normalisée de 0,5π rad/échantillon.

Types de données : double | single

Signal d’entrée, défini par un vecteur, une matrice ou un tableau ND à valeurs réelles ou complexes. x doit être à valeurs finies. La longueur de x doit être supérieure au triple de l’ordre du filtre défini par max(length(B)-1, length(A)-1). La fonction s’applique le long de la première dimension de tableau de x sauf si x est un vecteur ligne. Si x est un vecteur ligne, la fonction s’applique le long de la deuxième dimension.

Exemple : cos(pi/4*(0:159))+randn(1,160) est un signal monocanal défini par un vecteur ligne.

Exemple : cos(pi./[4;2]*(0:159))'+randn(160,2) est un signal bicanal.

Types de données : double | single
Support des nombres complexes : Oui

Coefficients des sections de second ordre, définis par une matrice. sos est une matrice L x 6 où le nombre de sections L doit être supérieur ou égal à 2. Si le nombre de sections est inférieur à 2, la fonction traite l’entrée comme un vecteur de numérateurs. Chaque ligne de sos correspond aux coefficients d’un filtre de second ordre (biquadratique). La i-ième ligne de sos correspond à [bi(1) bi(2) bi(3) ai(1) ai(2) ai(3)].

Exemple : s = [2 4 2 6 0 2;3 3 0 6 0 0] définit un filtre de Butterworth de troisième ordre avec une fréquence à 3 dB normalisée de 0,5π rad/échantillon.

Types de données : double | single

Depuis R2024b

Valeurs d’échelle, définies par un scalaire à valeur réelle ou un vecteur à valeurs réelles à L + 1 éléments, où L est le nombre de sections CTF. Les valeurs d’échelle représentent la répartition du gain du filtre entre les sections de la représentation de filtre en cascade.

La fonction filtfilt applique un gain aux sections de filtre en utilisant la fonction scaleFilterSections selon la manière dont vous définissez g :

  • Scalaire : la fonction répartit uniformément le gain entre toutes les sections de filtre.

  • Vecteur : la fonction applique les L premières valeurs de gain aux sections de filtre correspondantes. La dernière valeur de gain est répartie uniformément entre toutes les sections de filtre.

Types de données : double | single

Filtre numérique, défini par un objet digitalFilter. Utilisez designfilt pour générer un filtre numérique selon des spécifications de réponse en fréquence.

Exemple : d = designfilt("lowpassiir",FilterOrder=3,HalfPowerFrequency=0.5) définit un filtre de Butterworth de troisième ordre avec une fréquence à 3 dB normalisée de 0,5π rad/échantillon.

Depuis R2024b

Coefficients de la fonction de transfert en cascade (CTF), définis par des scalaires, des vecteurs ou des matrices. B et A indiquent respectivement les coefficients de numérateur et de dénominateur de la fonction de transfert en cascade.

B doit être de taille L x (m + 1) et A doit être de taille L x (n + 1), où :

  • 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.

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

Remarque

Si un élément de A(:,1) n’est pas égal à 1, la fonction filtfilt normalise les coefficients de filtre selon A(:,1). Dans ce cas, A(:,1) ne doit pas contenir de valeur nulle.

Types de données : double | single
Support des nombres complexes : Oui

Arguments de sortie

réduire tout

Signal filtré, renvoyé sous la forme d’un vecteur, d’une matrice ou d’un tableau ND.

  • La fonction filtfilt renvoie y avec la même taille que x.

  • Si vous spécifiez un argument d’entrée de type single, la fonction filtfilt calcule l’opération de filtrage en simple précision et renvoie y avec le type single. Sinon, filtfilt renvoie y avec le type double.

En savoir plus

réduire tout

Conseils

  • Vous pouvez obtenir des filtres au format CTF, y compris le gain de mise à l’échelle. Utilisez les sorties des fonctions de design de filtres IIR numériques telles que butter, cheby1, cheby2 et ellip. Indiquez l’argument de type de filtre "ctf" dans ces fonctions et spécifiez de renvoyer B, A et g pour obtenir les valeurs d’échelle. (depuis R2024b)

Références

[1] Gustafsson, F. “Determining the initial states in forward-backward filtering.” IEEE® Transactions on Signal Processing. Vol. 44, April 1996, pp. 988–992. https://doi.org/10.1109/78.492552.

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

[3] Mitra, Sanjit K. Digital Signal Processing. 2nd Ed. New York: McGraw-Hill, 2001.

[4] Oppenheim, Alan V., and Ronald W. Schafer, with John R. Buck. Discrete-Time Signal Processing. 2nd Ed. Upper Saddle River, NJ: Prentice Hall, 1999.

Capacités étendues

développer tout

Historique des versions

Introduit avant R2006a

développer tout