Contenido principal

filtfilt

Filtrado digital de fase cero

Descripción

y = filtfilt(b,a,x) realiza un filtrado digital de fase cero procesando los datos de entrada x tanto en dirección directa como inversa. Después de filtrar los datos en dirección directa, la función establece una correspondencia con las condiciones iniciales para minimizar los transitorios de inicio y final, invierte la secuencia filtrada y vuelve a pasar la secuencia invertida por el filtro. El resultado tiene estas características:

  • Distorsión de fase cero

  • Una función de transferencia de filtro igual a la magnitud al cuadrado de la función de transferencia del filtro original

  • Un orden del filtro que es el doble del orden de filtro especificado por b y a

filtfilt implementa el algoritmo propuesto por Gustafsson [1].

No utilice filtfilt con filtros FIR diferenciadores y de Hilbert, porque el funcionamiento de esos filtros depende en gran medida de su respuesta de fase.

ejemplo

y = filtfilt(sos,g,x) filtra de fase cero los datos de entrada x utilizando el filtro de la sección de segundo orden (bicuadrado) que la matriz sos y los valores g representan.

y = filtfilt(d,x) filtra de fase cero los datos de entrada x utilizando un filtro digital d. Utilice designfilt para generar d según las especificaciones de frecuencia-respuesta.

ejemplo

y = filtfilt(B,A,x,"ctf") filtra de fase cero los datos de entrada x utilizando Cascaded Transfer Functions (CTF) definidas por los coeficientes de numerador y denominador B y A, respectivamente. (desde R2024b)

Nota

Especifique la opción "ctf" para desambiguar las matrices de numerador CTF B con seis columnas de las entradas de matriz de sección de segundo orden, sos, cuando especifica A como un escalar o un vector.

ejemplo

y = filtfilt({B,A,g},x) incluye los valores de escala del filtro, g, en el filtrado de los datos de entrada, x. (desde R2024b)

ejemplo

Ejemplos

contraer todo

El filtrado de fase cero ayuda a conservar las características de una forma de onda de tiempo filtrada exactamente donde se producen en la señal sin filtrar.

Filtre de fase cero una forma de onda de un electrocardiograma (ECG) sintético. La función que genera la forma de onda se encuentra al final del ejemplo. El complejo QRS es una característica importante del ECG. Aquí, comienza alrededor del punto de tiempo 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.

Corrompa el ECG con ruido aditivo. Reinicie el generador de números aleatorios para obtener resultados reproducibles. Construya un filtro FIR equiripple de paso bajo y filtre la forma de onda con ruido utilizando tanto el filtrado de fase cero como el convencional.

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.

El filtrado de fase cero reduce el ruido de la señal y mantiene el complejo QRS en el mismo momento en el que se produce en la original. El filtrado convencional reduce el ruido de la señal pero retarda el complejo QRS.

Repita el filtrado utilizando un filtro Butterworth de la sección de segundo orden.

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.

Esta función genera la forma de onda del 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

Desde R2024b

Utilice las funciones de transferencia en cascada para realizar filtrados de fase cero.

Diseñe un filtro elíptico con una ondulación de banda de paso de 0,1 dB y una atenuación de banda de parada de 40 dB. Especifique una tasa de muestreo de 2.000 Hz. Represente la respuesta en frecuencia del filtro.

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.

Filtre una señal chirp de barrido lineal, donde la frecuencia de Nyquist ocurre en un segundo. Compare los espectros entre las señales de entrada y de salida.

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.

Desde R2024b

Recree artefactos sinusoidales con ruido con filtrado de fase cero y de función de transferencia. Filtre una señal oscilante utilizando CTF y valores de escala.

Cree una señal u compuesta de ruido distribuido normalmente y tres formas de onda sinusoidales. La tasa de muestreo es 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';

Recree artefactos sinusoidales con ruido filtrando n0 con un filtro digital Butterworth eliminador de banda y cree una señal v.

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

Compare u y v. Observe que ambas señales están en fase.

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.

Cree una señal oscilante controlada por tensión x. Añada artefactos sinusoidales con ruido representados por la señal v.

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

Filtre la señal x con un filtro Chebyshev tipo II de orden 24. Utilice el formato CTF y los valores de escala (B,A,g).

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

Compare la magnitud al cuadrado de las transformadas de Fourier de tiempo corto. Observe una fuerte disminución de la magnitud en las bandas de parada.

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.

Argumentos de entrada

contraer todo

Coeficientes de la función de transferencia, especificados como vectores. Si utiliza un filtro de todos los polos, establezca b en 1. Si utiliza un filtro cero (FIR), establezca a en 1.

