Está en la página 1de 12

Práctica № 1: Filtrado de un ECG

Francisco Llave Iglesias, Ingeniería Electrónica Industrial 12/03/2020

1 Creación de un filtro paso alta

Nuestro objetivo es llevar a cabo un filtro que permita el paso a las frecuencias mayores que la
Baseline Wander, la cual se encuentra alrededor de los 0,5Hz y 1Hz.
Con el fin de entender perfectamente el funcionamiento del filtro, lo implementaremos de 3
formas distintas:

1.1 Función FIR1 de MatLab

La función FIR1 nos implementa un filtro de respuesta finita al impulso, con una serie de coe-
ficientes necesarios. La principal desventaja de este filtrado reside en el número de muestras
necesarias para llevar a cabo su función:

Listing 1: Función FIR1 de MatLab.


1 for i= 1:L
2 B_1 = fir1(ord(i),wn1,’high’);
3 [H_1,W1] = freqz(B_1,1,NFFT);
4 H1(:,i) = H_1;
5 end

1.2 Implementación manual de un filtro FIR

Tal y como se vio en clase de teoría, es posible implementar el funcionamiento del filtro FIR a
partir del método de las ventanas, es decir, considerando las frecuencias en las que sí quiero es-
tudiar el sistema y las frecuencias en las que no. Para ello creamos una función cuyo cometido
es calcular el sistema:

Listing 2: Método manual de las ventanas.


1 N = L/2;
2 f_c = Fc/Fs;
3 w_c = 2*pi*f_c;
4 n = -N:N;
5 h = -sin(w_c*n)./(pi*n).*(hamming(L+1))’;
6 h(N+1) = 0.998;

Francisco Llave Iglesias Página 1


1.3 Comparación de los filtros usados con la función butter de MatLab

Uso de la función y su comparación con los demás, para observar que la implementación de un
filtro IIR, aunque aumenta el coste computacional por darle la "vuelta" dos veces a la secuencia,
el número de coeficientes necesarios para filtrar la secuencia disminuye drásticamente. En
nuestro caso en particular, trabajaremos con simplemente 5 coeficientes:

Listing 3: Implementación Butterworth.


1 [b1,a1] = butter(5, wn1,’high’);[H3,W3] = freqz(b1,a1,NFFT);

1.4 Gráficas

• En la primera figura (1) observaremos la comparación entre el filtro Butterworth (en verde)
y la implementación del filtro FIR para 4 coeficientes distintos. Como podemos observar,

Figure 1: Filtro FIR1 y Butterworth, con frecuencia normalizada.

el filtro de Butterworth tiene una efectividad a la hora de eliminar frecuencias bajas muy
parecida a la del filtro FIR con 1884 coeficientes, habiendo usado 5 únicamente. Además,
gracias a la doble implementación del filtro IIR, la fase se mantiene nula, no como en el
caso del FIR.

• En esta siguiente figura (2) vemos la implementación del filtro manual con ventana de
Hamming para el suavizado. Tal y como vemos en la parte izquierda, tenemos la fre-
cuencia de corte a los 0.5Hz, mientras que a la derecha podemos ver cómo a los 0.3Hz
aproximadamente se produce el corte.

Francisco Llave Iglesias Página 2


Figure 2: Filtro ventana Hamming manual con frecuencia en Hz.

2 Comparación entre filter y filtfilt de MatLab

En esta sección compararemos las diferencias entre los filtros implementados en MatLab para
casos FIR (filter) y para casos IIR (filtfilt). En el segundo caso, como el propio nombre deja entr-
ever, se hace la inversión doble de la secuencia por ser un sistema IIR. Como comprobaremos
más tarde, esto tiene un efecto de retardo debido al coste computacional, pero sin la necesidad
de grandes cantidades de coeficientes.
En la imagen 3 vemos la comparación de ambas señales, la original en azul y la filtrada en
rojo. Tendremos un retraso debido a la frecuencia usada en el filtro. El código que implementa
la función detallada es el siguiente:

Listing 4: Filtro IIR implementado mediante filter.


1 Nf = 5; Fp = 60; Ap = 1; As = 60;
2 d = designfilt(’lowpassiir’,’FilterOrder’,Nf,’PassbandFrequency’,Fp,’←-
PassbandRipple’,Ap,’StopbandAttenuation’,As,’SampleRate’,Fs);
3 xfilter = filter(d,xn); %FUNCION FILTER
4 figure
5 plot(tn,xn,tn,xfilter);

Podemos ver que la frecuencia es proporcional al retraso a través de la función de MatLab


grpdelay, la cual nos dice la frecuencia de retraso de una señal (ver en 4):
Ahora haremos una comparación entre el uso de filter y filtfilt. La principal ventaja del filtro
filtfilt es su función "forward-backward", la cual permite que el desfase sea nulo haciendo la
inversión doble de la secuencia. Como se ve en la imagen 5, el desfase respecto a la señal

Francisco Llave Iglesias Página 3


Figure 3: Filtro ventana Hamming manual con frecuencia en Hz.

azul (original) es nulo.


El extracto de código que lo implementa es número 5.

Listing 5: Uso de filtfilt comparado con filter y original


1 xfiltfilt = filtfilt(d,xn); %FUNCION FILT FILT
2 plot(tn,xn,tn,xfilter); hold on
3 plot(tn,xfiltfilt,’r’,’linewidth’,2); hold off

Francisco Llave Iglesias Página 4


Figure 4: Retraso provocado por la función filter

Figure 5: Filtro filtfilt, filter y señal original.

3 Simulación del filtrado de la línea eléctrica a 50Hz

