Académique Documents
Professionnel Documents
Culture Documents
NDICE DE CONTENIDOS
1. INTRODUCCIN ................................................................................................................... 1
1.1
1.2
1.3
MOTIVACIN .................................................................................................................. 1
OBJETIVOS...................................................................................................................... 2
ESTRUCTURA DE LA MEMORIA ........................................................................................ 3
NDICE DE FIGURAS
NDICE DE TABLAS
1. INTRODUCCIN
1.1 Motivacin
Las arritmias cardacas suponen una grave amenaza para la salud de la persona que
las padece y la deteccin de ellas a tiempo puede contribuir a poner los medios necesarios
para la resolucin de un problema de salud que, si bien inicialmente puede no ser mortal, si
se puede derivar en disfunciones que provoquen paros cardacos.
El estudio de las seales electrocardiogrficas es un campo en continuo desarrollo
que forma parte de la integracin entre la rama de ciencias de la salud y la ingeniera que
es capaz de diagnosticar multitud de enfermedades cardacas mediante sus tcnicas de
deteccin y clasificacin.
Para su estudio se requieren electrocardiogramas, que son medidas indirectas de la
actividad elctrica del corazn. Esta actividad se puede medir mediante la colocacin de
electrodos en la superficie de la piel y es muy til para los cardilogos, ya que pueden
obtener informacin muy importante acerca de la condicin clnica de sus pacientes. Entre
los criterios clnicos ms importantes se encuentra la deteccin y clasificacin de los
complejos QRS, ya que aportan informacin cardiaca muy importante.
Al igual que con el resto de seales, el anlisis depende mucho de la calidad de la
informacin. Por esta razn y previo a su tratamiento es necesario conseguir la calidad
adecuada con tcnicas de filtrado de seal y consiguiendo una buena SNR.
Producir un algoritmo para la deteccin de formas de onda de un ECG no es una
tarea fcil debido a la morfologa variable en el tiempo de la seal sujeta a condiciones
fisiolgicas y con presencia de ruido. La transformada wavelet es una herramienta til en
mltiples aplicaciones de procesado de seales, entre las que se encuentra la reduccin del
ruido.
Entre tanto, crear un algoritmo para la deteccin de arritmias mediante anlisis de
caractersticas puede ayudar a realizar un mejor informe clnico de los pacientes. En las
1
ltimas dcadas se han realizado muchos estudios para este fin. Senhadhi et al. [1]
compararon la capacidad de tres wavelets (Daubechies, Spline y Morlet) para reconocer y
localizar ritmos cardacos aislados. Sahambi et al. [2] utilizaron la funcin de Gauss para
caracterizar la forma de onda y el anlisis wavelet para medir las diferentes ondas que
forman los ECGs. Con el tiempo surgieron ms algoritmos, algunos basados en el espectro
[3, 4] y otros en las caractersticas de las wavelets [5, 6]. Incluso el algoritmo tradicional
de Pan Tompkins computacionalmente es muy eficaz [7]. Tambin se desarrollaron
algoritmos basados en redes neuronales backpropagation [8] y redes neuronales
probabilsticas [9].
1.2 Objetivos
2. MARCO TERICO
2.1 Electrocardiograma (ECG)
Descripcin
Defectos congnitos
Arritmias
Etc
La frecuencia cardaca normal de un adulto es de entre 50 y 90 pulsaciones por
Onda P
Es la seal elctrica que corresponde a la despolarizacin auricular. Resulta de la
superposicin de la despolarizacin de la aurcula derecha (parte inicial de la onda P) y de
la izquierda (final de la onda P). Para que la onda P sea sinusoidal debe tener estas
caractersticas:
1
Complejo QRS
Es la representacin grfica de la despolarizacin de los ventrculos del corazn
formando una estructura picuda en el electrocardiograma, como se puede apreciar en la
Figura 2. Suelen tener una duracin de entre 0.06 y 0.10 segundos y un voltaje no mayor
de 3.5 mV. Consta de tres ondas:
Onda T
Esta onda representa la repolarizacin de los ventrculos. Durante la formacin del
complejo QRS, generalmente tambin ocurre la repolarizacin auricular que no se registra
en el ECG normal, ya que es tapado por el complejo QRS. Elctricamente, las clulas del
msculo cardaco son como muelles cargados; un pequeo impulso las dispara,
despolarizan y se contraen. La recarga del muelle es la repolarizacin (tambin llamada
potencial de accin).
6
Onda U
Corresponde a la despolarizacin de las fibras de Purkinje. Es positiva, su amplitud
es relativamente baja y suele pasar desapercibida en la mayora de los casos.
Intervalo PR
Es el tiempo desde que se acaba la onda P hasta que se origina
Corresponde a un periodo de inactividad elctrica como
la onda R.
fisiolgico que sufre el estmulo elctrico. Su duracin suele estar entre 120ms y 220ms.
Intervalo QT
Es el tiempo desde el inicio de la onda Q hasta el final de la onda T, y representa la
activacin y recuperacin ventricular. Su duracin vara en
funcin de la frecuencia
Segmento PR
Lnea que une el final de la Onda P con el inicio del complejo QRS.
Segmento ST
El segmento ST indica la cantidad de tiempo que transcurre desde el final de una
contraccin de los ventrculos hasta el comienzo del perodo de reposo (repolarizacin).
Caracterstica
Valor normal
Margen
Ancho onda P
110 ms
20 ms
Intervalo PQ/PR
160 ms
40 ms
100 ms
20 ms
Intervalo QTc
400 ms
40 ms
Amplitud onda P
0,15 mV
0,05 mV
1,15 mV
0,5 mV
Nivel intervalo ST
0 mV
0,1 mV
Amplitud onda T
0,3 mV
0,2 mV
Derivaciones
Fig 3: Posiciones de las derivaciones MLI, MLII, MLIII, AVR, AVF y AVL4
Cada derivacin tiene una forma de onda diferente como se puede apreciar en la
Figura 5:
10
Identificar ondas P:
o Existe relacin entre las ondas P y los complejos QRS?
o Tiene una duracin normal el intervalo PR?
o Cul es la frecuencia auricular?
o Existe una similitud de forma entre las ondas P para una misma
derivacin?
Examinar la onda T:
o Tiene una forma normal?
o En cada derivacin Estn orientados en la misma direccin los complejos
QRS?
11
Arritmias
Las arritmias son problemas de la frecuencia cardaca o del ritmo de los latidos del
corazn. Durante una arritmia el corazn puede latir demasiado rpido, demasiado
despacio o de manera irregular.
La mayora de las arritmias son inofensivas, pero algunas pueden ser graves e
incluso poner en peligro la vida del paciente. Durante una arritmia es posible que el
corazn no pueda bombear suficiente sangre al resto del cuerpo y esta falta de circulacin
sangunea puede causar daos en el cerebro, el corazn y otros rganos importantes.
Las arritmias se pueden agrupar en arritmias ventriculares y arritmias auriculares.
Las arritmias ventriculares se manifiestan como grandes distorsiones en la morfologa de la
onda ya que la despolarizacin comienza ms en los ventrculos que en la aurcula. El
complejo QRS se hace ms grande, enmascarando as la onda P.
Aunque la ampliacin del complejo QRS causa un desplazamiento de sus
componentes en el dominio de la frecuencia hacia frecuencias ligeramente ms bajas, el
espectro es bastante parecido al de un latido normal, con lo que llevar a cabo una
clasificacin espectral de estas arritmias se torna complicado.
Sin embargo, las arritmias auriculares presentan pequeas variaciones temporales y
de posicin de la relativamente pequea onda P. Por consiguiente son de difcil deteccin
mediante mtodos espectrales. A pesar de ello presentan notables variaciones en los
tiempos entre latidos, por lo que una forma de detectarlas es realizando anlisis estadsticos
de intervalos de seal ECG.
Tambin existen los latidos ectpicos que son cambios pequeos en un latido
normal del corazn que conducen a latidos cardiacos extras o que se saltan. Las
contracciones ventriculares prematuras y las contracciones auriculares prematuras forman
parte de estos tipos de latidos.
12
Tambin conocida como extrasstole ventricular, es uno de los trastornos del ritmo
cardaco y consiste en un latido adelantado respecto a la frecuencia cardaca normal del
individuo. En el paciente se percibe como un salto en los latidos o palpitaciones. En estos
casos, la despolarizacin del msculo cardaco comienza en el ventrculo en vez de su
lugar usual, el nodo sinusoidal.
Son uno de los trastornos del ritmo ms comunes, ya sea en individuos sanos o en
pacientes con cardiopata. Normalmente son ms frecuentes con la edad y no son
necesariamente peligrosos.
Fuente: http://conemaugh.kramesonline.com/spanish/HealthSheets/3,S,40423?PrinterFriendly=true
(ltimo acceso: 15/08/2014)
13
Fig 7: Bigeminismo
Fig 8: Trigeminismo9
14
Frecuencia
o Poco frecuentes Menos de 30/hora.
o Frecuentes Entre 30 a 60/hora.
o Muy frecuentes Ms de 60/hora.
Morfologa
o Monomorfas Solo existe una nica morfologa de CVP en todo el
electrocardiograma.
o Bimorfas Existen dos morfologas de CVPs diferentes en todo el
electrocardiograma.
o Polimorfas Existen ms de dos morfologas de CVPs diferentes en todo
el electrocardiograma.
Complejidad
o
Simple
Compleja
10
10
15
Tambin conocida como extrasstole auricular. Es uno de los trastornos del ritmo
cardaco, benigno, caracterizado por un latido prematuro en la aurcula, una de las cmaras
del corazn. Estas se diferencian de las contracciones ventriculares prematuras (CVP) en
que no suelen requerir tratamiento mdico. Quienes han experimentado una extrasstole
auricular dicen sentir que su corazn se detiene o que se salta un latido.
Uno de los motivos que pueden provocar una APC son las extrasstoles supra
ventriculares prematuras (SVTA), que son un tipo de impulso elctrico prematuro en el
corazn, generado en un nivel superior al de los ventrculos cardacos. Tanto las APCs
como las SVTAs son opuestas a las CVPs, cuyo origen es ventricular como se ha explicado
en el apartado anterior.
Una contraccin auricular prematura por lo general aparece en el ECG y se
caracteriza por:
11
16
Taquicardias
Estrs
Fiebre
Ansiedad
Etc.
12
12
17
13
13
14
EDAD
MUJERES
HOMBRES
20-29 aos
96 ppm
86 ppm
30-39 aos
98 ppm
86 ppm
40-49 aos
100 ppm
90 ppm
50-59 aos
104 ppm
90 ppm
60 aos o ms
108 ppm
94 ppm
18
Bradicardia
Hipotermia.
Hipotiroidismo.
15
15
19
Problemas de Procesado
Existen algunos problemas a la hora de procesar las seales. Esto se debe a que las
seales llegan contaminadas con algn tipo de ruido. Ya sea este ruido biolgico (por
ejemplo la actividad elctrica producida por los msculos esquelticos) o artificial (las
interferencias causadas por la alimentacin 50/60 Hz). Las seales indeseadas que pueden
alterar nuestras medidas son las siguientes:
Interferencias causadas por la alimentacin (50/60 Hz): Suele ser del orden de los
50/60 Hz con un margen de 0,2 Hz.
20
16
21
22
17
Traslacin
Escala
17
23
Transformada wavelet
Donde
()
()
ECUACIN (2)
la parte imaginaria.
y la traslacin de la wavelet madre
18
24
ECUACIN (3)
Factor de escala.
Factor de traslacin.
Las wavelets s, (t), generadas de la misma funcin wavelet madre ( ) tienen
parmetro se corresponden con frecuencias de menor valor, o escalas grandes. Los valores
pequeos corresponden a frecuencias de mayor valor o escalas muy pequeas [11].
Para manejar el mtodo con un ordenador, es necesaria una versin discreta con
menor coste computacional. Un escalado didico de las bases con =2 y una traslacin
=2 conduce a funciones bases del tipo:
( )
ECUACIN (4)
19
( )}
()
25
ECUACIN (5)
20
26
Por desgracia, si en realidad esta operacin se realiza con una seal digital real, se
obtendran el doble de datos. Si la seal S consta de 1000 muestras, la aproximacin y el
detalle tendrn cada uno 1000 muestras, lo que hace un total de 2000. Para corregir este
problema, se introduce el concepto de disminucin de resolucin. Esto significa eliminar
cada segundo punto de datos (reduccin de muestreo), pero tiene un problema y es que
introduce aliasing en los componentes de la seal.
Descomposicin mltiple
21
22
27
Dado que el proceso de anlisis es iterativo, en teora, los niveles en los que puede
descomponerse la seal son indefinidos. En la prctica, la descomposicin puede realizarse
nicamente hasta que los detalles individuales consisten en una sola muestra o pxel, pero
debe elegirse un nmero adecuado de niveles basados en la naturaleza de la seal, o en un
criterio adecuado, tal como la frecuencia de muestreo.
Familias wavelets
Haar
Cualquier discusin sobre wavelets debe empezar con la wavelet Haar, por ser la
ms simple y sencilla. Esta wavelet es discontinua y se parece a una funcin escaln. Es
equivalente a la wavelet Daubechies db1.
23
Es muy eficaz en la parte plana de la seal (si tiene cambios abruptos muy
notables).
23
28
Daubechies
24
29
Biortogonales
Esta familia tiene la propiedad de poseer fase lineal, que es necesaria para la
reconstruccin de seales e imgenes. Utilizan dos wavelets diferentes, una para
descomposicin y otra para reconstruccin, en lugar de usar solo una para los dos procesos
como las otras familias.
25
25
30
Symlets
Son casi simtricas, propuestas por Daubechies como modificacin a la familia db.
Las propiedades de ambas familias son muy similares.
26
31
3. METODOLOGA
Este proyecto ha sido realizado para alcanzar los objetivos establecidos, detectar
arritmias automticamente en seales electrocardiogrficas. Su funcionamiento se
explicar a continuacin as como los motivos por los cuales se han tomado diversas
decisiones.
El sistema lo forman tres procesos principales, como se puede apreciar en el
siguiente diagrama de bloques:
3.1 Preprocesado
32
33
( )
()
ECUACIN (6)
()
ECUACIN (7)
34
Cada wavelet elegida tiene una funcin de escalado diferente, as como unos
coeficientes que las hacen especiales y tiles para su fin. A continuacin se describen
mediante imgenes cada una de las cinco wavelets elegidas.
35
db4
27
36
db5
28
28
37
sym4
29
29
38
bior 1.3
30
30
39
bior 6.8
31
31
40
Para eliminar o reducir este tipo de ruido que hace que la seal no tenga un trazo
limpio, se ha utilizado un software desarrollado previamente por Galiana-Merino et al. [14]
en el campo de la sismologa, llamado Denoise.
Se trata de un programa que mediante la transformada wavelet y un fragmento de
ruido de la seal contaminada puede eliminar o en su defecto reducir este ruido de alta
frecuencia.
La wavelet utilizada es db12. A continuacin se presenta la Figura 34 con su
funcin de escalado y sus coeficientes:
32
41
42
Uno de los objetivos principales para poder obtener buenos resultados en este
proyecto era detectar los complejos QRS, ya que a la hora de detectar arritmias son el
factor ms importante a tener en cuenta. Se necesita saber el periodo entre ellos para poder
detectar anomalas y estudiar las seales en profundidad.
Como se ha explicado en el apartado MARCO TERICO, el complejo QRS est
formado por tres ondas, la Onda Q, la Onda R y la Onda S, de ah su nombre.
33
De las doce derivaciones que existen para medir una seal electrocardiogrfica, la
ms utilizada para detectar anomalas es MLII por su gran amplitud de la onda R y su
similitud al complejo QRS como tal. Adems casi todas las seales ECG de los pacientes
disponen de esta medida, por ello se ha credo necesario basar el algoritmo de este
proyecto en este tipo de derivaciones y no ampliarlo para el resto. Esta decisin no incurre
en una menor efectividad del programa, por lo tanto a partir de este momento todos los
algoritmos realizados sern para la derivacin MLII.
33
Fuente:http://people.ece.cornell.edu/land/courses/ece5030/FinalProjects/s2013/csl84_sjh234/csl84_sjh2
34/ECG.html (ltimo acceso: 12/08/2014)
43
Para conseguir este propsito, este bloque del sistema ha sido dividido a su vez en
tres bloques que se explicarn a continuacin:
Deteccin Onda R
Para realizar este proceso se han realizado mltiples pruebas programando diversos
algoritmos. El algoritmo definitivo se explica a continuacin:
Uno de los objetivos principales en este bloque era determinar el punto mximo de
cada onda R. Para localizarlos primero se dividi la seal en valores positivos y negativos.
En este bloque solo interesan los valores positivos, por lo que se pasaba de tener una seal
de valores negativos y positivos a una seal con valores mayores o igual a 0.
Con la seal obtenida y solo cogiendo los valores de amplitud mayor que 0, se
realiz la media (MediaR) y la desviacin estndar (DesviacinR). Este proceso se realiz
de esta forma ya que se buscaba obtener la media y desviacin estndar de estos valores y
no modificar ese valor con amplitudes igual a 0.
Era necesario crear un umbral a partir del cual los valores se pudieran considerar
como Onda R. Se conoce que la onda R tiene mayor amplitud que el resto de ondas, pero
en algunas seales ECG, sobretodo de pacientes que llevan marcapasos, la onda T puede
alcanzar incluso la amplitud de algunas Ondas R. Es importante tambin tener en cuenta
que no todas las Ondas R tienen la misma amplitud, y no tiene por qu estar ligado con
ninguna anomala.
Estudiar este caso en particular fue una labor importante, ya que la eleccin del
umbral es determinante a la hora de detectar las ondas R y poda ser muy restrictivo para
44
45
46
47
Una vez se han detectado las ondas R y las ondas negativas (Q y S), se suman estas
dos seales y el resultado se filtra para eliminar ruido que pueda interferir en la seal. Es
decir, en ocasiones el algoritmo no solo detecta las ondas Q y S, sino que detecta ruido que
tiene la seal.
Por ello se realiza un filtrado que trata de determinar que despus de una onda
negativa, siempre ir un onda positiva y as sucesivamente. Esto eliminar muchas ondas Q
o S, dependiendo de la forma de onda, pero tambin eliminar ruido que no interesa. Este
algoritmo no ser til para todas las detecciones pero si para algunas de ellas.
En la Figura 40 se puede apreciar el resultado:
48
Taquicardias
Bradicardias
49
Al analizar las seales que contenan este tipo de anomalas, se observaron ciertas
caractersticas en las formas de onda de la seal que algunas de ellas tenan en comn. A
continuacin se exponen todas y cada una de ellas:
Existe una onda negativa (puede ser la onda Q o la onda S) que tiene una
amplitud ms negativa de lo normal y destaca del resto.
Una vez analizadas se probaron diversos mtodos de deteccin, pero no todas las
seales tienen las mismas formas de onda y no todos los mtodos eran vlidos y daban
50
resultados ptimos. A continuacin se explica el mtodo utilizado para detectar este tipo
de arritmias.
Deteccin
51
El utilizar este mtodo es porque de entre todos los puestos en prctica es el que
mejores resultados ha conseguido pero tiene un problema y es que siempre detectar como
mnimo un CVP, ya que como se ha explicado toma como 100% el mnimo de la seal.
A esta condicin de compromiso se lleg conscientemente, ya que es mejor detectar
anomalas de ms que de menos. Este programa ser utilizado por un mdico el cual una
vez detectadas estas anomalas tendr que corroborar que estas de verdad existen. Las CVP
no son necesariamente peligrosas y no es tan importante el nmero de veces exacto que
52
ocurren sino ms bien su presencia, por lo tanto pueden tener un margen de error, lo cual
no cambiara nada en el diagnstico del paciente.
Al analizar las seales que contenan este tipo de anomalas, se observaron ciertas
caractersticas en las formas de onda de la seal que algunas de ellas tenan en comn. A
continuacin se exponen todas y cada una de ellas:
Una vez analizadas se probaron diversos mtodos de deteccin, pero no todas las
seales tienen las mismas formas de onda y no todos los mtodos eran vlidos y daban
53
resultados ptimos. A continuacin se explica el mtodo utilizado para detectar este tipo
de arritmia.
Deteccin
Para realizar este proceso, se detectan las ondas Q, las ondas R y los complejos
QRS con los mtodos explicados anteriormente. Despus de esta operacin, se dispone de
una seal con valores negativos y positivos centrados en los complejos QRS (Ondas R y
Ondas Q o S).
La parte de la seal que realmente interesa para detectar APC es la parte positiva
(Ondas R) ya que es donde se pueden encontrar con ms facilidad este tipo de anomalas.
Mientras que para detectar las CVP la variable importante es la amplitud de la
seal, para detectar las APC es el tiempo entre pulsos (periodo). Por lo tanto es necesario
eliminar la parte negativa de la seal QRS, obteniendo as un vector de ceros con
nicamente valores en las ondas R.
Es en este punto del algoritmo donde se debe cambiar de amplitud a distancia de
tiempo entre pulsos. Esto se realiza creando un vector con las diferencias de tiempo
(periodos) entre las ondas R, es decir, al realizar este proceso se obtendr un vector con
diferencias de tiempo entre pulsos (difR).
54
Este valor fue decidido despus de realizar una serie de pruebas. Se buscaba un
valor que comprobara la seal en ambas direcciones pero que no interfiriera con otro
complejo QRS, y este nmero de muestras es el adecuado que corresponde al siguiente
periodo en segundos:
(
( )
)
56
Por este motivo es importante localizar las ondas Q o S para esta deteccin, porque
aunque a priori parece que no es necesario, en la etapa final del algoritmo se necesitan esos
valores.
El algoritmo en general consigue los resultados esperados, e igual que ocurre con
las CVP no es tan importante el hecho del nmero de APC sino ms bien el que aparezcan.
Es una arritmia benigna que puede ser difcil de detectar en un primer momento pero que
mediante esta serie de tcnicas pueden detectarse sin ningn problema.
Deteccin de Taquicardia
Al analizar las seales que contenan este tipo de anomalas, se observaron ciertas
caractersticas en las formas de onda de la seal que algunas de ellas tenan en comn. A
continuacin se exponen todas y cada una de ellas:
57
Una vez analizadas se probaron diversos mtodos de deteccin, pero no todas las
seales tienen las mismas formas de onda y no todos los mtodos eran vlidos y daban
resultados ptimos. A continuacin se explica el mtodo utilizado para detectar este tipo
de arritmia.
Deteccin
Para realizar este proceso, se detectan las ondas Q, las ondas R y los complejos
QRS con los mtodos explicados anteriormente. Despus de este proceso, se dispone de
una seal con valores negativos y positivos centrados en los complejos QRS (Ondas R y
Ondas Q o S).
La parte de la seal que realmente interesa para detectar taquicardias es la parte
positiva (Ondas R).
Como en el caso de las APC, la variable importante es el tiempo entre pulsos
(periodo). Por lo tanto es necesario eliminar la parte negativa de la seal QRS, obteniendo
as un vector de ceros con nicamente valores en las ondas R.
Es en este momento donde se debe cambiar de amplitud a distancia de tiempo entre
pulsos. Esto se realiza de la misma forma que en las APC, creando un vector con las
diferencias entre las ondas R (periodos), es decir, al realizar este proceso se obtendr un
vector con diferencias de tiempo entre pulsos (difR).
Despus de este proceso se necesita un umbral a partir del cual el programa pueda
determinar que cualquier diferencia entre pulso menor de ese umbral puede ser una posible
taquicardia.
58
Este umbral viene determinado por la edad y el sexo del paciente y est basado en
la Tabla 2, situada en el apartado MARCO TERICO Electrocardiograma (ECG)
Arritmias Taquicardias.
La Tabla 2 proporciona las pulsaciones por minuto (ppm) a partir de las cuales se
puede deducir que el paciente padece un intervalo de taquicardias.
Una vez se tiene ese valor (pulsaciones), es necesario pasarlo a muestras para ver a
partir de que intervalo puede ser o no considerado taquicardia.
()
( )
59
taquicardias especficas como pueden ser las taquicardias SV que tienen una frecuencia
cardiaca mayor de lo normal.
Deteccin de Bradicardias
Al analizar las seales que contenan este tipo de anomalas, se observaron ciertas
caractersticas en las formas de onda de la seal que algunas de ellas tenan en comn. A
continuacin se exponen todas y cada una de ellas:
Una vez analizadas se probaron diversos mtodos de deteccin, pero no todas las
seales tienen las mismas formas de onda y no todos los mtodos eran vlidos y daban
60
resultados ptimos. A continuacin se explica el mtodo utilizado para detectar este tipo
de arritmia.
Deteccin
Para realizar este proceso, se detectan las ondas Q, las ondas R y los complejos
QRS con los mtodos explicados anteriormente. Despus de este proceso, se dispone de
una seal con valores negativos y positivos centrados en los complejos QRS (Ondas R y
Ondas Q o S).
La parte de la seal que realmente interesa para detectar bradicardias es la parte
positiva (Ondas R) ya que es donde se pueden encontrar este tipo de anomalas.
Como en el caso de las taquicardias y las APC, la variable importante es el tiempo
entre pulsos (periodo). Por lo tanto es necesario eliminar la parte negativa de la seal QRS,
obteniendo as un vector de ceros con nicamente valores en las ondas R.
Es en este momento donde se debe cambiar de amplitud a distancia de tiempo entre
pulsos. Esto se realiza creando un vector con las diferencias entre las ondas R, es decir, al
realizar este proceso se obtendr un vector con diferencias de tiempo entre pulsos (difR).
Despus de este proceso se necesita un umbral a partir del cual el programa pueda
determinar que cualquier diferencia entre pulso mayor de ese umbral puede ser una posible
bradicardia.
Ese umbral es 50 ppm que se pasa a muestras de la misma forma que con el mtodo
de deteccin de taquicardias.
El algoritmo comprueba si las diferencias entre pulsos son mayores que ese umbral
y si adems los siguientes pulsos son mayores tambin. Si esto ocurre, el programa detecta
la anomala y marca esa posicin como posible bradicardia.
Despus de realizar este proceso se comprob que los resultados no eran
convenientes y el problema era que algunas CVP cumplen esas mismas caractersticas, por
61
lo que el programa las detectaba como bradicardias, lo que se hizo fue comprobar que en
esas anomalas no ocurriera un CVP. El mtodo fue crear una ventana centrada en la
posible bradicardia al igual que para detectar APC y taquicardias, con el mismo mtodo y
los mismos valores (Fig 46).
Por este motivo es importante localizar las ondas Q o S para esta deteccin, porque
aunque a priori parece que no es necesario, en la etapa final del algoritmo se necesitan esos
valores.
El algoritmo automtico en general consigue los resultados esperados y es muy
eficiente.
62
4. RESULTADOS
4.1 Interfaz grfica del programa
63
En las grabaciones 102 y 104 no fue posible utilizar derivacin MLII porque
los pacientes llevaban vendajes en esa zona y se utilizaron derivacin
precordial V5 en la seal superior, por ello estas dos seales no son aptas
para la deteccin de arritmias en este programa.
64
Para que el programa funcione la seal.mat tiene que tener una serie de
caractersticas:
Una matriz con las dos seales (primera derivacin y segunda derivacin)
de tamao [longitud de la seal, 2] y de nombre M.
Derivacin
MLII
V1
V2
V4
V5
Nmero Asignado
1
2
3
4
5
4.3 Pruebas
65
Fig 49: a)Seal Original b) preprocesado con db4 c) con db5 d) con sym4 e) con bior 1.3 f) con bior 6.8
66
Casos vlidos
Fig 51: Deteccin QRS; seal 101.mat; preprocesado con db5 y 'Denoise'
67
Fig 52: Deteccin QRS; seal 114.mat; preprocesado con db5 y 'Denoise'
Casos fallidos
Existen seales electrocardiogrficas en las cuales las ondas T tienen una amplitud
muy alta, que incluso puede llegar a superar algunas ondas R. Estos casos se suelen dar
cuando el paciente tiene incorporado un marcapasos que amplifica su seal del corazn. En
la Figura 53 se puede mostrar este suceso, que por supuesto no es bueno para el correcto
funcionamiento del algoritmo. En el apartado de METODOLOGA se explic este caso
aislado y se lleg a la condicin de compromiso necesaria para que el algoritmo fuera
automtico a pesar de este tipo de errores.
68
Fig 53: Deteccin QRS fallida; seal 107.mat; preprocesado con db4 y 'Denoise'
Resultados
69
De las seales vlidas para este algoritmo (36 de 48 seales) se han detectado un
96.89%34 de los complejos QRS. Se pueden observar con ms detalle estos resultados en el
ANEXO A: Tablas Tabla 3.
Casos vlidos
34
Estos resultados pueden variar, ya que para realizar este proceso es necesario utilizar la funcin Denoise,
la cual, necesita un intervalo de ruido escogido por el usuario. Si este proceso no se realiza correctamente,
los resultados pueden no ser tan favorables.
70
Fig 54: Deteccin CVP; seal 100.mat; preprocesado con db4 y 'Denoise'; umbral al 50%
71
Fig 55: Deteccin CVP; seal 124.mat; a) Seal completa con umbral 50%; b) Intervalo con umbral 50%; c) Seal
completa con umbral 1%; d) Intervalo con umbral 1%
72
Fig 56: Deteccin CVP; seal 210.mat; a) Seal completa con umbral 50%; b) Intervalo con umbral 50%; c) Seal
completa con umbral 10%; d) Intervalo con umbral 10%
Tambin hay seales en las cuales el algoritmo detecta ms PCVs de los que segn
la base de datos existen. Despus de estudiar la forma de onda de estas anomalas se
pueden interpretar como CVPs, por lo que en este proyecto se denominan posibles CVPs y
no se contabilizan como errores, en el siguiente ejemplo se puede apreciar este hecho.
Segn la base de datos, esta paciente (seal 111.mat) de 47 aos, presenta 1 CVP en
los 30 minutos aproximados de seal. El algoritmo con un umbral del 50% detecta 3, es
decir, un 300% del total (Figura 57), ya que estos pueden ser interpretados como tal.
73
Fig 57: Deteccin posibles CVPs; seal 211.mat; preprocesado con bior 1.3 y 'Denoise'
Casos fallidos
74
Fig 58: Deteccin CVP fallida; seal 103.mat; preprocesado con sym4 y 'Denoise'
Tambin se debe tener en cuenta que estos resultados son con el programa
automatizado (umbral al 50%) si el umbral se ajusta al 100% nicamente marcar como
CVP el mnimo de la seal.
Resultados
35
Estos resultados pueden variar, ya que para realizar este proceso es necesario utilizar la funcin Denoise,
la cual, necesita un intervalo de ruido escogido por el usuario. Si este proceso no se realiza correctamente,
los resultados pueden no ser tan favorables.
75
Casos vlidos
Fig 59: Deteccin APCs; seal 100.mat; preprocesado con db4 y Denoise.
76
Fig 60: Deteccin APCs; seal 119.mat; preprocesado con db5 y Denoise.
Al igual que con los CVPs, tambin hay seales en las cuales el algoritmo detecta
ms APCs de los que segn la base de datos existen. Despus de estudiar la forma de onda
de estas anomalas y los periodos de tiempo entre complejos QRS se pueden interpretar
como APCs, por lo que en este proyecto se denominan posibles APCs y no se contabilizan
como errores.
Este hecho es a causa de que estas anomalas son difciles de detectar a simple
vista. Quizs algunas de ellas son muy evidentes porque tienen el complejo QRS muy
adelantado y una pausa compensatoria larga a simple vista, pero algunas otras no. Este
programa tiene una gran eficacia y dado que es automtico y procesa las seales de forma
minuciosa puede determinar cundo un periodo es menor o mayor de la media.
El siguiente ejemplo, segn la base de datos es una paciente (seal 115.mat) de 39
aos, en principio no presenta APCs en los 30 minutos aproximados de seal. Sin
embargo, este algoritmo detecta 8 (Figura 61), ya que estos pueden ser interpretados como
tal.
77
Fig 61: Deteccin APCs; seal 115.mat; preprocesado con sym4 y Denoise
Casos fallidos
Hay casos en los que los complejos QRS en un mismo electrocardiograma son de
amplitud muy cambiantes. Esto puede entorpecer el funcionamiento del algoritmo sobre
todo en el proceso de detectar complejos QRS, lo cual influye en la deteccin de APCs.
La siguiente seal pertenece a una paciente de 87 aos. Segn la base de datos
padece 15 APCs a lo largo de la seal de aproximadamente 30 minutos. El algoritmo no
detecta ninguno de ellos por el motivo explicado.
En la Figura 62 se puede apreciar como en los cuadrados de color verde existen
zonas de muy baja amplitud con respecto al resto. El programa en ocasiones no lo
interpreta como complejos QRS y entonces esto afecta al proceso de la deteccin de APCs.
78
Fig 62: Deteccin de APC fallida; seal 108.mat; preprocesado con db5 y 'Denoise'
siguiente
ejemplo
est
contaminado
con
este
suceso.
La
seal
Fig 63: Deteccin de APC fallida; seal 113.mat; preprocesado con db4 y 'Denoise'
Como se puede apreciar en la Figura 63, el programa detecta como ondas R las
ondas T y al compararlas con las ondas R anteriores interpreta que existe un periodo muy
corto y despus uno muy largo, caracterstica principal de este tipo de anomalas.
Resultados
80
De las seales vlidas para este algoritmo (33 de 48 seales) se han detectado ms
de un 100%36 de las contracciones auriculares prematuras (APCs). Se pueden observar con
ms detalle estos resultados en el ANEXO A: Tablas Tabla 5.
Deteccin de Taquicardias
Casos vlidos
36
Estos resultados pueden variar, ya que para realizar este proceso es necesario utilizar la funcin Denoise,
la cual, necesita un intervalo de ruido escogido por el usuario. Si este proceso no se realiza correctamente,
los resultados pueden no ser tan favorables.
81
Fig 64: Deteccin de taquicardias; seal 114.mat; preprocesado con db5 y 'Denoise'
82
Fig 65: Deteccin de taquicardias; seal 115.mat; preprocesado con sym4 y 'Denoise'
Por ltimo estn los casos en los cuales detecta casi el 100% de los intervalos como
puede ser el siguiente. Un paciente de 68 aos. De acuerdo con la base de datos, presenta
110 intervalos de taquicardias en los 30 minutos aproximados de seal. El algoritmo
consigue detectar 104, es decir un 94.54% del total. El umbral a partir del cual se
consideran taquicardias para este paciente es 94 ppm.
La Figura 66 muestra este tipo caso:
Fig 66: Deteccin de taquicardias; seal 201.mat; preprocesado con sym4 y 'Denoise'
83
Casos fallidos
Existen casos en los cuales las seales estn muy contaminadas de ruido y no
pueden ser analizadas correctamente, esto conlleva que el programa detecte anomalas
donde no las hay. En el ejemplo siguiente se puede observar como el ruido es tal, que
pierde informacin, es decir en esos instantes se pueden interpretar detecciones fallidas.
Fig 67: Deteccin fallida taquicardias; seal 105.mat; preprocesado con bior 1.3 y 'Denoise'
Resultados
37
Estos resultados pueden variar, ya que para realizar este proceso es necesario utilizar la funcin Denoise,
la cual, necesita un intervalo de ruido escogido por el usuario. Si este proceso no se realiza correctamente,
los resultados pueden no ser tan favorables.
84
Deteccin de Bradicardias
Casos vlidos
Fig 68: Deteccin de bradicardias seal 219.mat; preprocesado con db4 y 'Denoise'
85
Fig 69: Deteccin de bradicardias; seal 233.mat; preprocesado con bior 6.8 y 'Denoise'
Por ltimo estn los casos en los cuales detecta casi el 100% de los intervalos como
puede ser el siguiente. Un paciente de 83 aos. De acuerdo con la base de datos, presenta
10 intervalos de bradicardias en los 30 minutos aproximados de seal. El algoritmo
consigue detectar 7, es decir un 70% del total. La Figura 70 muestra este tipo de caso:
86
Fig 70: Deteccin de bradicardias; seal 221.mat; preprocesado con sym4 y 'Denoise'
Casos fallidos
Hay casos en los que los complejos QRS en un mismo electrocardiograma son de
amplitud muy cambiantes. Esto puede entorpecer el funcionamiento del algoritmo sobre
todo en el proceso de detectar complejos QRS, lo cual influye en la deteccin de
bradicardias.
La siguiente seal pertenece a una paciente de 84 aos. Segn la base de datos no
padece ningn intervalo de bradicardia a lo largo de la seal de aproximadamente 30
minutos. El algoritmo detecta 11 falsas detecciones por el motivo explicado.
En la Figura 71 se puede apreciar como en los cuadrados de color verde existen
zonas de muy baja amplitud con respecto al resto. El programa en ocasiones no lo
interpreta como complejos QRS y entonces esto afecto al procesado de la deteccin de
bradicardias.
87
Fig 71: Deteccin de bradicardias fallida; seal 222.mat; preprocesado con bior 1.3 y 'Denoise'
Resultados
38
Estos resultados pueden variar, ya que para realizar este proceso es necesario utilizar la funcin Denoise,
la cual, necesita un intervalo de ruido escogido por el usuario. Si este proceso no se realiza correctamente,
los resultados pueden no ser tan favorables.
88
Con las tareas principales de este Trabajo Fin de Grado ya finalizadas, llega el
momento de hacer balance y reflexionar acerca de los resultados obtenidos. Al inicio del
proyecto se establecieron unos objetivos que se creen alcanzados y de los cuales se han
extrado las conclusiones pertinentes.
Se han estudiado los mtodos de eliminacin de ruido ms eficientes en la
actualidad y se ha elegido uno de ellos para eliminar o reducir el ruido en las seales
electrocardiogrficas con el fin de poder analizarlas de forma eficiente y con resultados
ms fiables.
Las seales ECG necesitaban de un anlisis previo para encontrar sus
caractersticas, sus formas de onda Este estudio se ha realizado en profundidad para
detectar las arritmias, se han encontrado muchas limitaciones pero se han intentado
solventar de la mejor forma posible.
El software realizado permite analizar de forma rpida las seales ECG, pudiendo
ayudar a estudiantes de medicina a detectar de forma rpida arritmias y encontrar sus
caractersticas particulares de cada una de ellas. Tambin es til para detectarlas dado que
las seales ECG normalmente son muy largas y es un trabajo laborioso para el mdico ir
mirando intervalo a intervalo. En este caso el programa le marca las zonas conflictivas en
las que se producen esas arritmias y as el mdico puede analizarlas en profundidad sin
tener que comprobar toda la seal en busca de alguna anomala.
Para terminar, se han realizado las pruebas pertinentes para probar el algoritmo,
obteniendo buenos resultados, ya que el porcentaje de deteccin es alto y se ha conseguido
automatizar un programa para que sea sencillo para el usuario, intuitivo y til para todo
tipo de seales ECG.
89
Por ltimo, es importante hablar de las futuras lneas de trabajo y de cmo podra
mejorarse y ampliarse este programa. Se plantean a continuacin las principales:
90
6. REFERENCIAS BIBLIOGRFICAS
[1] Senhadji, L., et al., Comparing wavelet transforms for recognizing cardiac patterns.
IEEE Eng. Med. Biol. 14(2):167173, 1995.
[2] Sahambi, J. S., et al., Using wavelet transforms for ECG characterization: an on-line
digital signal processing system. IEEE Eng. Med. Biol. 16(1):7783, 1997.
[3] Hamilton, P. S., and Tompkins, W. J., Quantitative investigation of QRS detection
rules using the MIT-BIH arrhythmia database. IEEE Trans. Biomed. Eng. 33(12):1157
1165, 1986.
[4] Thakor, N. V., et al., Estimation of QRS complex power spectra for design of a QRS
filter. IEEE Trans. Biomed. Eng. 31(11):702706, 1986.
[5] Li, C., et al., Detection of ECG characteristic points using wavelet transforms. IEEE
Trans. Biomed. Eng. 42 (1):2128, 1995.
[6] Castro, Kogan, D., and Geva, A. B., ECG feature extraction using optimal mother
wavelet. IEEE EMBE Int. Conf. 346350, Apr., 2000.
[7] Pan, J., and Tompkins, W. J., A real time QRS detection algorithm. IEEE Trans.
Biomed. Eng., BME 32(3):230236, 1985.
[8] Maglaveras, N., et al., An adaptive backpropagation neural network for real-time
ischemia episodes detection: Development and performance analysis using the European
ST-T database. IEEE Trans. Biomed. Eng. 45(7):805813, 1998.
[9] Yu, S. N., and Chou, K. T., Integration of independent component analysis and neural
networks for ECG beat classification. Expert Syst. Appl. 34(4):28412846, 2008.
[10] Misini.M, et al., Wavlet Toolbox Users Guide, 1996 - 1997 by The MathWorks, Inc.
All Rights Reserved.
[11] Weiss, L., (Enero de 1994). Wavelets and wideband correlation processing. IEEE
Signal Processing, 13-31.
[12] Abibullaev, B., and Seo, H. D., A new QRS detection method using wavelets and
artificial neural networks. Springer Science+Business Media, LLC 2009
[13] Martis, R. J., et al., Automated Screening of Arrhytmia using wavelet based machine
learning techniques. Springer Science+Business Media, LLC 2010
[14] http://www.bssaonline.org/content/93/6/2554.short (ltimo acceso: 04/09/2014)
91
ANEXO A: Tablas
Tabla 4: Datos de las seales
Nombre Edad
Sexo
100
69
masculino
Der.
1
MLII
101
75
femenino
MLII
102
84
femenino
103
N.D
104
Der.
2
V5
CVP APC
1
33
Taquicardia
(episodios)
0
V1
V5
V2
masculino
MLII
V2
66
femenino
V5
V2
105
73
femenino
MLII
V1
41
106
24
femenino
MLII
V1
520
19
107
63
masculino
MLII
V1
59
108
87
femenino
MLII
V1
19
15
109
64
masculino
MLII
V1
40
111
47
femenino
MLII
V1
112
54
masculino
MLII
V1
113
24
femenino
MLII
V1
114
72
femenino
V5
MLII
47
10
115
39
femenino
MLII
V1
116
68
masculino
MLII
V1
109
117
69
masculino
MLII
V2
118
69
masculino
MLII
V1
16
106
119
51
femenino
MLII
V1
444
121
83
femenino
MLII
V1
122
51
masculino
MLII
V1
123
63
femenino
MLII
V5
124
77
masculino
MLII
V4
52
35
92
Bradicardia
(episodios)
0
200
64
masculino
MLII
V1
828
30
148
201
68
masculino
MLII
V1
200
164
110
110
202
68
masculino
MLII
V1
20
55
105
10
203
43
masculino
MLII
V1
445
350
205
59
masculino
MLII
V1
82
170
207
89
femenino
MLII
V1
105
107
50
50
208
23
femenino
MLII
V1
1365
525
209
62
masculino
MLII
V1
383
270
210
89
masculino
MLII
V1
204
22
324
212
32
femenino
MLII
V1
160
213
61
masculino
MLII
V1
582
28
43
214
53
masculino
MLII
V1
257
15
215
81
masculino
MLII
V1
165
520
217
65
masculino
MLII
V1
162
160
219
N.D
masculino
MLII
V1
65
140
10
17
220
87
femenino
MLII
V1
94
221
83
masculino
MLII
V1
396
190
10
222
84
femenino
MLII
V1
208
175
223
73
masculino
MLII
V1
487
73
14
228
80
femenino
MLII
V1
362
230
32
masculino
MLII
V1
35
231
72
Femenino
MLII
V1
50
232
76
Femenino
MLII
V1
1382
45
233
57
Masculino MLII
V1
842
71
234
56
Femenino
V1
MLII
93
Nombre QRS
QRS
detectados
Porcentaje (QRS
detectados / QRS)
100
2273
2273
100%
101
1865
1859
99.67%
102
2187
N.D
N.D
103
2084
2083
99.95%
104
2229
N.D
N.D
105
2572
2717
106
2027
2027
107
2139
2733
1774
1536
86.58%
109
2532
2485
98.14%
111
2124
2257
112
2539
2536
113
1795
2254
114
1879
1879
100%
115
1953
1953
100%
116
2412
2363
97.96%
117
1535
1947
118
2288
2267
99.08%
119
1987
1988
100.05%
121
1863
1868
100.26%
122
2476
2476
100%
123
1519
1519
100%
124
1619
1608
99.32%
200
2601
2671
201
2000
1972
108
Notas
100%
Ondas T con mucha amplitud
Intervalos muy cambiantes de
amplitud
94
202
2139
2139
100%
203
2980
2629
88.22%
205
2656
2653
99.88%
207
2332
2163
92.75%
208
2955
2941
99.52%
209
3005
3050
210
2650
2514
212
2748
2892
213
3251
3241
214
2262
2373
215
3363
3358
99.85%
217
2208
1824
82.60%
219
2287
2156
94.27%
220
2048
2048
100%
221
2427
2155
88.79%
222
2483
2239
90.17%
223
2605
2350
90.21%
228
2053
1532
74.62%
230
2259
2259
100%
231
1573
1742
232
1780
2004
Intervalos de ruido
233
3079
2979
96.75%
234
2753
2753
100%
NOTA! El smbolo
que los QRS que detecta son falsos. El motivo de que no sean vlidas se encuentra en la
columna denominada Notas.
95
CVP detectados
(umbral al 50%)
Porcentaje (CVP
detectados / CVP)
100%
N.D
70
104
N.D
N.D
105
41
12.19%
7 minutos de ruido
106
520
86
16.53%
107
59
24
40.67%
108
19
31.57%
109
40
12.5%
111
300%
Nombre CVP
100
101
102
103
36
78
47
46
97.87%
115
43
109
66
118
16
6.25%
119
444
157
35.36%
121
100%
116
0.91%
117
122
Posibles CVPs
Al no tener CVPs interpreta el
mnimo como CVP y con un
umbral del 50%
Al no tener CVPs interpreta el
mnimo como CVP y con un
umbral del 50%
113
114
112
Notas
Intervalos de ruido
Al no tener CVPs interpreta el
mnimo como CVP y con un
96
34
0%
124
52
32
61.53%
200
828
0.60%
201
200
147
73.5%
202
20
5%
203
445
85
19.10%
205
82
61
74.39%
207
105
89
84.76%
208
1365
0.14%
209
100%
210
204
38
18.62%
213
582
29
4.98%
214
257
117
45.52%
215
165
1.21%
217
162
16
9.87%
219
65
43
66.15%
212
220
45
396
17
10
223
487
0.82%
228
362
52
14.36%
230
100%
231
44
0%
232
221
4.29%
222
97
842
58
7.00%
234
33.33%
NOTA! El smbolo
que los CVP que detecta son falsos. El motivo de que no sean vlidas se encuentra en la
columna denominada Notas.
98
Nombre APC
APC
detectados
Porcentaje (APC
detectados / APC)
Notas
100
33
32
96.96%
101
166,6%
Posibles APCs
102
N.D
N.D
103
300%
Posibles APCs
104
N.D
N.D
105
100%
106
100%
107
237
15
109
111
97
112
113
83
114
10
0%
115
900%
Posibles APCs
116
10
1000%
Posibles APCs
117
118
106
59
55.66%
119
100%
121
300%
Posibles APCs
122
200%
Posible APC
123
17
1800%
Posibles APCs
0%
200
30
201
164
29
108
124
200%
Posible APC
Ondas T con mucha amplitud
100%
Ondas T con mucha amplitud
202
55
203
205
207
107
208
100%
209
383
57
14.88%
210
22
14
63.63%
212
500%
213
28
27
96.42%
214
100%
215
90
3000%
217
100%
219
140
35
25%
220
94
35
37.23%
221
100%
208
73
230
231
24
232
1382
0%
233
57.14%
234
100%
222
223
228
NOTA! El smbolo
0%
Muchos intervalos de ruido
Posibles APCs
Posibles APCs
Posibles APCs
Ondas T con mucha amplitud
que los APC que detecta son falsos. El motivo de que no sean vlidas se encuentra en la
columna denominada Notas.
100
Nombre Taquicardias
Taquicardias
detectadas
Porcentaje
(Taquicardias
detectadas /
Taquicardias)
100
100%
101
100%
N.D
N.D
N.D
N.D
N.D
N.D
45
19
28
334
14
155
29
114
100%
115
100%
116
0%
118
20
0%
119
100%
121
100%
122
100%
102
103
104
105
106
107
111
112
113
117
No tiene
derivacin MLII
No est
disponible la edad
del paciente
No tiene
derivacin MLII
7 minutos de
ruido
147.36%
108
109
Notas
1000%
0%
Ondas T con
mucha amplitud
Intervalos muy
cambiantes de
amplitud
Posibles
taquicardias
Ondas T con
mucha amplitud
Intervalo de ruido
Ondas T con
mucha amplitud
Intervalo de ruido
Ondas T con
mucha amplitud
101
Intervalo de ruido
123
100%
124
100%
200
148
151
102.02%
201
110
104
94.54%
202
105
102
97.14%
203
350
326
93.14%
205
170
153
90%
207
50
48
96%
208
525
522
99.42%
209
270
268
99.25%
210
324
315
97.22%
212
160
157
98.12%
213
43
42
97.67%
214
15
17
113.33%
215
520
520
100%
217
160
157
98.12%
219
10
N.D
N.D
220
11
137.5%
221
190
179
94.21%
222
175
165
94.28%
223
14
14
100%
228
230
35
32
37
232
100%
233
71
68
95.77%
231
No est
disponible la edad
del paciente
Intervalo de ruido
91.42%
Intervalos de
ruido
102
234
NOTA! El smbolo
100%
que los intervalos de taquicardias que detecta son falsos. El motivo de que no sean vlidas
se encuentra en la columna denominada Notas.
Nombre Bradicardias
Bradicardias
detectadas
Porcentaje
(Bradicardias
detectadas /
Bradicardias)
100
100%
101
100%
N.D
N.D
100%
N.D
N.D
100%
102
103
104
105
106
Notas
No tiene
derivacin MLII
No tiene
derivacin MLII
Intervalos con
Onda Q con muy
poca amplitud
32
Intervalos muy
cambiantes de
amplitud
109
111
112
100%
113
100%
114
100%
115
100%
107
100%
108
103
116
117
100%
118
100%
119
100%
121
100%
122
100%
123
100%
124
35
32
91.42%
200
201
110
103
93.63%
202
10
10
100%
203
205
100%
207
50
43
86%
208
209
210
212
100%
213
100%
214
100%
215
217
100%
219
17
17
100%
220
100%
221
10
70%
11
Intervalos muy
cambiantes de
amplitud
23
Intervalos muy
222
223
104
cambiantes de
amplitud
228
100%
230
100%
231
50
40
80%
232
45
44
97.77%
233
100%
234
100%
NOTA! El smbolo
que los intervalos de bradicardias que detecta son falsos. El motivo de que no sean vlidas
se encuentra en la columna denominada Notas.
105
106
varargout{1} = handles.output;
% -------------------------------------------------------------------function Archivo_Callback(hObject, eventdata, handles)
% hObject
handle to Archivo (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles
structure with handles and user data (see GUIDATA)
% -------------------------------------------------------------------function Ayuda_Callback(hObject, eventdata, handles)
% hObject
handle to Ayuda (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles
structure with handles and user data (see GUIDATA)
open('guide.pdf')
% -------------------------------------------------------------------function Abr_Callback(hObject, eventdata, handles)
% hObject
handle to Abr (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles
structure with handles and user data (see GUIDATA)
[filename,path]=uigetfile({'*.mat'},'Abrir seal');
if isequal(filename,0)
return
else
signal=load(strcat(path,filename));
M1=signal.M(:,1);
M2=signal.M(:,2);
b=signal.b;
edad=signal.edad
sexo=signal.sexo
end
if(b(1)==1)
valor1='MLII';
elseif(b(1)==2)
valor1='V1';
elseif(b(1)==3)
valor1='V2';
elseif(b(1)==4)
valor1='V4';
else
valor1='V5';
end
if(b(2)==1)
valor2='MLII';
elseif(b(2)==2)
valor2='V1';
elseif(b(2)==3)
valor2='V2';
elseif(b(2)==4)
valor2='V4';
else
valor2='V5';
end
maximo1=max(abs(M1));
107
maximo2=max(abs(M2));
M1=M1./maximo1;
M2=M2./maximo2;
recuperar1=M1;
recuperar2=M2;
%Creamos los handles para poder utilizar estas variables en otras
funciones
handles.M1=M1;
handles.M2=M2;
handles.recuperar1=recuperar1;
handles.recuperar2=recuperar2;
handles.b=b;
%Cogemos tanto el Tinicial, Tfinal y Fs que ha podido introducir el
usuario
Tinicial = get(handles.Tinicial,'String');
Tinicial = str2double(Tinicial);
Tfinal = get(handles.Tfinal,'String');
Tfinal = str2double(Tfinal);
Fs = get(handles.Fs,'String');
Fs = str2double(Fs);
%Representamos las seales:
axes(handles.axes1);
Representar(Tinicial, Tfinal, M1, Fs, 'b')
axes(handles.axes2);
Representar(Tinicial, Tfinal, M2, Fs, 'b')
derivacion1=strcat(['Derivacin: ' valor1]);
derivacion2=strcat(['Derivacin: ' valor2]);
set(handles.titulo1,'string', derivacion1)
set(handles.titulo2,'string', derivacion2)
%Calculamos el valor que tiene que poner en los ppm para las taquicardias
if (edad<20)
Pulsaciones=0;
elseif (edad>=20 && edad<30)
if(strcmp(sexo,'femenino'))
Pulsaciones=96;
else
Pulsaciones=86;
end
elseif (edad>=30 && edad<40)
if(strcmp(sexo,'femenino'))
Pulsaciones=98;
else
Pulsaciones=86;
108
end
elseif (edad>=40 && edad<50)
if(strcmp(sexo,'femenino'))
Pulsaciones=100;
else
Pulsaciones=90;
end
elseif (edad>=50 && edad<60)
if(strcmp(sexo,'femenino'))
Pulsaciones=104;
else
Pulsaciones=90;
end
else
if(strcmp(sexo,'femenino'))
Pulsaciones=108;
else
Pulsaciones=94;
end
end
set (handles.Taquicardia, 'string', Pulsaciones)
handles.edad=edad;
handles.sexo=sexo;
guidata(hObject, handles);
% -------------------------------------------------------------------function Guardar_Callback(hObject, eventdata, handles)
% hObject
handle to Guardar (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles
structure with handles and user data (see GUIDATA)
% -------------------------------------------------------------------function Salir_Callback(hObject, eventdata, handles)
% hObject
handle to Salir (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles
structure with handles and user data (see GUIDATA)
opc=questdlg('Desea salir del programa?','SALIR','Si','No','No');
if strcmp(opc,'No')
return;
end
clear,clc,close all
% --- Executes on selection change in popupmenu1.
function popupmenu1_Callback(hObject, eventdata, handles)
% hObject
handle to popupmenu1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles
structure with handles and user data (see GUIDATA)
% Hints: contents = cellstr(get(hObject,'String')) returns popupmenu1
contents as cell array
%
contents{get(hObject,'Value')} returns selected item from
popupmenu1
109
110
% hObject
% eventdata
% handles
called
111
112
guidata(hObject, handles);
113
M2=handles.M2;
Tinicial = get(handles.Tinicial,'String');
Tinicial = str2double(Tinicial);
Tfinal = get(handles.Tfinal,'String');
Tfinal = str2double(Tfinal);
Fs = get(handles.Fs,'String');
Fs = str2double(Fs);
tipo = get(handles.popupmenu1, 'Value');
if tipo==1
valor='db4';
elseif tipo==2
valor='db5';
elseif tipo==3
valor='sym4';
elseif tipo==4
valor='bior1.3';
else
valor='bior6.8';
end
nivel = get(handles.popupmenu2, 'Value');
if nivel==1
valornivel=1;
elseif nivel==2
valornivel=2;
elseif nivel==3
valornivel=3;
elseif nivel==4
valornivel=4;
elseif nivel==5
valornivel=5;
elseif nivel==6
valornivel=6;
elseif nivel==7
valornivel=7;
elseif nivel==8
valornivel=8;
else
valornivel=9;
end
axes(handles.axes1);
nueva=preprocesado (M1, valor, valornivel);
Representar(Tinicial, Tfinal, nueva, Fs, 'b')
axes(handles.axes2);
nueva1=preprocesado (M2, valor, valornivel);
Representar(Tinicial, Tfinal, nueva1, Fs, 'b')
M1=nueva;
M2=nueva1;
handles.M1=M1;
handles.M2=M2;
114
guidata(hObject, handles);
% --- Executes on selection change in deteccion.
function deteccion_Callback(hObject, eventdata, handles)
% hObject
handle to deteccion (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles
structure with handles and user data (see GUIDATA)
% Hints: contents = cellstr(get(hObject,'String')) returns deteccion
contents as cell array
%
contents{get(hObject,'Value')} returns selected item from
deteccion
% --- Executes during object creation, after setting all properties.
function deteccion_CreateFcn(hObject, eventdata, handles)
% hObject
handle to deteccion (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles
empty - handles not created until after all CreateFcns
called
% Hint: popupmenu controls usually have a white background on Windows.
%
See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
% --- Executes on button press in Aplicar2.
function Aplicar2_Callback(hObject, eventdata, handles)
% hObject
handle to Aplicar2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles
structure with handles and user data (see GUIDATA)
M1=handles.M1;
M2=handles.M2;
b=handles.b;
Tinicial = get(handles.Tinicial,'String');
Tinicial = str2double(Tinicial);
Tfinal = get(handles.Tfinal,'String');
Tfinal = str2double(Tfinal);
Fs = get(handles.Fs,'String');
Fs = str2double(Fs);
tipodeteccion = get(handles.deteccion, 'Value');
if tipodeteccion==1
%DETECCION DE CVP
Porcentaje = get(handles.Factor,'String');
Porcentaje = str2double(Porcentaje);
if(b(1)==1)
detecCVP = deteccion_CVP (M1, Porcentaje);
115
posiciones = find(detecCVP<0);
CVPdetectados = size(posiciones)
axes(handles.axes1);
hold on
Representar(Tinicial, Tfinal, detecCVP, Fs, 'r')
axes(handles.axes2);
hold on
Representar(Tinicial, Tfinal, detecCVP, Fs, 'r')
elseif(b(2)==1)
detecCVP = deteccion_CVP (M2, Porcentaje);
posiciones = find(detecCVP<0);
CVPdetectados = size(posiciones)
axes(handles.axes1);
hold on
Representar(Tinicial, Tfinal, detecCVP, Fs, 'r')
axes(handles.axes2);
hold on
Representar(Tinicial, Tfinal, detecCVP, Fs, 'r')
else
errordlg('No pueden detectarse contracciones ventriculares
prematuras para este paciente','ERROR')
end
posiciones=(posiciones./(360*60));
posiciones=round(posiciones.*100)./100;
fid=fopen('Deteccin de CVPs.txt','w');
fprintf(fid, 'Deteccin de CVPs: \n \nCVPs detectados:');
fprintf(fid, '%d \n \n', CVPdetectados(1));
fprintf(fid, 'CVP
Tiempo(min) \n')
for i=1:CVPdetectados(1)
fprintf(fid,'%d
%f \n',i, posiciones(i));
end
fclose(fid);
elseif tipodeteccion==2
%DETECCION DE APC
if(b(1)==1)
detecAPC = deteccion_APC (M1);
posiciones = find(detecAPC>0);
APCdetectados = size(posiciones)
axes(handles.axes1);
hold on
Representar(Tinicial, Tfinal, detecAPC, Fs, 'r')
axes(handles.axes2);
hold on
Representar(Tinicial, Tfinal, detecAPC, Fs, 'r')
elseif(b(2)==1)
detecAPC = deteccion_APC (M2);
posiciones = find(detecAPC>0);
APCdetectados = size(posiciones)
116
axes(handles.axes1);
hold on
Representar(Tinicial, Tfinal, detecAPC, Fs, 'r')
axes(handles.axes2);
hold on
Representar(Tinicial, Tfinal, detecAPC, Fs, 'r')
else
errordlg('No pueden detectarse contracciones auriculares
prematuras para este paciente','ERROR')
end
posiciones=(posiciones./(360*60));
posiciones=round(posiciones.*100)./100;
fid=fopen('Deteccin de APCs.txt','w');
fprintf(fid, 'Deteccin de APCs: \n \nAPCs detectados:');
fprintf(fid, '%d \n \n', APCdetectados(1));
fprintf(fid, 'APC
Tiempo(min) \n');
for i=1:APCdetectados(1)
fprintf(fid,'%d
%f \n',i, posiciones(i));
end
fclose(fid);
elseif tipodeteccion==3
%DETECCION TAQUICARDIAS
Pulsaciones = get(handles.Taquicardia,'String');
Pulsaciones = str2double(Pulsaciones);
if(b(1)==1)
if (Pulsaciones==0)
errordlg('No se han podido determinar las ppm a partir de las
cuales pueden considerarse taquicardias ya que no se dispone de la edad
del paciente. Le rogamos introduzca un valor que considere
adecuado.','ERROR')
else
TAQUICARDIAS = deteccion_taquicardia (M1, Pulsaciones);
posiciones = find(TAQUICARDIAS>0);
TAQUICARDIASdetectadas = size(posiciones)
axes(handles.axes1);
hold on
Representar(Tinicial, Tfinal, TAQUICARDIAS, Fs, 'r')
axes(handles.axes2);
hold on
Representar(Tinicial, Tfinal, TAQUICARDIAS, Fs, 'r')
end
elseif(b(2)==1)
if (Pulsaciones==0)
errordlg('No se han podido determinar las ppm a partir de las
cuales pueden considerarse taquicardias ya que no se dispone de la edad
del paciente. Le rogamos introduzca un valor que considere
adecuado.','ERROR')
else
TAQUICARDIAS = deteccion_taquicardia (M2, Pulsaciones);
posiciones = find(TAQUICARDIAS>0);
TAQUICARDIASdetectadas = size(posiciones)
117
axes(handles.axes1);
hold on
Representar(Tinicial, Tfinal, TAQUICARDIAS, Fs, 'r')
axes(handles.axes2);
hold on
Representar(Tinicial, Tfinal, TAQUICARDIAS, Fs, 'r')
end
else
errordlg('No pueden detectarse taquicardias para este
paciente','ERROR')
end
posiciones=(posiciones./(360*60));
posiciones=round(posiciones.*100)./100;
fid=fopen('Deteccin de Taquicardias.txt','w');
fprintf(fid, 'Deteccin de Taquicardias: \n \nTaquicardias
detectadas:');
fprintf(fid, '%d \n \n', TAQUICARDIASdetectadas(1));
fprintf(fid, 'Taquicardia
Tiempo(min) \n');
for i=1:TAQUICARDIASdetectadas(1)
fprintf(fid,'%d
%f \n',i, posiciones(i));
end
fclose(fid);
else
%DETECCION BRADICARDIAS
if(b(1)==1)
BRADICARDIAS = deteccion_bradicardia (M1);
posiciones = find(BRADICARDIAS>0);
BRADICARDIASdetectadas = size(posiciones)
axes(handles.axes1);
hold on
Representar(Tinicial, Tfinal, BRADICARDIAS, Fs, 'r')
axes(handles.axes2);
hold on
Representar(Tinicial, Tfinal, BRADICARDIAS, Fs, 'r')
elseif(b(2)==1)
BRADICARDIAS = deteccion_bradicardia (M2);
posiciones = find(BRADICARDIAS>0);
BRADICARDIASdetectadas = size(posiciones)
axes(handles.axes1);
hold on
Representar(Tinicial, Tfinal, BRADICARDIAS, Fs, 'r')
axes(handles.axes2);
hold on
Representar(Tinicial, Tfinal, BRADICARDIAS, Fs, 'r')
else
errordlg('No pueden detectarse bradicardias para este
paciente','ERROR')
end
posiciones=(posiciones./(360*60));
posiciones=round(posiciones.*100)./100;
118
fid=fopen('Deteccin de Bradicardias.txt','w');
fprintf(fid, 'Deteccin de Bradicardias: \n \nBradicardias
detectadas:');
fprintf(fid, '%d \n \n', BRADICARDIASdetectadas(1));
fprintf(fid, 'Badricardia
Tiempo(min) \n');
for i=1:BRADICARDIASdetectadas(1)
fprintf(fid,'%d
%f \n',i, posiciones(i));
end
fclose(fid);
end
% --- Executes on button press in resetear.
function resetear_Callback(hObject, eventdata, handles)
% hObject
handle to resetear (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles
structure with handles and user data (see GUIDATA)
recuperar1=handles.recuperar1;
recuperar2=handles.recuperar2;
M1=recuperar1;
M2=recuperar2;
Tinicial = get(handles.Tinicial,'String');
Tinicial = str2double(Tinicial);
Tfinal = get(handles.Tfinal,'String');
Tfinal = str2double(Tfinal);
Fs = get(handles.Fs,'String');
Fs = str2double(Fs);
axes(handles.axes1);
hold off
Representar(Tinicial, Tfinal, M1, Fs, 'b')
axes(handles.axes2);
hold off
Representar(Tinicial, Tfinal, M2, Fs, 'b')
handles.M1=M1;
handles.M2=M2;
guidata(hObject, handles);
119
Funcin Representar:
function Representar(Tinicial, Tfinal, M, fs, color)
%pasamos el tiempo a segundos
Tinicialseg=Tinicial*60;
Tfinalseg=Tfinal*60;
%sacamos el nmero de muestras
Muestrainicial=Tinicialseg*fs;
Muestrafinal=Tfinalseg*fs;
%sacamos la longitud de M para obtener el vector TIME
samplesM=length(M);
TIME=(0:samplesM-1)/fs;
TIME=TIME/60;
120
%representamos
plot(TIME(Muestrainicial+1:Muestrafinal+1),
M(Muestrainicial+1:Muestrafinal+1), color);
xlabel('Time (min)', 'Fontsize', 10);
ylabel('Voltage (mV)', 'Fontsize',10);
xlim([TIME(Muestrainicial+1),TIME(Muestrafinal+1)]);
end
Funcin Inicializar:
function Inicializar
plot(0);
axis([0 30 -1 1]);
xlabel('Time (min)', 'Fontsize', 10);
ylabel('Voltage (mV)', 'Fontsize',10);
end
Funcin preprocesado:
function nueva=preprocesado (M, valor, n)
[C,L] = wavedec(M,n,valor); %descomposicn wavelet en n niveles
A = wrcoef('a',C,L,valor,n);
nueva=0;
for i=1:n
D = wrcoef('d',C,L,valor,i);
nueva=nueva+D;
end
end
121
122
123
124
APCFINAL(valor)=1;
aux=aux+1;
end
end
MediaQ=mean(ampQ);
DesviacionQ=std(ampQ);
for i=1:length(APCFINAL)
if(APCFINAL(i)==0)
APCFINAL(i)=APCFINAL(i); %no hace nada
else
for j=i-216:i+216
if(ondas(j)<(MediaQ-(1.5*DesviacionQ)))
APCFINAL(i)=0;
end
end
end
end
end
125
positivo=1;
negativo=1;
for i=1:length(ondas)
if ondas(i)>0
if(negativo==1)
ondas(i)=ondas(i);
positivo=1;
negativo=0;
else
ondas(i)=0;
end
elseif ondas(i)<0
if(positivo==1)
ondas(i)=ondas(i);
positivo=0;
negativo=1;
else
ondas(i)=0;
end
else
end
end
posR=find(OndaR>0); %posiciones en los que hay ondas R
difR=posR(2:length(posR))-posR(1:(length(posR)-1)) %diferencias en
muestras de esas posiciones (lo cerca o alejadas que estn unas de otras)
%-----------------------------Detectar TAQUICARDIAS----------------------TAQUICARDIAS=zeros(length(M),1);
aux=0;
for i=1:(length(difR)-1)
if(difR(i)<=Factor && difR(i+1)<=Factor)
if(aux==0)
posicion=posR(i);
TAQUICARDIAS(posicion)=1;
aux=1;
else
end
else
aux=0;
end
end
MediaQ=mean(ampQ);
DesviacionQ=std(ampQ);
for i=1:length(TAQUICARDIAS)
if(TAQUICARDIAS(i)==0)
TAQUICARDIAS(i)=TAQUICARDIAS(i); %no hace nada
else
for j=i-216:i+216
if(ondas(j)<(MediaQ-(1.5*DesviacionQ)))
126
TAQUICARDIAS(i)=0;
end
end
end
end
end
127
positivo=0;
negativo=1;
else
ondas(i)=0;
end
else
end
end
posR=find(OndaR>0); %posiciones en los que hay ondas R
difR=posR(2:length(posR))-posR(1:(length(posR)-1)) %diferencias en
muestras de esas posiciones (lo cerca o alejadas que estn unas de otras)
%-----------------------------Detectar BRADICARDIAS----------------------BRADICARDIAS=zeros(length(M),1);
aux=0;
for i=1:(length(difR)-1)
if(difR(i)>=Factor && difR(i+1)>=Factor)
if(aux==0)
posicion=posR(i);
BRADICARDIAS(posicion)=1;
aux=1;
else
end
else
aux=0;
end
end
MediaQ=mean(ampQ);
DesviacionQ=std(ampQ);
for i=1:length(BRADICARDIAS)
if(BRADICARDIAS(i)==0)
BRADICARDIAS(i)=BRADICARDIAS(i); %no hace nada
else
for j=i-216:i+216
if(ondas(j)<(MediaQ-(1.5*DesviacionQ)))
BRADICARDIAS(i)=0;
end
end
end
end
end
128
129
130
131
Panel de preprocesado
Panel de variables
Panel de deteccin
Panel de preprocesado
132
En esta pantalla el programa te explica que pasos debes realizar para utilizar la
funcin Denoise y conseguir un buen filtrado. Al terminar estos pasos se representan en
las grficas los resultados.
En la parte inferior de la Fig 54, se encuentra un botn llamado Seal Original, el
cual vuelve a mostrar en las grficas las seales originales sin ningn tipo de filtrado.
133
Panel de variables
En la parte inferior hay un Edit Text para introducir la frecuencia de muestreo (fs),
en este caso tiene un valor por defecto de 360, ya que las seales utilizadas en las pruebas
tenan esa frecuencia, pero esta puede ser cambiada para utilizar el programa con otras
seales que tengan otra frecuencia de muestreo.
Para que se realice este proceso se debe pulsar el botn Aplicar y entonces se
podrn apreciar los cambios en las grficas.
134
Panel de deteccin
135
Para que pueda realizarse todo este proceso es necesario pulsar el botn Aplicar y
entonces se podr apreciar en las grficas los resultados. Adems se genera un archivo de
texto con los resultados. Este archivo tiene la siguiente estructura:
136