Ejemplo: b = [1 3 3 1]/6 y a = [3 0 1 0]/3 especifican un filtro Butterworth de tercer orden con una frecuencia normalizada de 3 dB de 0,5π rad/muestra.

Tipos de datos: double | single

Señal de entrada, especificada como un vector con valor real o complejo, matriz o arreglo N-D. x debe tener un valor finito. La longitud de x debe ser mayor que tres veces el orden del filtro, definida como max(length(B)-1, length(A)-1). La función opera a lo largo de la primera dimensión del arreglo x a menos que x sea un vector fila. Si x es un vector fila, la función opera a lo largo de la segunda dimensión.

Ejemplo: cos(pi/4*(0:159))+randn(1,160) es una señal de vector fila monocanal.

Ejemplo: cos(pi./[4;2]*(0:159))'+randn(160,2) es una señal de dos canales.

Tipos de datos: double | single
Soporte de números complejos:

Coeficientes de la sección de segundo orden, especificados como matriz. sos es una matriz de L por 6 donde el número de secciones L debe ser mayor que o igual a 2. Si el número de secciones es menor que 2, la función trata la entrada como un vector de numerador. Cada fila de sos corresponde a los coeficientes de un filtro de segundo orden (bicuadrado). La fila i de sos corresponde a [bi(1) bi(2) bi(3) ai(1) ai(2) ai(3)].

Ejemplo: s = [2 4 2 6 0 2;3 3 0 6 0 0] especifica un filtro Butterworth de tercer orden con una frecuencia normalizada de 3 dB de 0,5π rad/muestra.

Tipos de datos: double | single

Desde R2024b

Valores de escala, especificados como un escalar de valor real o un vector de valor real con L + 1 elementos, donde L es el número de secciones CTF. Los valores de escala representan la distribución de la ganancia del filtro en las secciones de la representación del filtro en cascada.

La función filtfilt aplica una ganancia a las secciones de filtro usando la función scaleFilterSections dependiendo de cómo especifique g:

  • Escalar: la función distribuye la ganancia uniformemente en todas las secciones de filtro.

  • Vector: la función aplica los primeros valores de ganancia L a las secciones de filtro correspondientes y distribuye el último valor de ganancia uniformemente en todas las secciones de filtro.

Tipos de datos: double | single

Filtro digital, especificado como un objeto digitalFilter. Utilice designfilt para generar un filtro digital según las especificaciones de frecuencia-respuesta.

Ejemplo: d = designfilt("lowpassiir",FilterOrder=3,HalfPowerFrequency=0.5) especifica un filtro Butterworth de tercer orden con una frecuencia normalizada de 3 dB de 0,5π rad/muestra.

Desde R2024b

Coeficientes de función de transferencia en cascada (CTF), especificados como escalares, vectores o matrices. B y A indican los coeficientes de numerador y denominador de la función de transferencia en cascada, respectivamente.

B debe tener un tamaño de L por (m + 1) y A debe tener un tamaño de L por (n + 1), donde:

  • L representa el número de secciones del filtro.

  • m representa el orden de los numeradores del filtro.

  • n representa el orden de los denominadores del filtro.

Para obtener más información sobre el formato de la función de transferencia en cascada y las matrices de coeficientes, consulte Especificar filtros digitales en formato CTF.

Nota

Si cualquier elemento de A(:,1) no equivale a 1, entonces filtfilt normaliza los coeficientes de filtro mediante A(:,1). En este caso, A(:,1) debe ser distinto de cero.

Tipos de datos: double | single
Soporte de números complejos:

Argumentos de salida

contraer todo

Señal filtrada, devuelta como vector, matriz o arreglo N-D.

  • La función filtfilt devuelve y con el mismo tamaño que x.

  • Si especifica cualquier argumento de entrada como tipo single, filtfilt calcula la operación de filtrado utilizando aritmética de precisión simple, y devuelve y como tipo single. En caso contrario, filtfilt devuelve y como tipo double.

Más acerca de

contraer todo

Sugerencias

  • Puede obtener filtros en formato CTF, incluida la ganancia de escala. Utilice las salidas de las funciones de diseño de filtros IIR digitales, como butter, cheby1, cheby2 y ellip. Especifique el argumento de tipo de filtro "ctf" en estas funciones y especifique que se devuelvan B, A y g para obtener los valores de escala. (desde R2024b)

Referencias

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

Capacidades ampliadas

expandir todo

Historial de versiones

Introducido antes de R2006a

expandir todo