Está en la página 1de 22

Análisis de Señales Biológicas

Josué Alejandro Alemán Vilis

Proyecto 2

FILTRADO DE SEÑALES

________________________________________

1. Filtro de Promedio Sincronizado


Dada una señal ruidosa de ECG (archivo ecg_hfn.dat) con una tasa de muestreo de
1,000 Hz. Desarrolle un programa de MATLAB para realizar un promedio
sincronizado. Seleccione un complejo QRS de la señal para usar como modelo y
use un umbral adecuado en la funcion de cross-corelacion para la detección de
latidos. Grafica el complejo QRS promediado resultante. Asegúrese de que el
promedio resultante cubra un ciclo cardiaco completo. Grafica un ejemplo de un
ciclo de ECG de la señal ruidosa para su comparación. Selecciona el complejo QRS
de un latido diferente para usarlo como modelo y repite el experimento. Observa los
resultados cuando el umbral en la funcion cross-correlacion es bajo (ej. 0.4) o alto
(ej, 0.95) y comenta.

El Promedio Sincronizado.
Los filtros lineales fallan cuando los espectros de la señal y el ruido se sobreponen.
El promedio de señales sincronizadas puede separar una señal repetitiva del ruido
sin distorsionar la señal
El requisito más importante del Promediado Sincronizado, es precisamente la
sincronización. La realización de una señal que es producida por un promediado
debe de estar alineada de tal forma que la parte repetitiva de la señal aparezca
exactamente en el mismo instante de cada realización de la señal. Si esta condición
no se cumple, la forma de la onda del evento en la señal estará distorsionada a lo
largo del eje del tiempo.
Una ventaja importante de los Promedios Sincronizados es que no se realiza ningún
filtrado en el dominio de la frecuencia, es decir no se pierde contenido espectral de
la señal como es el caso de los filtros pasa bajas.
En la figura 1.1 se muestra la señal de electrocardiograma ruidosa, la cual se quiere
filtrar.

Fig. 1.1
Para proceder con el filtrado primero debe de prepararse un modelo, el cual servirá
para poder sincronizar las señales. Este modelo, se obtuvo del primer ciclo del ECG,
el cual se muestra en la Fig. 1.2.

Figura 1.2 Señal modelo


Con la señal modelo se procede a obtener la funcion de cross correlación, la cual
se muestra en la figura 1.3. En la misma imagen se observa la comparación con el
ECG, donde es posible observar que la correlación máxima corresponde al instante
de tiempo en el que la señal modelo se sobreponen completamente a un complejo
QRS.

Fig. 1.3 Señal modelo

Con los valores de la crosscorrelacion se hace una sincronización de las señales lo


que permitirá posteriormente obtener el promedio para filtrar la señal. El método que
se utilizó para sincronizar las señales se muestra en la Figura 1.4.
N instantes de tiempo Maximo valor de N instantes de tiempo
antes XCorrelacion después
Pico 1
Pico 2
Pico N
Promedio del valor de cada uno de los instantes de tiempo
Fig. 1.4 Esquema para obtener la sincronización y el promedio.

Con el tratamiento anterior de los datos, se obtiene una señal promedio, donde en
teoría se han separado los valores de las señales repetidas del ruido. Al graficar
este juego de datos, se obtienen la señal filtrada. En Fig 1.5 se muestra un complejo
de la señal del ECG filtrado.

Fig 1.5 Señal de ECG filtrada con Promedio Sincronizado


La efectividad del filtro depende mucho de una buena selección de una señal
modelo. Para el siguiente filtro se acorto la venta de datos de la señal modelo, paso
de template=length(80:800), a template=length(200:400). En la Fig 1.6 se muestran
ambas señales modelo y en la Figura 1.7 las comparativas de las señales filtradas.

Fig 1.6 Comparativa del templates

Fig 1.7 Comparativa de las señales filtradas, la azul corresponde a un a template=length(200:400)