Vamos a "ensuciar" la ECG original con un ruido aleatorio senoidal con una frecuencia de 50Hz,
con el fin de simular el ruido de la línea eléctrica sobre la captación de la señal cardíaca. Sin
embargo, esta vez vamos a usar un método distinto para el filtrado (fórmula de la imagen 7).
Según se indica en la práctica, lo mejor es usar una función de transferencia con un par de

Francisco Llave Iglesias Página 5


Figure 6: Detalle del filtfilt, filter y señal original.

Figure 7: Extracto de apuntes teóricos del profesor J.M. Gorriz, respecto a la implementación
del filtro notch.

Figure 8: Comparación del filtro ranura.

ceros conjugados cuyos polos se encuentren en la circunferencia unidad. Por otro lado, es
muy complicado diseñar un filtro LIT sin introducir oscilaciones indeseadas (efecto ringing), el
cual observaremos al aplicar el filtro ranura (notch) (ver en 8):
Este filtro corrige de forma muy precisa el error de ruido senoidal introducido, simulando el
de la red. Se puede ver al principio de cada secuencia el elemento "ringing" (ver detalle en 9),
debido a las oscilaciones por armónicos.

Francisco Llave Iglesias Página 6


Figure 9: Detalle del efecto ringing

El código usado en la implementación de la ranura sería:

Listing 6: Adición de ruido a la ECG original y posterior filtrado con resonador de polos.
1 ecg_sample = ecg(1:1500);
2 t_50 = (0:length(ecg_sample)-1)/Fs;
3 noise_50_inv = 0.1*sin(2*pi.*t_50.*Fc50);
4 noise_50 = noise_50_inv’;
5
6 ecg_add50 = ecg_sample + noise_50;
7
8 wo = 2*pi*Fc50/Fs;
9 b_50 = [1 -2*cos(wo) 1];
10 a_50 = [1 -2*0.97*cos(wo) 0.97^2];
11 y_50 =filter(b_50,a_50,ecg_add50);

4 CANCELACIÓN ADAPTATIVA DE RUIDO

A partir de la función "ecg.m" vamos a llevar a cabo el estudio mostrado en la imagen (10).

Nuestro objetivo es hallar la señal del feto sin la señal de la madre. Para ello realizaremos
una simulación que seguirá los siguientes pasos:

• 1. A través de un electrodo conectado en el pecho de la mujer, observamos el pulso


de la misma (véase 11). Con otros electrodos captamos el ruido circundante. Todo lo
anterior lo simularemos, creando a partir de la función "ecg" el pulso de la madre y tras

Francisco Llave Iglesias Página 7


Figure 10: Esquema de captación de señal en la madre embarazada y el feto.

ello, añadiéndole un ruido aproximado (véase 12).

Listing 7: Step de la ECG de la madre.


1 ECGm_fr = step(Om); step(Hts_m,ECGm_fr);

Listing 8: Step de la ECG de la madre con ruido.


1 Omn = dsp.SignalSource(0.02*randn(size(ECGm)),’←-
SamplesPerFrame’,100);
2 ...
3 ECGmn_fr = step(Om) + step(Omn); step(Hts_mn,ECGmn_fr);

• 2. Con otro electrodo situado en la parte abdominal de la madre, efectuaremos la "medi-


ción" del feto (véase 14), simulándolo también con la función, junto con su respectivo
ruido (véase 15).

Listing 9: Step de la ECG del feto con el ruido.


1 Of = dsp.SignalSource(ECGf,’SamplesPerFrame’,100,’←-
SignalEndAction’,’Cyclic repetition’);
2 ...
3 Ofn = dsp.SignalSource(0.05*randn(size(ECGf)),’←-
SamplesPerFrame’,100);
4 ...
5 ECGfn_fr = step(Of) + step(Ofn);

• 3. Siguiendo las pautas de los esquemas, aplicando el filtrado a la señal ruidosa de la


madre (véase 13) tendremos la señal a sumar con la del feto.

Francisco Llave Iglesias Página 8


Figure 11: Señal simulada del ECG materno.

Listing 10: Filtrado de la ECG de la madre.


1 Wopt = [0 1.0 -0.5 -0.8 1.0 -0.1 0.2 -0.3 0.6 0.1];
2 Hd = dsp.FIRFilter(’Numerator’,Wopt);
3 ...
4 ECGmn_fr = step(Om) + step(Omn);
5 %Suma de la ECG filtrada de la madre con la ruidosa del feto.
6 ECGntotal_fr = step(Hd,ECGmn_fr) + step(Of) + step(Ofn);

• 4. Una vez tengamos la señal de la madre filtrada con la ruidosa del feto, tendríamos la
señal simulada total correspondiente al conjunto de todas las señales captadas.

• 5. A esta señal se le aplicará el filtro adaptativo LMS. Este filtro realiza una comparación
entre las señales de entrada, sacando por el step la señal del feto ruidosa filtrada (véase
16), extirpando la señal materna con ruido.

Listing 11: Uso del filtro adaptativo de tipo LMS para determinar la señal del feto.
1 adap = dsp.LMSFilter(’Length’,15,’StepSize’,0.00007);
2 ...
3 ECGmn_fr = step(Om) + step(Omn);
4 ECGntotal_fr = step(Hd,ECGmn_fr) + step(Of) + step(Ofn);
5 ...
6 [~,ECGntotal_sinmadre] = step(adap,ECGmn_fr,ECGntotal_fr);

Francisco Llave Iglesias Página 9


Figure 12: Señal del ECG materno con ruido.

Figure 13: Señal ruidosa materna filtrada.

Francisco Llave Iglesias Página 10


Figure 14: Señal ECG del feto.

Figure 15: Señal ECG del feto con ruido.

Francisco Llave Iglesias Página 11


Figure 16: Señal del feto tras la aplicación del filtro adaptativo LMS.

Francisco Llave Iglesias Página 12

También podría gustarte