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 retardo y la distorsión introducidos por los filtros

El filtrado de 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 retardo desplazando la señal en el 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 utilizando la función.filtfilt

Tome una lectura de electrocardiograma muestreada 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 con 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);

Filtra la señal y compelo. El resultado es más suave que el original, pero se queda rezagada.

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

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

grpdelay(firf,N,Fs)

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

Alinee los datos. Desplace la señal filtrada quitando sus primeras muestras.delay Quite las últimas muestras del original y del vector de tiempo.delay

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

Trace 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 con 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 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

Una mirada al retardo de grupo introducido por el filtro muestra que el retardo es dependiente de la frecuencia.

grpdelay(iir,N,Fs)

Filtre la señal usando.filtfilt El retardo y la distorsión se han eliminado eficazmente. Se utiliza cuando es fundamental 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