y la naranja a un template=length(80:800).
Esta distorsión puede deberse a que las señales en el template con una ventana
más reducida se sincronizan mejor y hacen un mejor promedio.
2. Filtro Butterworth (pasa bajas)
Filtre la señal de ECG del archivo ecg_hfn.dat (Observe también el archivo
ecg_hfn.m; 𝑓 = 1000𝐻𝑧) usando cuatro diferentes filtros pasa bajas Butterworth
(individuales) hechos en MATLAB con las siguientes características:
a) Orden 2, frecuencia de corte de 10 Hz
b) Orden 8, frecuencia de corte de 20 Hz
c) Orden 8, frecuencia de corte de 40 Hz
d) Orden 8, frecuencia de corte de 70 Hz
Compara los resultados obtenidos en cada uno de los cuatro filtros (individuales)
con aquellos obtenidos por promediado sincronizado, y comenta sobre las mejoras
o distorsiones de los resultados.

Filtro Butterworth
El filtro de Butterworth es uno de los filtros electrónicos básicos, diseñado para
producir la respuesta más plana que sea posible hasta la frecuencia de corte. En
otras palabras, la salida se mantiene constante casi hasta la frecuencia de corte.

Diseño del filtro


Si llamamos H a la respuesta en frecuencia, se debe cumplir que las 2N-1 primeras
derivadas de |𝐻(𝜔)|2 sean cero para 𝜔 = 0 y 𝜔 = ∞. Únicamente posee polos y la
función de transferencia es:
1
|𝐻(𝜔)|2 =
1 + (𝜔⁄𝜔𝑐 )2𝑁
donde N es el orden del filtro, 𝜔𝑐 es la frecuencia de corte y es la frecuencia
analógica compleja (𝜔 = 𝑗𝜔).
Dado que las variables que se van a manipular en este filtro son la frecuencia de
corte y el orden del filtro es importante conocer la funcion de cada una de estas.
a frecuencia de corte es un límite en la respuesta frecuencial de un sistema en el
cual la energía que fluye a través de este se comienza a reducir en lugar de pasar
a través de él. Mientras que el orden del filtro el retraso máximo en las muestras,
utilizado en la creación de cada muestra de salida. En la Figura 2.1 se pueden
observar ordenes de un filtro Butterwoth pasa bajas.

Fig. 2.1
En la figura anterior se pueden observar las respuestas en frecuencia del filtro a
diferentes ordenes, con una frecuencia de corte normalizada de 0.5. A medida que
crece el orden, la eficacia del filtro aumenta, pues la proporción de señales por
encima de la frecuencia de corte que el filtro no puede rechazar son menores. El
aumentar el orden, también conlleva un gasto computacional mayor, y aumentar el
orden no siempre garantiza un mejor filtrado, como se verá en los siguientes
ejemplos.
A continuación (Fig. 2.2) se muestra un ECG, el cual contiene ruido el cual se quiere
eliminar, para lo cual se utilizaron 4 filtros Butterworth (Figs. 2.3, 2.4, 2.5, 2.6).

Fig 2.2 ECG ruidoso


Fig 2.3 Señal de ECG tratada con un filtro Butterworth de orden 2 y frecuencia de corte 10

Fig 2.4 Señal de ECG tratada con un filtro Butterworth de orden 8 y frecuencia de corte 20

Fig 2.5 Señal de ECG tratada con un filtro Butterworth de orden 8 y frecuencia de corte 40

