Main Content

La traducción de esta página está obsoleta. Haga clic aquí para ver la última versión en inglés.

Compensar el retardo y la distorsión generados por filtros

Al filtrar una señal se puede generar un retardo. Esto significa que la señal de salida está desplazada en el tiempo con respecto a la entrada.

Cuando el desplazamiento es constante, se puede corregir el retardo desplazando la señal en el tiempo.

A veces, los filtros retrasan ciertos componentes de frecuencia más que otros. Este fenómeno se conoce como distorsión de fase. Para compensar este efecto, puede realizar un filtrado de fase cero con la función filtfilt.

Tome la lectura de un electrocardiograma muestreada a 500 Hz durante 1 s. Añada ruido aleatorio. Reinicie el generador de números aleatorios para obtener resultados reproducibles

Fs = 500;
N = 500;

rng default

xn = ecg(N)+0.1*randn([1 N]);
tn = (0:N-1)/Fs;

Elimine parte del ruido utilizando un filtro que detenga las frecuencias superiores a 75 Hz. Utilice designfilt para diseñar un filtro FIR de orden 70.

Nfir = 70;
Fst = 75;

firf = designfilt('lowpassfir','FilterOrder',Nfir, ...
    'CutoffFrequency',Fst,'SampleRate',Fs);

Filtre la señal y represéntela. El resultado es más suave que el original, pero presenta un desfase.

xf = filter(firf,xn);

plot(tn,xn,tn,xf)
title 'Electrocardiogram'
xlabel 'Time (s)'
legend('Original','FIR Filtered')
grid

Figure contains an axes object. The axes object with title Electrocardiogram contains 2 objects of type line. These objects represent Original, FIR Filtered.

Utilice grpdelay para comprobar que el retardo causado por el filtro es igual a la mitad del orden del filtro.

grpdelay(firf,N,Fs)

Figure Filter Visualization Tool - Group delay contains an axes object and other objects of type uitoolbar, uimenu. The axes object with title Group delay contains an object of type line.

delay = mean(grpdelay(firf))
delay = 35

Alinee los datos. Desplace la señal filtrada eliminando sus primeras muestras delay. Elimine las últimas muestras delay del original y del vector temporal.

tt = tn(1:end-delay);
sn = xn(1:end-delay);

sf = xf;
sf(1:delay) = [];

Represente las señales y verifique que están alineadas.

plot(tt,sn,tt,sf)
title 'Electrocardiogram'
xlabel('Time (s)')
legend('Original Signal','Filtered Shifted Signal')
grid

Figure contains an axes object. The axes object with title Electrocardiogram contains 2 objects of type line. These objects represent Original Signal, Filtered Shifted Signal.

Repita el cálculo utilizando un filtro IIR de 7.º orden.

Niir = 7;

iir = designfilt('lowpassiir','FilterOrder',Niir, ...
    'HalfPowerFrequency',Fst,'SampleRate',Fs);

Filtre la señal. La señal filtrada es más limpia que la original, pero se retrasa en el tiempo con respecto a esta última. También se distorsiona debido a la fase no lineal del filtro.

xfilter = filter(iir,xn);

plot(tn,xn,tn,xfilter)

title 'Electrocardiogram'
xlabel 'Time (s)'
legend('Original','Filtered')
axis([0.25 0.55 -1 1.5])
grid

Figure contains an axes object. The axes object with title Electrocardiogram contains 2 objects of type line. These objects represent Original, Filtered.

Al observar el retardo de grupo introducido por el filtro se establece que el retardo depende de la frecuencia.

grpdelay(iir,N,Fs)

Figure Filter Visualization Tool - Group delay contains an axes object and other objects of type uitoolbar, uimenu. The axes object with title Group delay contains an object of type line.

Filtre la señal utilizando filtfilt. Como podrá comprobar, el retardo y la distorsión se han eliminado. Utilice filtfilt cuando sea fundamental mantener intacta la información de fase de una señal.

xfiltfilt = filtfilt(iir,xn);

plot(tn,xn)
hold on
plot(tn,xfilter)
plot(tn,xfiltfilt)

title 'Electrocardiogram'
xlabel 'Time (s)'
legend('Original','''filter''','''filtfilt''')
axis([0.25 0.55 -1 1.5])
grid

Figure contains an axes object. The axes object with title Electrocardiogram contains 3 objects of type line. These objects represent Original, 'filter', 'filtfilt'.