Main Content

La traducción de esta página aún no se ha actualizado a la versión más reciente. Haga clic aquí para ver la última versión en inglés.

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.

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.

ejemplo

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.

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);

subplot(2,1,1)
plot([y y1])
title("Filtered Waveforms")
legend("Zero-phase Filtering","Conventional Filtering")

subplot(2,1,2)
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);

subplot(1,1,1)
plot(x)
hold on
plot(y,LineWidth=3)
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

Argumentos de entrada

contraer todo

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

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

Tipos de datos: single | double

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: single | double
Soporte de números complejos:

Coeficientes de la sección de segundo orden, especificados como matriz. sos es una matriz de K por 6 donde el número de secciones K 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 de 3 dB normalizada de 0,5π rad/muestra.

Tipos de datos: single | double

Factores de escala, especificados como vector.

Tipos de datos: single | double

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 de 3 dB normalizada de 0,5π rad/muestra.

Argumentos de salida

contraer todo

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

Si la entrada a filtfilt es de precisión simple, la función devuelve una salida y de precisión simple.

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] Mitra, Sanjit K. Digital Signal Processing. 2nd Ed. New York: McGraw-Hill, 2001.

[3] 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

Historial de versiones

Introducido antes de R2006a