Fig 2.6 Señal de ECG tratada con un filtro Butterworth de orden 8 y frecuencia de corte 70
Como se logra observar, existen diferencias en las señales de cada uno de los ECG.
Estas diferencias se deben, claramente, al uso de distintos ordenes y frecuencias
de corte, entonces ¿cuál de todos los filtros fue el mejor?
Tomando en cuenta que la frecuencia de un latido del corazon en condiciones
normales y de reposo es de aproximadamente 1.25Hz. Los filtros por encima de una
frecuencia de corte de 20, estarían dejando pasar ruido a la señal filtrada, por lo que
los filtros c) y d) no son buena opción en este caso. Bajo la primicia anterior se
podría decir que el filtro a), con una frecuencia de corte de 10 sería el indicado, pero
el orden de este filtro permite también que quede algo de ruido residual en la señal
filtrada, además de que las señales individuales no se parecen mucho a una señal
normal de ECG. Lo que nos deja con el filtro b), con este filtro se logra apreciar la
menos cantidad de ruido y se distinguen de mejor manera los picos de los complejos
del ECG.
Comparación de la efectividad del filtro: Butterworth vs Promedio Sincronizado

Si comparamos las dos imágenes anteriores, provenientes de métodos distintos de


filtrado, es posible observar que ambas conservan una morfología similar, acorde a
un ciclo típico de ECG, conservando todas las ondas típicas de la señal. A pesar de
lo anterior, es posible apreciar mejores resultados con el filtro de Promediado
Sincronizado, ya que se disminuye el ruido en mayor medida.
3. Derivative-Base Filter
Operadores Derivative-Based para remover artefactos de bajas frecuencias.
Los artefactos de baja frecuencia y líneas bases errantes pueden ser causadas en
mediciones de ECG de tórax al toser o al hacer movimientos grandes con el pecho,
o para el caso de las mediciones torax-extremidad al mover un brazo o pierna.
Un operador derivativo en el dominio del tiempo remueve parte de la señal que son
constantes (la salida es cero). Grandes cambios en la entrada llevan a grandes
cambios en la salida del operador derivativo.
En el procesamiento digital de señales, el operador derivativo básico esta dado por
el operador diferencial de primer orden:
1
𝑦(𝑛) = [𝑥(𝑛) − 𝑥(𝑛 − 1)]
𝑇
(Ec. 3.1)
El operador derivativo puede ser usado para suprimir componentes de bajas
frecuencias e incrementar los componentes de alta frecuencia, por lo que hay que
tener cuidado, pues cualquier ruido de alta frecuencia en la señal será amplificado,
y el resultado puede ser ruidos. El problema de la amplificación del ruido puede ser
resuelto tomando el promedio de los dos sucesivos valores de salida, de tal modo
que:
1
𝑦3 (𝑛) = [𝑥(𝑛) − 𝑥(𝑛 − 2)]
2𝑇
(Ec. 3.2)
Como queremos mantener una gananancia alta a bajas frecuencias, podemos
colocar un polo en el eje de las variables reales (frecuencia cero), y decir que
z=0.0995. La funcion de transferencia del filtro de diferencia de primer orden es
entonces:
1
𝑦(𝑛) = [𝑥(𝑛) − 𝑥(𝑛 − 1) + 0.995𝑦(𝑛 − 1)]
𝑇
(Ec. 3.3)
La señal de ECG de la Fig. 3.1 tiene una línea base errante (artefacto de baja
frecuencia). Filtre la señal con filtros derivative-based y estudie los resultados.
Estudie el efecto de las variaciones de la posición del polo en el filtro en la ecuacion
3.3 en la señal.
Fig. 3.1 Señal de ECG con una línea base errante

Primero se tratará a la señal con el filtro derivativo básico de la ecuacion 3.1, el


resultado del filtro se muestra en la Fig. 3.2. Posteriormente se hará el tratamiento
necesario para resolver el problema de la amplificación del ruido de alta frecuencia,
indicado en la ecuacion 3.2 (Fig 3.3). Para finalizar se colocará un polo tal cual se
indica en la ecuacion 3.3 (Fig 3.4) y se variará el valor de este para evaluar la
respuesta del filtro (Fig 3.5)
Fig. 3.2 ECG filtrado mediante el filtro Derivative-Based con un operador diferencial de primer
orden, a la derecha se muestra un acercamiento a un par de complejos QRS.
Fig. 3.3 ECG filtrado mediante el filtro Derivative-Based usado un operador diferencial de tres
puntos, a la derecha se muestra un acercamiento a un par de complejos QRS.

