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
Utilice grpdelay
para comprobar que el retardo causado por el filtro es igual a la mitad del orden del filtro.
grpdelay(firf,N,Fs)
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
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
Al observar el retardo de grupo introducido por el filtro se establece que el retardo depende de la frecuencia.
grpdelay(iir,N,Fs)
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