Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Compensar el retraso y la distorsión introducidos por los filtros

Filtrar una señal introduce un retardo. Esto significa que la señal de salida se desplaza en el tiempo con respecto a la entrada.

Cuando el cambio es constante, puede corregir el retraso desplazando la señal a tiempo.

A veces, el filtro retrasa algunos componentes de frecuencia más que otros. Este fenómeno se denomina distorsión de fase. Para compensar este efecto, puede realizar el filtrado de fase cero mediante la función.filtfilt

Tome un electrocardiograma de lectura muestreado a 500 Hz durante 1 s. Añadir ruido aleatorio. Restablezca 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 por encima de 75 Hz. Se utiliza para diseñar un filtro FIR de orden 70.designfilt

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

Filtrar la señal y trazarla. El resultado es más suave que el original, pero se queda atrás.

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

Se utiliza para comprobar que el retraso causado por el filtro es igual a la mitad del orden del filtro.grpdelay

grpdelay(firf,N,Fs)

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

Alinee los datos. Cambie la señal filtrada eliminando sus primeras muestras.delay Retire las últimas muestras del vector original y del vector de tiempo.delay

tt = tn(1:end-delay); sn = xn(1:end-delay);  sf = xf; sf(1:delay) = [];

Trazar las señales y verificar 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 7o orden.

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

Filtra la señal. La señal filtrada es más limpia que la original, pero se retiene en el tiempo con respecto a ella. 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

Un vistazo al retardo del grupo introducido por el filtro muestra que el retardo es dependiente de la frecuencia.

grpdelay(iir,N,Fs)

Filtrar la señal utilizando .filtfilt El retraso y la distorsión se han eliminado efectivamente. Utilícelo cuando sea crítico mantener intacta la información de fase de una señal.filtfilt

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