Fig 3.4 ECG filtrado mediante el filtro Derivative-Based con un polo de 0.995 a la derecha se
muestra un acercamiento a un par de complejos QRS

Fig 3.5 Filtrados Derivative-Based con variaciones del polo


Las figuras 3.2 y 3.4 muestran los resultados del filtrado con un operador diferencial
de primer orden y un operador diferencial de tres puntos, respectivamente. En
ambos casos los artefactos de baja frecuencia han sido removidos y la línea base
permanece en un nivel basal. Sin embargo, es notable que el dejar pasar las señales
de altas frecuencias ha afectado considerablemente a las bandas P y T, además de
alterar al complejo QRS del ECG. Por otro lado, cuando se introduce un polo, a la
funcion de transferencia, se elimina la base errante sin ninguna distorsión
significativa en las formas de las señales del ECG. Cuando se comparan las señales
filtradas con diferentes valores de polos, es posible observar que mientras mas
cercanos estén al valor de 1, los complejos se observan de mejor manera. A medida
que el valor del polo disminuye, la onda T tiende a desparecer y la señal R disminuye
en magnitud.
4. Filtro Butterworth (pasa altas)
Filtre la señal del archivo ecg_lfn.dat usando un filtro Buttherworth pasa altas con
ordenes 2-8 y cortes de frecuencia de 0.5-5 Hz. Estudia la eficacia de los filtros para
remover el artefacto de la línea base y el efecto en la forma de onda del ECG.
Determina la mejor. La señal del archivo antes mencionado se muestra en la
siguiente Figura.

Fig. 4.1 Señal de ECG Ruidosa con un artefacto de la línea base.

Se realizaron diversas combinaciones para poder así, determinar cual es el orden y


la frecuencia de corte que proporcionan un mejor filtrado. Entonces tenemos para
a) Orden 2 y Frecuencias de corte 0.5, 2.5 y 5.5; b) Orden 4 y Frecuencias de corte
0.5, 2.5 y 5.5; c) Orden 6 y Frecuencias de corte 0.5, 2.5 y 5.5, d) Orden 8, y
Frecuencias de corte 2.5 y 5.5. A continuación se muestran los resultados.
Fig. 4.2 Filtrados Butterworth pasa altas de orden 2 con diferentes Frecuencias de corte.

Fig. 4.3 Filtrados Butterworth pasa altas de orden 4 con diferentes Frecuencias de corte.
Fig. 4.4 Filtrados Butterworth pasa altas de orden 6 con diferentes Frecuencias de corte.

Fig. 4.5 Filtrados Butterworth pasa altas de orden 8 con diferentes Frecuencias de corte.
A simple vista es posible descartar varias combinaciones de ordenes y frecuencias
de corte. Por ejemplo, los filtros de orden 8 (Fig. 4.5) no guardan una similitud con
una señal de ECG normal, las ondas S y Q se observan muy acentuadas en las
frecuencias de corte 2.5 y 5, respectivamente. Por otro lado, en el filtrado de orden
6 (Fig. 4.4) se logra apreciar que el artefacto de la línea base original no se remueve
para el caso de la frecuencia de corte de 0.5 y para las frecuencias de corte 2.5 y 5
los complejos QRS no se parecen a un complejo típico de ECG. Si disminuimos el
orden dos magnitudes más, de 6 a 4 (Fig. 4.3), veremos que las señales van
acercándose un poco más a la morfología típica esperada, siendo la frecuencia de
corte de 0.5 la que más se parece, aun así, es posible observar formas atípicas en
las señales. Por último, cuando llegamos a un orden de 2 (Fig. 4.2) la similitud con
una señal normal de ECG se hace muy evidente, al menos para el caso de la
frecuencia de corte de 0.5, para las frecuencias de corte de 2.5 y 5 la señal se ve
mezclada con ruido y no es posible distinguirse correctamente.
Con lo anterior, se concluye que el filtro que funciona mejor es el de orden y
frecuencia de corte menores, 2 y 0.5, respectivamente. Esto se explica debido a que
el ruido de la señal original, el artefacto de la línea base, proviene de frecuencias
bajas, es por eso que se hace uso de un filtro pasa altas. Además, debido a que la
frecuencia de un latido en condiciones normales esta alrededor de 1.5 Hz, al usar
la frecuencia de corte de 5 se estara perdiendo información preciada de la señal, es
por eso que la frecuencia de corte ideal es de 0.5. Por último, la razón por la cual
los ordenes del filtro mayores a 2 no terminan de funcionar es debido a que la
pendiente de estos filtros es más pronunciada que la de orden 2, por lo que podían
estar dejando fuera información importante del latido.
ANEXO CODIGOS DE MATLAB PARA FILTROS
FILTRO PROMEDIO SINCRONIZADO
% Señal Ruidosa
clear all
close all
ecg=load('ecg_hfn.dat');
fm=1000;
t=[1:length(ecg)]/fm;
figure(1)
plot(t, ecg)
axis tight;
title('Señal de ECG Ruidosa');
xlabel('Tiempo(s)');
ylabel('ECG');

%Señal Modelo
template=ecg(80:800);
ttemp=[1:length(template)]/fm
sizetemp=length(template);
ecg_2=zeros(length(ecg)+(2*sizetemp)-2,1);
for i=1:length(ecg)
ecg_2(sizetemp+i)=ecg(i);
end
tecg_2=[1:length(ecg_2)]/fm
figure(2)
plot(ttemp,template)
title('Señal modelo')
xlabel('Tiempo (s)')
ylabel('Magnitud')
figure(3);
plot(tecg_2, ecg_2);
xlabel('Tiempo(s)')
ylabel('ECG2');

% Funcion de Cross Correlacion


meantemp=mean(template);
meanecg=mean(ecg);
sumtemp=[];
sumecg=zeros(length(ecg_2),1);
sumecg2=[];
for i=1:length(ecg)
sumecg(i+sizetemp,1)=ecg_2(i+sizetemp)-meanecg;
end
for i=1:sizetemp
sumtemp(i,1)=template(i)-meantemp;
end

sumtemp2=(sumtemp.^2);
tfp=0;
cross=zeros(length(ecg_2),1);
u=[];
crosj=[];
for i=1:length(ecg)
for j=i:i+length(template)-1
if j<sizetemp+1
tfp=sumtemp(j)*sumecg(j);
cross(i)=cross(i)+tfp;
sumecg2(j)=(sumecg(j))^2;
else
tfp=sumtemp(j-i+1)*sumecg(j);
cross(i)=cross(i)+tfp;
sumecg2(j-i+1)=(sumecg(j))^2;
end
end
crosj(i)=cross(i)/sqrt(sum(sumtemp2,1)*sum(sumecg2));
end

%subplot Xcorrelacion y Señal Ruidos


tcross=[1:length(crosj)]/fm;
figure(4);
subplot(2,1,1);
plot(tcross, crosj);
title('Cross Correlacion')
xlabel('Tiempo(s)')
ylabel('Magnitud')
subplot(2,1,2);
plot(t, ecg);
title('ECG')
xlabel('Tiempo(s)')
ylabel('Magnitud')

%Selección de los picos


range1=0.82;
mx=[];
ubi=mx;
count=1;
for j=1:length(crosj)-1
if (crosj(j)>range1) % tamaño minimo del pico (crosj(j)>0.82)
if (crosj(j+1)<crosj(j)) && crosj(j+2)<crosj(j) &&
crosj(j+3)<crosj(j) && crosj(j+4)<crosj(j) && crosj(j+5)<crosj(j) &&
crosj(j+10)<crosj(j) && crosj(j-10)<crosj(j) && crosj(j-5)<crosj(j) &&
crosj(j-4)<crosj(j) && crosj(j-3)<crosj(j) && crosj(j-1)<crosj(j) &&
(crosj(j-2)<crosj(j))
mx(count)=crosj(j);
ubi(count)=j;
count=count+1;
end
end
end

%determinar distancia atras y adelante y Sincronización de los datos


atras=round(ubi(1)*0.95);
adelante=650-atras;
preprom=zeros(adelante+atras+1,12);
for i=1:length(ubi)
count=0;
for j=1:atras+adelante+1
if (ubi(i)+500>8567)
break
else
if (j<=atras)
preprom(j,i)=ecg(ubi(i)-atras+count);
count=count+1;
elseif (j==atras+1)
preprom(j,i)=ecg(ubi(i));
else
preprom(j,i)=ecg(ubi(i)-atras+count);
count=count+1;
end
end
end
end

%Promedio de los datos sincronizados


figure(5);
prom=mean(preprom,2);
t1=[1:length(prom)]/fm
plot(t1, prom);
title('ECG Filtro SycAverage');
xlabel('Tiempo');
ylabel('Magnitud');
FILTRO BUTTERWORTH (pasabajas)
%Filtro Butterworth
%n=orden, Wn=frecuencia de corte normalizada, ftype=tipo de filtro
%[b,a] = butter(n,Wn,ftype)

ecg=load('ecg_hfn.dat');
plot(ecg)
fm=1000; % frecuencia de muestreo
fc=10; % frecuencia de corte
muestra=ecg(90:800);
Wn = fc/(fm/2);
[b,a] = butter(2,Wn,'low');
y=filter(b,a,muestra);
figure()
plot(y)
figure()
plot(muestra)

% Codigo para obtener la Respuesta en Frecuencia del Filtro a diferentes


ordenes
for i=[1,4,8,10]
Wn = 0.5;
[b,a] = butter(i,Wn,'low');
sys=tf(b,a,1)
[h,w]=freqz(b,a);
figure(1)
plot(w,abs(h)), title('Respuesta en Frecuencia del Filtro')
hold on
legend('Orden 1', 'Orden4','Orden 8', 'Orden10')
xlabel('Frecuencia de corte normalizada')
end
hold off

NOTA
Para el caso del filtro pasa altas, se escribe:

[b,a] = butter(2,Wn,'high');

El resto del codigo permanece de la misma manera.


FILTRO DERIVATIVE BASED
clear all
close all
signal=load('ecg_lfn.dat');
fm=1000
t=[1:length(signal)]/fm;
figure(1)
plot(t, signal)
axis tight;
xlabel('Tiempo');
ylabel('Magnitud');
len=length(signal)

%Fitro Ecuacion 3.1


signal_2=zeros(len,1);
value_x=0;
for i=1:len
signal_2(i)=signal(i)-value_x;
value_x=signal(i);
end
figure(2)
signal_x=signal_2/(length(signal_2)/1000)
plot(t,signal_x)
ylabel('Magnitud')
xlabel('Tiempo(s)')

%Filtro con three point central diference operator (Ecuacion 3.2)


signal_3=zeros(length(signal),1);
value_y=0;
for i=1:2:length(signal)
signal_3(i)=signal(i)-value_y;
value_y=signal(i);
end
signal_4=signal_3/(2*length(signal_3)/1000)
figure(4)
plot(t,signal_4)
ylabel('Magnitud')
xlabel('Tiempo(s)')

%Time domain input-output relationship (Ecuacion 3.3)


signal_5=zeros(length(signal),1);
value_z=0;
value_y=0;
polo=0.995
for i=1:length(signal)
signal_5(i)=signal(i)-value_y+polo*(value_z);
value_y=signal(i);
value_z=signal_5(i);
end
signal_6=signal_5/(length(signal_5)/1000)
figure(5)
plot(t, signal_6)
ylabel('Magnitud')
xlabel('Tiempo(s)')

También podría gustarte