UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma...

91
UNIVERSIDAD AUTONOMA METROPOLITANA IZTAPALAPA PROYECTO TERMINAL DE INGENIERIA ELÉCTRICA BIBLIOTECA DE FUNCIONES PARA EL PROCESAMIENTO DIGITAL DE UN ELCTROCARDIOGRAMA ASESORES: JESÚS MONDRAGON S. VERONICA MEDINA BAÑUELOS INTEGRANTES DE EQUIPO: ESPEJEL BENGOA MIGUEL ANGEL ORTUÑO TERRAZAS SERGIO MARCEL0 RAMíREZ ISLAS CLAUDIA

Transcript of UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma...

Page 1: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

UNIVERSIDAD AUTONOMA METROPOLITANA

IZTAPALAPA

PROYECTO TERMINAL DE INGENIERIA ELÉCTRICA

BIBLIOTECA DE FUNCIONES PARA EL PROCESAMIENTO DIGITAL DE UN ELCTROCARDIOGRAMA

ASESORES: JESÚS MONDRAGON S.

VERONICA MEDINA BAÑUELOS

INTEGRANTES DE EQUIPO:

ESPEJEL BENGOA MIGUEL ANGEL

ORTUÑO TERRAZAS SERGIO MARCEL0

RAMíREZ ISLAS CLAUDIA

Page 2: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

INDICE

SECCION 1 Idea y fines del proyecto Generalidades

Descripción general

SECCION 2 Detector QRS Algoritmo basado en filtro pasa-banda > pnmera derivada Algoritmo basado en promediación

4 4 6

7 8

15 SECCION 3

Espectro de potencia 20

SECCION 4 Programa de aplicación

APENDICE A

APENDICE B

APENDICE C

REFERENCIAS

23

3 1

33

48

92

Page 3: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

SECCIÓN I

1.1 IDEA Y FiNES DEL PROYECTO

En los sistemas de análisis de HEAR RATE VARIABILiTY (h.r.v), el espectro de potencia, la duración de los intervalos R-R, la duración del complejo QRS, además de otros parametros son obtenidos haciendo un procesamiento digital de la señal o r i p a l del ECG (Electrocardiograma). Posteriormente se elaboran los reportes impresos para poder hacer el diagnóstico y opcionalmente almacenar el reporte en un archivo de disco

En el presente proyecto se han di señado e implementado bibliotecas de funciones capaces de obtener los siguientes parametros bajo un programa de aplicación:

* Espectro en frecuencia de los intervalos R-R * Histogama de los intervalos R-R * Gráfica de variación en tiempo de los intervalos R-R * Intervalo R-R Promedio * Intervalo R-R Máximo * Intervalo R-R Mínimo

Además como punto importante presenta la opción de elegir uno de los métodos comúnmente utilizados para la obtención de los intervalos R-R.

1.2 GENERALIDADES

La velocidad del corazón puede ser definida como la razón de ocurrencia de los latidos cardiacos usualmente expresada en latidos por minuto. La información de la velocidad del corazón es normalmente derivada del electrocardiograma (ECG). El primer paso en este procedimiento es la reducción del ECG a un proceso de eventos. Los eventos son los tiempos de ocurrencia de los complejos QRS o algunas veces de las ondas P. El segundo paso es calcular la velocidad de ocurrencia de los eventos derivados La variabilidad de la velocidad del corazón (H.R.V.) puede ser definida como las fluctuaciones cuantitativas de la velocidad del corazón. Estas fluctuaciones son aleatonas o perturbadas deterministicamente por mido.

El análisis del HRV se aplica en dos campos principalmente. Primero en la situación clínica (particularmente en la unidad de cuidado intensivo y en la unidad de cuidado coronano), la evaluación de los datos de la velocidad del corazón pueden proporcionar información usual alrededor de la condición del corazón de los pacientes. En esta aplicación la velocidad del corazón es usualmente idéntica al ritmo ventricular. Segundo, en el estudio neuronal del sistema cardiovascular, el HRV refleja la actividad del control de este sistema de una manera no invasiva y es una atractiva fuente de información.

Muchas señales de origen cardiovascular son casi periódicas, esto es , se repiten en cada ciclo cardiaco con un periodo que no es estrictamente constante, y además, también presentan algunos cambios en morfología, amplitud y fase de un latido a otro. Esta variabilidad es el resultado de complejos mecanismos de control iieiiroriales, cuya función es entrolar parametros alrededor de valores fisiológicos. Así, el estudio de c’stos cambios en base a latido por latido puede proporcionar

4

Page 4: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

importante información referente al estado de mecanismos sobre condiciones patológcas y fisiológicas.

La forma mas conveniente de observar las variaciones del corazón es ver el espectro de potencia o de amplitud de la señal y de la variabilidad de la velocidad del corazón. Este espectro es principalmente determinado por el sistema que controla la espiración y la presión sanguínea. El sistema que controla la temperatura tiene un efecto mínimo.

En particular el análisis del espectro de potencia de la sene discreta, la cual consiste de los valores del intervalo R-R de un latido a otro, presenta tres componentes principales: 1) Una componente de baja frecuencia (LF) centrado a 0.1 Hz entre un rango de 0.03 a 0.15 Hz. , cuyos cambios en potencia son relacionados a la actividad simpática en base a la farmacología y experimentos clínicos. 2) Un componente de alta frecuencia (HF) entre un rango de O. 18 y 0.4 Hz. en sincroiúa con la velocidad de respiración, se considera una expresión de los trastornos respiratorios mediados por la actividad vagal. 3 ) Para una persona en reposo, la banda de frecuencia que representa la temperatura es menor a O 06 Hz

En el espectro de potencia estas tres influencias se reconocen por un máximo relativo en la frecuencia correspondiente.

o ' 10 M 30 40

T : Reflexión de carácter oscilatorio del sistema de control termoregulatorio.

B : Reflexión de carácter oscilatono del sistema de control de la presión sanguínea.

R : Fluctuaciones en sincronia con la respiración.

5

Page 5: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

La potencia relacionada a los componentes de baja y alta frecuencia es expresada tanto en porcentajes como en valores absolutos del espectro de potencia (con o sin componentes de DC.). Su relación (LFíHF) y las frecuencias máximas relacionadas son parámetros Útiles que ayudan a cuantificar la actividad de balance simpático-vagal.

Para obtener en orden y correctamente el análisis del espectro, esta señal debe presentar algunas características de estacionaridad y ergodicidad. Por esta razón, el análisis es generalmente limitado a ventanas temporales de unos cuanto rninutos (conteniendo generalmente de 256 a 512 ciclos cardiacos consecutivos). En tales intervalos de tiempo, las señales mantienen un cierto nivel de estacionaridad sobre condiciones normales y cuando no se presentan perturbaciones externas o internas.

La resolución de los cambios dinámicos del espectro depende del número de puntos considerados en el (a mayor número de puntos mayor resolución).

1.3 DESCIUPCI~N GENERAL

Las bibliotecas se clasifican en cuatro grupos:

- Biblioteca con fwiciones dedicadas al procesamiento de una señal digital - Biblioteca con funciones dedicadas al manejo de archivos. - Biblioteca con funciones dedicadas a la interfase con el usuario. - Biblioteca con funciones de aplicaciones diversas.

Para poder ver con clandad el alcance de estas bibliotecas se diseño e implemento un programa de aplicación, el cual consiste en leer un archivo donde se encuentra la señal digitalizada, realizar la detección de los intervalos R-R (se tienen dos métodos de detección disponibles), obener espectro de potencia, htstograma y una gáfíca de tiempo de duración de cada intervalo detectado.

6

Page 6: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

SECCIÓN 2

2.1 DETECTOR QRS.

El uso de t d c a s de promediación para el mejoramiento de la razón eñal/ruido de señales específicas presentes en electrocardiogramas de alta amplificación, implican la localización de un punto fiducial como referencia de sincronización. '

Muchos autores han estudiado este problema proponiendo algoritmos basados en diferentes principios implementados, ya sea en modo software y/o hardware y generalmente diseñados para obtener el punto fiducial de acuerdo a cada complejo QRS.

Algunos autores han presentado algoritmos basados en el análisis de la derivada de la señal del ECG (Barbaro et a1.,1983; Brandon and Brody, 1970; Wajszcnik et a1.,1978; Craelius et a1.,1986). Otros han utilizado filtros capaces de dar simetría al QRS, y entonces seleccionar el punto central con un detector de umbral específico (Ujen et a1.,1979). Sin embargo otros han usado una técnica de limitación de contorno (Mohammad-Djafari et al.,l981;Goovaerts et al.,1976), que da buenos resultados cuando el valor de la razón señal/ruido es alta. Contrariamente, la Teaiica de Dferencia Cruzada es más adecuada en la prescencia de ruidos particulares en el ECG (Lindecrantz y Lilja, 1988). Otros algoritmos usan la Témica de Correlación Cruzada (Abboud y Sadeh, 1982; Denniss et a1.,1986). Un algoritmo que usa una nueva estimación de retraso en el tiempo (time delay), capaz de alinear siempre, la onda P y la onda T (Jesus y f i x 1988).

Los algoritmos descritos hasta ahora han sido enfocados para mejorar la especificidad de las señales; mientras que para la medición de los intervalos R-R, algoritmos que mejoran la sensibilidad han sido desarrollados (Amazeen et al.,1972; Murthy y rangaraj, 1979; Okada,l979; Fraden y neuman, 1980; Hanna, 1980; Ahlstrom Y Tompkins, 1983; Cahill y McClure, 1983; De Vel, 1984; Pande et a1.,1985; Pan y Tompkins, 1985).

En [2] se realiza una comparación de nueve algoritmos de detección de QRS. Los algoritmos fueron seleccionados bajo diferentes esquemas de funcionamiento y se clasificaron de la siguiente manera.

A) Algoritmos basados en Amplitud y primera derivada:

1 . - ) AFl (ver [3] ). 2.-) AF2 (ver [4] ). 3.-) AF3 (ver [5] ).

B) Algoritmos basados solamente en primera derivada:

1 .-) DF1 (ver [6] ). 2.-) DF2 (ver [7] ).

C) Algoritmos basados en pnmera y segunda derivada:

1 .-) FS 1 (ver [8] ). 2.-) FS2 (ver [9] ).

7

Page 7: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

D) Algoritmos basados en filtios digtales:

1.-) DF1 (ver [lo] ). 2.-) DF2 (ver [ 113 ).

El resultado de la comparación fue que los dgoritmos basados en amplitud y pendiente son más inmunes ai ruido Electromiográfico (EMG). Ya que este tipo de ruido presenta un gran reto, estos algoritmos tienen una ventaja significativa.

2.2. ALGORITMO BASADO EN FILTRO PASA-BANDA Y PRIMERA DERIVADA

Un algoritmo de detección de QRS en tiempo real, elaborado por Pan and Tomplcins (1985), fue ampliamente descrito por Hamilton y Tompkins (1986) [l]. Este reconoce los complejos QRS en base a un análisis de fase, amplitud y ancho de la señal.

La detección del QRS es dificil no sólo por la variabilidad fisiológica del complejo, sino también por varios tipos de ruido que se presentan en la señal del ECG. El ruido se debe al movimiento de los electrodos, ruido muscular, interferencia por la lhea de alimentación y ondas T, las cuales tienen características (en alta frecuencia) similares al complejo QRS.

Los detectores de QRS por software incluyen al menos uno de tres pasos de procesamiento: filtrado dig~tai lineal, transformación no lineal y algoritmos de reglas de decisión. El algoritmo que será implementado incluye estos tres pasos El proceso lineal incluye un filtro pasa bandas, un derivador y una ventana de integración La transformación no lineal consiste en elevar al cuadrado la señal. Una técnica basada en umbrales y discriminación de la onda T, corresponde a la parte de algoritmos de reglas de decisión.

La característica mas usada para localizar el complejo QRS es la pendiente de la onda R. Esto no es suficiente, por lo que para una mejor detección se deben obtener otros parámetros de la señal, tales como amplitud, ancho y energía del complejo QRS.

El algoritmo es dividido en tres procesos: fase de inicialización 1, fase de inicialización 2 y detección. La fase de inicializacien 1 , requiere de aproximadamente 2 s para iniciar la detección de umbrales, basándose en picos de señal y de ruido detectados durante este proceso. La fase de inicialización 2, requiere dos latidos de corazón para iniciar la promediación de intervalos R-R e inicializar el valor límite del intervalo R-R. La fase de detección realiza el proceso de reconocimiento para cada complejo QRS.

Los umbrales y otros parámetros del algoritmo son ajustados periódicamente para adaptarse a las características cambiantes de la señal. La detección de umbrales flota sobre el ruido, el cual es detectado por el algoritmo. Esto reduce el número de positivos falsos causados por cualquier tipo de ruido que imitan las características del complejo QRS.

Hay dos niveles de umbral separados, un nivel es la mitad del otro. Sí el algoritmo no encuentra un complejo QRS en un intervalo de tiempo correspondiente ai 166% del promedio actual de los intervalos R-R , el máximo pico detectado en este intervalo de tiempo que cae entre estos dos umbrales, es considerado como un posible complejo QRS por lo que es aplicado el umbral más bajo.

8

Page 8: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

Despues de que un complejo QRS es reconocido, fisiológicamente hay un periodo refractario de 200 ms antes de que el próximo complejo QRS pueda ser detectado. Cuando ocurre una detección de QRS al final de este periodo pero dentro de 360 ms del complejo previo, se debe determinar si es un complejo QRS válido o una onda T. En este caso, la forma de onda con mayor pendiente es considerada como el complejo QRS.

41 - dt

En la figura 2.2.1 se muestra los filtros envueltos en el análisis de la señal ECG. Para obtener la atenuación del ruido, la señal se pasa através de un filtro Pasa-Banda compuesto de un filtro Pasa-Bajas y un filtro Pasa-Altas en cascada. Los procesos subsecuentes son diferenciación, elevar al cuadrado, y promediación en el tiempo de la señal,

x(n) 2 v(n) A

41 32 - Filtro Filtro

Figura 2.2.1 ETAPAS DEL DETECTOR QRS.

ECG PacaBaja-b

Se eligió un filtro Pasa-Banda de una clase especial de filtros digitales que requieren solamente de coeficientes enteros Esto permite al microprocesador hacer el procesamiento de la señal usando solamente aritmética entera. permitiendo el procesamiento en tiempo real que es difícil de obtener con aritmética de punto flotante Estos filtros atenúan las características de baja frecuencia de las ondas P y T y ateniiari las altas frecuencias asociadas al ruido electromiográfico y a la interferencia de la línea de poder ,

bl o A z(n) b [ I ’ u Fl dt Pasa Alta

El siguiente paso del procesaniiento es la diferenciación, una técnica standard para encontrar las pendientes altas que normalmente distinguen los complejos QRS de las demás ondas del ECG.

Lo siguiente es una transformación no lineal que consiste en elevar al cuadrado cada una de las muestras de la señal. Esta transformactón sirve para hacer positivos todos los datos para la subsecuente integración y también acentúa las frecuencias altas de la señal obtenida del proceso de la diferenciación. Estas frecuencias son normalmente características del complejo QRS,

La onda elevada al cuadrado pasa a traves de una ventana de integración. Este integrador suma el área bajo la onda dentro de un intervalo de 150 ms, avanza un intervalo de una muestra e integra la nueva ventana de 150 ms. El ancho de la ventana de integración se tomó lo sufícientemente largo para incluir el tiempo de duración de un complejo QRS anormal, pero lo suficientemente corto para que no se traslape un QRS Y una onda T

Los niveles de los umbrales aplicndos a la forma de onda de la ventana de integración, se actualizan en base a las estimaciones de los iiiveles de pico de ruido y pico de señal. Después de una detección preliminar por los umbrales. 1111 proceso de decisión hace la determinación final para saber si un evento detectado fue o no un coniplc,io QRS

9

Page 9: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

Cada una de las etapas en esta técnica de detección de QRS son explicadas a continuación

A M P L 50 I T U D

100

O

- 5 0 Ill 0.2 0 . 3 0 . 4 0 . 5 A , O d . L

TIEMPO ( s )

Figura 2.2.2 Electrocardiograma muestreado a 200 muestrasheg.

2.2.1 FILTRO PASA BANDA

El filtro pasa banda reduce la influencia del ruido muscular, interferencia de 60 Hz e interferencia de la onda T. El filtro deseado para maxirnizar la energía del complejo QRS es aproximadamente 5- 15 Hz.

2.2.1.1 FILTRO PASABAJAS

La ecuación diferencial del filtro es

y(nT) = 2y(nT -T t y ( nT-2T)+x(nT)-2x(nT-6T)+x(nT- 12T)

donde la frecuencia de corte es aproximadamente de 11 HZ y la ganancia es 36. El retardo de este proceso es de 6 muestras.

A M P L 50 I T U D

1 0 0

O

- 5 0 I O C.1 0 . 2 0 . 3 0 .4 0 . 5

TIEMPO (SI

Figura 2.2.3 ECC después del filtro Pasa-Bajas

10

Page 10: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

2.2.1.2 FILTRO PASA ALTAS

El diseño del filtro pasa altas se basa en tomar como entrada la salida del filtro pasa bajas La ecuación diferencial es

y(nT) = 32x(nT- 16T)-[y(nT-T)+x(nT)-x(nT-32T)]

La frecuencia de corte de este filtro es aproximadamente de 5Hz , la ganancia es 32 y el retardo es de 36 muestras.

P I

T U D

- 5 0 O 0.1 0 . 2 0 . 3 0 . 4 0 . 5

TIEMPO ( s )

Figura 2.2.4 ECG después del filtro Pasa-Banda.

2.2.2 DERIVADOR

Despues del filtrado. la señal es diferenciada para proveer información acerca de la

La ecuación diferencial es pendiente del complejo QRS.

y(nT) = ( I/~T)[-~(~T-~T)-~-X(~T-T)+~X(~T+)~X(~T+~T)]

La respuesta en frecuencia de este derivador es entre dc y 30 Hz. Su retardo es de 2 muestras.

11

Page 11: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

2 i

D O

2 I L I

~~

O 0.1 0 . 2 0 . 3 0 . 4 0 . 5

TIEMPO ( s )

..

wv Y - -

Figura 2.2.5 ECG después del filtrado y la diferenciación.

3 A M P L 2 I T U D

1

o '

2.2.3 FUNCIÓN ELEVAR AL CUADRADO

Después de diferenciar, la señal es elevada al cuadrado punto por punto. La ecuación de esta operación es

y(nT) = [x(nT)I2

Esto hace a todos los puntos positivos y realiza una amplificación no lineal de la salida del derivador enfatizando las altas frecuencias

n

O 0.1 0 . 2 0.3 0 . 4 0.5

TIEMPO ( s )

Figura 2.2.6 Señal del ECG después de elevar ai cuadrado.

2.2.4 VENTANA DE INTEGRACIÓN

El propósito de la ventana de integración es obtener mformación acerca de la forma de onda. La ecuación para hacer este calculo es

y(nT) = (l/N)[x(nT-(N- 1 )TPx(nT-(N-2)T)+. . .+x(nT)]

donde N es el número de muestras que conforman el ancho de la ventana de integración. El número de muestras N de la ventana es importante, generalmente este ancho debe ser aproximadamente el

12

Page 12: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

mismo que el posible ancho del complejo QRS. Si la ventana es demasiado ancha, la forma de onda integrada unirá el QRS y la onda T. Si es muy estrecha, el mismo complejo QRS producirá varios picos en la forma de onda integrada.

0.8

0.6

0 . 4

0.2

O

O 0.1 0 . 2 0 .3 0.4 0 . 5

TIEMPO ( s )

figura 2.2.7 Señal después de la ventana de integración.

3 (W-QS)

Figura 2.2.8 Relación entre un complejo QRS y la forma de onda de la ventana de integración. (a) ECG . (b) Salida de la ventana de integración. QS: Ancho de RS. W: Ancho de la ventana de integración.

Punto Fiducial: El complejo QRS corresponde ai nivel ascendente de la forma de onda integrada. El tiempo

de duracih de &&o nivel es igual al ancho del complejo QRS. El punto fiducial para la localización temporal del Complejo QRS puede ser determinado de este nivel ascendente, marcándolo como la máxima pendiente o el pico de la onda R.

13

Page 13: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

2.2.5 AJUSTE DE UMBRALES .

Los umbrales son automaticamente ajustados para flotar sobre el nivel de ruido. El mayor de los umbrales es usado para hacer el primer análisis de la señal, el menor es usado cuando no se ha detectado un QRS en cierto intervalo de tiempo, de manera que la tknica de rebusque (searchback) es necesaria para poder determinar el complejo QRS. El conjunto de umbrales inicialmente aplicados a la forma de onda integrada es calculando de

SPKI = O . 125 PEAKI + O 875 SPKI

NPKI = 0.125 PEAKI + O 875 NPKI (si PEAKI es pico de señal)

(si PEAKI es pico de ruido) UMBRAL1 =NPKI + O 25 (SPKI - NPKI) UMBRAL2 = 0.5 UMBRAL 1

donde todas las variables se refieren a la forma de onda integrada.

PEAKI - pico total. SPKI - corrimiento estimado del pico de señal. NPKI - corrimiento estimado del pico de ruido. UMBRAL1 - primer umbral aplicado. UMBRAL2 - segundo umbral aplicado.

Un pico es un máximo detemunado cuando la señal cambia de dirección dentro de un intervalo de tiempo predefínido. El pico de señal SPKI es un valor que el algoritmo tiene ya establecido como un complejo QRS El pico de ruido NPKI es cualquier pico que no este relacionado con el complejo QRS @or ejemplo, la onda T). Los umbrales están basados en nuevos valores de las variables SPKI y NPKi, las cuales son calculadas en parte por su valor anterior.

Cuando un pico es detectado, pnmero debe ser clasificado como pico de señal o pico de ruido. Si es pico de señal debe exceder UMBRAL1 . El UMBRAL2 se aplica si la técnica de volver- a-buscar es requerida para encontrar el complejo QRS. Cuando un complejo QRS es encontrado usando el segundo umbral se da la siguiente igualdad.

SPKI = 0.25 P E N + 0.75 SPKI

2.2.6 AJUSTE. DE PROMEDIACION DE INTERVALO R-R

Se h a m dos promediaciones de intervalo R-R. La primer promediación es la media de los ocho intervalos R-R más recientes

RRAVERAGEI =0.125 (&-7+&4+ ...+RRn)

donde RR es el intervalo R-R más reciente.

dentro de ciertos límites La segunda promediación es la media de los ocho intervalos R-R más recientes que caen

RRAVERAGE2=O 125 ( R & - 7 + m n - 6 + ...+%)

14

Page 14: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

donde RR es el intervalo mas reciente que cae entre LIMITESUP y LIMITEINF Los límites son LIMITESU’ = 92% RR AVERAGE2 LIMITEN = 116% RR AVERAGE2 LIMITE = 166% RR AVERAGE2

Si el complejo QRS no es encontrado durante el intervalo especificado por LIMITE, el máximo pico encontrado entre los dos umbrales establecidos es considerado como un posible QRS.

2.2.7 IDENTIFICACI~N DE ONDA T

Cuando un intervalo es menor a 360 nis. se debe determinar si el complejo QRS actual fue correctamente identificado o si es realmente una onda T. Si la máxima pendiente que ocurre durante esta forma de onda, es menor a la mitad del QRS que lo precede, este es identificado como una onda T, de otra forma es considerado como un complejo QRS.

2.3 ALGORITMO BASADO EN PROMEDLACION

ECG’s de distintos pacientes frecuentemente presentan diferentes morfologías y periodos. El mismo paciente puede presentar señales anormales (por ejemplo extrashtole ventricular) que afectan fúertemente la localización del Punto Fiducial, estos factores mas la necesidad de tener un algoritmo capaz de correr en una computadora personal, operable en tiempo real, insensible a artefactos. 1 a fluctuaciones de la vaselina del ECG, con un bajo valor de interferencia y con la capacidad de detectar formas de onda diferentes al complejo QRS motivaron el desarrollo de este algoritmo (V. Barbaro, P. Bartohi , M. Fierli, 1990). 2.3.1 Descripción

El algoritmo se basa en un método de comparación de Patrón. Esto requiere el conocimiento de un complejo del ECG en el cual se calculan tres parametros característicos. Estos se comparan con los correspondientes que se calculan en el ECG. El punto fiducial es localizado en la posición Patrón el cual minimiza la diferencia entre estos parametros. El complejo E C G de referencia es escogido por el usuario por medio de dos ventanas Patrón (figura 1). El ancho y la posición recíproca de la ventana produce dos intervalos en la forma de onda con diferentes pendientes medias (en valor absoluto y/o signo). Los siguientes parámetros caracteristicos son calculados:

i

15

Page 15: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

PATRON

ventanal ventana2 1 \

n l r n2rn3r n4r

d l r = Diferencia cntre los valores de la señal,

d2r = Diferencia entre los valores de la señal,

avdr- Diferencia entre los valores medios de las

localizados en los extremos de la ventana 1.

localizados en los extremos de la ventana 2.

muestras dentro de la ventana 2 y estos dentro de la ventana 1.

Sobre la señal del ECG, los mismos parametros dl(n), d2(n) y avd(n) son calculados (figura 2). Para comparar estos parámetros, dos funciones son usadas:

1. Función de Habilitación en(n): Es una función binaria que toma un valor de cero solamente cuando la razón [dl(n)-dlr]/dlr y [d2(n>d2r]/d2r, son menores que un valor pre-est ablecido.

2. Función de error de Alineación efln): Es la diferencia normalizada entre avd(n) y avdr.

La "posición óptima" del patrón es determinada encontrando el valor más bajo de la función de error de alineación entre cada intervalo donde la función de habilitación es cero, veriñcando que este mínimo es inferior a un umbral. Esta posición localiza el punto fiducial en el ECG.

16

Page 16: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

I

PATRON / \ h

ventana2

n i r "'n3r n4r

2.3.2 Paso de precorrimiento Dos intervalos de referencia de la señal del ECG son definidos sobre el complejo de

interes por medio de cuatro cursores. Las señales dentro de estos intervalos debe tener diferentes pendientes medias (ver figura 1).

Los siguientes parametros característicos son calculados sobre los mtervalos de referencia seleccionados:

d l r = s(n2r>s(nlr) d2r = s(n4r)-s(n3r)

n4r n2r

k=n3r+ 1 k=nlr+l avdr=(l/Sn34 c s(k) - (1/Sn12) C s(k)

17

Page 17: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

donde: 61112 = n2r-nlr 6n34 = n4r-n3r s(k) = kth muestra de laq señal

Además, un factor de normalización (norm) es calculado para ser usado durante el paso de corrimiento cuando se defina la fruición de error de alineación.

n4r- 1 n2r- 1

k-3 r k=nlr norm = abs{( 1/6n34) s(k) - (1/6n12) C s(k)

[(1/6n34) s(k)-( 1161112) C 491 1 n4r n2r

k=n3r+ 1 k=nlr+l

norm = abs{ - (d2d6n34) + (d 1 r/6n 12))

2.3.3 Paso de Corrimiento

Las ventanas Patrón (Temp1ate)se corren a lo largo del ECG, y para cada posición Patrón (Template), convencionalmente determinada por la abscisa n4 (de aquí en adelante referida como n), los siguientes \.alores son calculados:

dl(n) = s(n2)-s(nl) d2(n) = s(n>s(n3)

n n-6n24 ~

k=n-6n34+ 1 k=n-6n14+1 avd(n)= (1/6n34) s(k) - ( 116~~12) c s(k)

Donde: 61114 = n-nl = n4r-nlr 61124 = n-n2 = n4r-n2r

.

En base a estos valores las siguientes funciones son calculadas:

i) en(n): Función de Habilitación

en(n) = O si abs{ [dl(n>dlr]/dlr} Ó DTOL Y abs{ [d2(n)-d2r]/d2r) Ó DTOL

en(n) = 1 Otro caso

18

Page 18: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

Donde DTOL es la tolerancia relativa de las b c i o n e s dl(n) y d2(n), con respecto a los valores de referencia correspondientes (d l r y d2r), los cuales determinan la sensibilidad del algoritmo. Los valores típicos de DTOL están entre O. 1 y 0.4.

ii) efln): Función de Error de Alineación e@n) = abs { avd(n)-avdr}/norm

El factor de normalización (norm) es introducido para hacer a e q n ) adimensional. La Función e@n) esta defkida siempre que las pendientes determinadas por las ventanas sean diferentes.

La “Posición óptima” y el correspondiente punto fiducial están determinados por los algoritmos ya descritos. Las figuras 2.3.1 y 2.3.2 muestran cómo funciona el algoritmo.

. . . .

; ; ; prueba $ -0.8 -0.4 I I I A nl n2n3 n 4 posición Óptima

F A : ,

E n[rnuestra]

B

E R R O R D E

O N mv m v : ‘-2r I I I I -1.6

I I I I I I I I -0.4 5 -0.8

Ii 1;1 n E h n14 posición óptima AI

- O N D A

I

n(rnuestra]

B

Figura 2.3.1 Figura 2.3.2

Este algoritmo fue diseñado por V. Barbaro, P. B a r t o h , M. Fierli en 1990 y publicado por la revista Medical and Biological Enginnering and Computation en 1991. Fué hecho para ser usado en el Proceso de Promediación de señales Electrocardiográñcas. E s un método capaz de diferenciar artefactos de la señal de interés (por ejemplo, la extrasístole ventricular del complejo QRS). Favoreciendo la especificidad y la exactitud sobre la sensibilidad. Su sensibilidad puede ser variada por el parámetro DTOL. En conclusión, la adopción de un Patrón de Doble-Ventana, seleccionada en el paso de Precorrimimto, permite la adaptación del algoritmo a morfologías específicas de cada paciente. Por lo tanto esto hace posible la sincronización en ondas distintas al complejo QRS (Onda P, T, etc), abriendo el camino a estudios electro fisiológicos adicionales.

19

Page 19: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

SECCIÓN 3

3.1 ESPECTRO DE POTENCIA

Una vez que se obtuvieron los intervalos R-R por medio del detector QRS, se checan y corrigen si es necesario. Una variedad de técnicas en el dominio del tiempo y de la frecuencia pueden ser usadas para proveer los índices HRV. Las mediciones standandard en el dominio del tiempo incluyen la Media y la Desviación Standard de los intervalos R-R. En el analisis en el dominio de la frecuencia se puede aplicar la medición de la velocidad instantánea del corazón dada por la simple fórmula:

velocidad instantánea = 1/ RRI

donde RRi representa el intervalo RR sucesivo Esta fórmula no es la representaciÓn de la velocidad del corazón, dado que es una función discreta Además, la ecuación inversa del intervalo RR puede proveer solamente un valor de velocidad para cada latido, representando la correspondiente velocidad al latido previo. Para un análisis espectral, una función continua en tiempo es preferible que una función discreta. La estimación espectral puede ser aplicada a la velocidad del corazón , como ilustra la figura 3.1.2.

20

Page 20: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

LatidodSeg.

1.27 I Velocidad Instantánea del corazón

0.90 1-02 I O 1 O 0 200 300 400

Segundos

(Latidos/Seg .) Hz

5\ i

0.0 o. 1 0.2 0.3 0.4 0.5

Frecuencia (Hz)

Figura 3.1.1 Análisis de la variabilidad de la velocidad del corazón.

Un análisis standard de Fourier (por ejemplo, la descomposición de una señal en sinusoidales), no es posible para una serie de eventos. Por la tanto, el espectro de potencia para tales series debe der descrita en forma diferente. En el estudio de HRV los siguientes puntos son utilizados para obtener un concepto útil del espectro de un proceso.

1 ) Una señal que está definida en todo tiempo se deriva como una serie de eventos (Figura 3.1.1a). Existe la posibilidad de transformarla en una señal que representa la razón de la velocidad del corazón (Figura 3.1. lb). El espectro de la señal es estimado por muestras equidistantes seguidas por una transformada discreta de Fourier. Una desventaja de este método es que las señales deducidas a partir de una serie de eventos, frecuentemente son no diferenciables y algunas veces no son continuas.

21

Page 21: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

I.

d

En la literatura sobre procesos estocasticos, se definen dos tipos de espectros. Ambos espectros son usados en el estudio del HRV y son discutidos a continuación.

2) Espectro de intervalos (Interval Spectrum). Es el espectro de la serie de intervalos equidistantemente separados (Figura 3.1. lc). Como la serie de intervalos está en función del nútnero de intervalos y no del tiempo, el espectro no puede interpretarse directamente en términos de la frecuencia. La relaciótl de éste espectro con la frecuencia está descrito en [13].

3) Espectro de Cuenta (Spectrum of counts). Es también usado en el análisis estático de la sene de eventos. Este espectro puede ser estimado por un cálculo directo del espectro de la señal (Figura 3.1. Id) donde los eventos (Figura 3 I 1 a) son reemplazados por funciones delta .

ECG

I I I I I I 1 I I I

to t l t2 t3 t4

b

C I

1 2 3 jK

to 11 12 t3

tiempo

Figura 3.1.2 (a) Sene de eventos que representan la onda R de un ECG. (b) Señal que representa la razón de la velocidad del corazón derivada de la serie de eventos de la figura 3.1.2a. (c) Sene de intervalos derivada de la figura 3.1.2a La transformada discreta de Fourier es una estimación para el espectro de intervalos (Interval Spectrnm). (d) En esta figura, los eventos de la figura 3.1.2a son reemplazados por funciones delta; El espectro de esta señal es el espectro de cuenta (Spectrum of Counts).

EL espectro de intervalos tiene l a ventaja de ser calculado directamente con técnicas FFT standard; el espectro de cuenta requiere de programas especiales de cálculo. En nuestro caso se optó por el espectro de intervalos debido a la facilidad de los cálculos.

22

Page 22: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

SECCIÓN 4

4.1 PROGRAMA DE APLICACI~N

El programa de aplicación que a continuación se describe esta diseñado para utilizar todas las funciones de los grupos de bibliotecas, implementadas como objetivo primordial de este proyecto.

La aplicación comienza con el despliegue de un menu de tipo Roil Scroll contigurando el

El primer menú presentado contiene las siguentes opciones: monitor en modo gráfico con la función de aplicaaón "IniGraf".

"Leer el archivo que contiene la señal". ECG SALIR. "Salir al sistema"

Si la opción elegida fue ECG, se despliega un segundo menú el cual presenta las opciones

"Detectar los intervalos R-R (método de filtrado y derivada)". "Detectar los intervalos R-R (método de punto fiducial)".

para detectar los intervalos RR por dos metodos diferentes. QRS FID SALIR "Salir ai menú pnncipal".

Una vez que se ha terminado con la detección es presentado un menú con las opciones para desplegar cualquiera de las gráficas (tiempo,espectro de potencia o histograma).

ESP "Obtener espectro de potencia". HIS TIEM "Grafica de tiempo de duración de cada intervalo R-R. Salir "Salir al menu pnnapal".

"Obtener histograma de los intervalos R-R".

Si se elige la Opción ESP. inmediatamente después es desplegado un menú para elegr si el espectro sera calculado por Transformada Discreta de Fourier o por Transformada Rápida de Fourier.

TDF TRF SALIR "Salir al menú antenor".

"Calcula espectro por Transformada Discreta de Fourier. "Calcula espectro por Transformada Rápida de Fourier.

A continuación se describe con más profundidad la forma que se utilizan las funciones y bibliotecas para cada una de estas aplicaciones.

Opción ECG

Se lee el nombre del archivo donde se encuentra la señal, así como la ruta de acceso si es que

Después de obtener el nombre del archivo se reinicializan algunas variables giobales, esto se existe. El nombre del archivo así como la ruta de acceso quedan contenidos en un apuntador .

realiza con el llamado auna función sin parámetros de nombre "Reinicializa".

23

Page 23: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

Opción QRS

En esta opción se hace un llamado a la función de aplicación "DetecQRS" cuyo objetivo es obtener la detección de los intervalos R-R de toda la señal bajo el método de filtros y primera derivada. Lleva como parametros la cadena que contendrá los intervalos R-R detectados 'WRR", el número de datos que se van a procesar y el apuntador al arreglo de enteros que contiene los datos de la señal. Para una mejor descripción de esta función se incluye el &digo que se explica línea a línea.

Código de la función de aplicación "DetecQRS".

1 .- LPF(LongCad,Y); 2 .- HPF(LongCad,Y); 3 .- Derivacion(LongCad,Y); 4.- VenIntegracion(LongCad,Y); 5.- Veri( 150,100,6 12,26O,Y,NULL,NULL,O);

iqbandesc! = 1 )

setviewport(8,179,112,352,1); DeshaceVentO;

6.- IntervalosRR(Y,LongCad,intRR3);

En la líneas 1 , 2 ,3 y 4 se hace llamado a !asfunciones de biblioteca LPF, HPF, Derivacion, Venlntegrucion correspondientemente (ver apéndice B).

La línea 5 hace llamado a la función que muestra la señal en pantalla y poder modificar su amplitud. Si no se oprime la tecla ESC (bandesc=l) en esta etapa del programa, se puede proceder a detectar los intervalos.(Lhea 6).

Opción FID

En esta opción se hace un llamado a la función de aplicación "mide" cuyo objetivo es obtener la detección de los intervalos R-R de toda la señal bajo el método punto fiducial. Lleva como parametros la cadena que contendrá los intervalos R-R detectados "IntRR" y el nombre del archivo que contiene la señal. Para una mejor descripción de esta función se incluye el código que se explica línea a línea.

Código de la función de aplicación "mide".

Long = (int) Longitud2-133; 1 _- Y 1 = (int *) malloc(Long*sizeof(int)); 2.- flushall(); 3.- fread(Y1 ,sizeof(int),Long,ApArch-ECG);

DeshaceVent(); if (flag = '1')

24

Page 24: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

1.- LPF(LongY1); 5 _- HPF(Long,Y 1);

cad[O] = ' I " ;

LimExplica( 150,55,15,10,6 1,26,mensajes,7,cad,2 10,30); }

i f (flag != '2') 5.- Ven( 150,100,6 12,26O,Yl,&ent,&ent 1 ,flag);

i f (flag = ' 1' && bandesc = O) c 1 if (flag = '2' && bandesc = O) {

7.- Fiducial(ent1 ,ent,FM,Long,Y 1 ,Inter-Qrs);

cad[()] '"'. LimExplica( 130,55.15,10,61,26,mensajes,6,cad,210,30);

8.- DetecQRS(Long,inter-Qrs,Y 1);

9.- free(Y1); 1

1 O .- fclose(ApArch-ECG);

De las líneas 1 a 3 no se utiliza ninguna función de aplicación ni de biblioteca, en estas líneas se genera simplemente un arreglo de enteros donde se encuentran los datos de la señal a procesar. El arreglo tiene un apuntador por el cual se a c m a a los datos.

En las líneas 4 y 5 se hace llamado a las funciones de biblioteca LPF y HPF que juntas aptican un filtro pasa banda.

En la línea 6 se hace el llamado a la función de aplicación "Ven" la cual despliega en pantalla el ECG (Electrocardiograma) a procesar para seleccionar un complejo QRS patrón. El complejo QRS se utiliza para realizar la detección de los intervalos R-R bajo el método de punto fiducial. Los parámetros de esta función son: Los pnmeros 4 definen los límites de la ventana de la siguiente forma extremo izquierdo, extremo superior, extremo derecho y extremo inferior; apuntador a la cadena de enteros que definen al ECG, apuntador a la posición izquierda, dentro de la cadena de enteros del ECG, que define al complejo QRS patrón elejido, apuntador a la posición derecha, dentro de la cadena de enteros del ECG, que define al complejo QRS patrón elejido. Los dos Últimos parámetros son parametros de salida que acupa la b c i Ó n a la que se llama en la línea 7.

En la linea 7 se hace llamado a la función de biblioteca Fiducial (ver apéndice B) la cual genera el arreglo donde se encuentran los intervalos R-R detectados bajo este método.

La línea 8 llama a la función de aplicación DetecQRS la cual fue definida en la Opción QRS. En las líneas 9 y 10 se libera el bloque de memoria que se requirió en la línea 1 y se cierra el

archivo donde se encuentra el ECG correspondientemente

d) ESP

i

En esta opción se hace un llamado a la función de aplicación "CalTDSF" cuyo objetivo es desplegar el espectro de potencia de la señal procesada. Lleva como parametro la cadena que d e n e los intervalos R-R detectados "IntRR" Para una mejor descripción de esta función se incluye el &digo que se explica línea a línea.

25

Page 25: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

Código de la función de aplicación "CalTDSF".

do { Finventana(); Fondo(); RR = Ap-RR; opcion = PresentaMenu(ven4,ExpliVen4,10.20); switch(opci0n) { case O:

maserror( 4);

break; case 1 : menserror(4);

1 .- TDF(IntRR0,TabCompO); /**** DISCRETA DE FO JRER *I

2.- n = ObtenLog(Ap_RR,2); /*** Tranfomada Rapida de Fourier ***/ 3 .- PasaReal-CompReal(n,IO.TabCompO); 4.- FFT(TabComp0,n);

break; default: break;

} i f (opc ion4 1 1 opcion=l) {

5 . - { closegraph(); prinfl"Error: not enough heap space in save-screen().\n"); exit( 1); 1

if ((Yf = (int *) malloc((Ap-RR )*sizeoflint))) =NULL)

5 . - fignEspec(TabComp0, Y 0, 7- GraficaTren(Yf,O. l , l ,XX,W),

free(Yf); Ponerunidades( 1); menserror(5); gdch0; 1 Ap-RR = RR; }while(opcion4 1 1 opcion=l);

;.- free(Yf); }

En esta función se puede obtener 13 transformada rápida de Fourier (FFT) o la t r m f o m a h hscreta de Fourier (TDF).

En la línea 1 se hace llamado 3 1 . 1 m ~ ~ ó ~ de biblioteca TDF obteniendo así el calcdo de la Tranfomada Discreta de Fourier (ver npcii6íicc B)

26

Page 26: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

En la linea 2 se hace llamado a la jhnción de biblioteca ObtenLog para obtener un parámetro (ver apénidice B) que se utilizará en la función que se llama en la línea 3 y en la función que se llama en la línea 4.

En la línea 3 se hace llamado a una función de aplicación que genera un arreglo de números complejos a partir de una de números reales, la parte imaguiaria del arregio de los númeios complejos es puesta a cero. Esta función regresa este arreglo de números complejos para utilizarlo en la función que se llama en la línea 4.

En la línea 4 se hace llamado a la función de biblioteca FFT para ontener la Transformada Rápida de Fourier (cuyo acrónimo en ingles es FFT).

La línea 5 está conformada de un condicional "if' en el que se asigna un bloque de memoria a un apuntador, el cual es uno de los parametros de la función que se llama en la línea 6. Sí no hay suficiente memoria para asignarle al apuntador, se despliega el mensaje de error correspondiente y la ejecución del programa se aborta en ese momento.

En la línea 6 se hace llamado a la .función de biblioteca MagniEspec (ver apendice B) la cual lleva como parametros el arreglo de numeros complejos que conforman la transformada de Fourier y el apuntador al bloque de memoria el cual contendrá la magnitud de la transfomada de Fourier, que se calcula en esta función mencionada.

En la línea 7 se hace llamado a la función de aplicaciÓn GraficaTren (se describe a continuación) para desplegar la gráfica del espectro de potencia de la señal. Los parámetros de esta función son: Apuntador a la cadena de enteros que se desplegarán, Valor que contendrá la primera división del eje de las ordenadas, factor con el que se irá incrementando las subsecuentes divisiones del eje de las ordenadas y los dos Últimos parametros corresponden a la posición donde se desplegará la gráfica.

En la línea 8 se libera el bloque de memoria que se asignó al apuntador Yf.

En la función CalTDSF se hace llamado a la función de aplicación GráfícaTren para su mejor descripción, se explica a continuacion l inea a línea.

Código de la funcion de aplicación "GraficaTren".

1 - MmmoMaximo( Ap Cadena, Ap- RR. &MenY, &MayY); 2 - LlenaCadenas( MenY,MayY, Valorxh, CadEntX,CadEntY,factor); 3 - RealACads(CadEntX,CadEntY,VaIoresX,ValoresY); 4 - Dibuj~jes(Va~oresX,Va~oresY,2 5,2 50); 5 - üraficaLin(ApCadena,Ap_RR,MenY,MayY,27,250);

En la línea 1 se hace llamado a la finción de biblioteca MinimoMaximo (ver apéndice B) en la cual se obtendrá el valor mínimo y el valor máximo del arreglo de números que se desplegarán en la gráfica. Los valores mínimo y máximo se utilizan en la línea 2 y en la línea 5 como parámetros de las funciones que se mandan llamar.

En la línea 2 se hace llamado a l a función de aplicación LlenaCadenas, esta función tiene los siguientes parámetros: Valor máximo del arreglo de números a desplegar, valor mínimo del arreglo de números a desplegar, valor que contendrn la primera división del eje de las ordenadas, apuntador al arreglo de valores de tipo real que son los dores de las divisiones del eje ordenado,

27

Page 27: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

apuntador al arreglo de valores de tipo real que son los valores de las divisiones del eje abciso, factor con el que se irá incrementando las subsecuentes divisiones del eje de las ordenadas. Esta función generá dos cadenas con los valores correspondientes a las diviciones de los ejes de la gráfica del espectro de potencia de la señal, los apuntadores a estas cadenas se utilizan como parámetros de la siguiente función que se llama en la línea 3.

En la línea 3 se hace el llamado a la JUnciÓn de biblioteca ReaZACak (ver apéndice B), la cual convierte dos arreglos de valores reales a dos arreglos de cadenas de caracteres, esto para tener en forma de cadena de caracteres los valores de las diviciones de los ejes de la gráfica del espectro de potencia de la señal.

En la línea 4 se hace el llamado a la función de biblioteca DibujaEjes (ver apéndice B), para dibujar los ejes de la gráfica del espectro de potencia con sus correspondientes diviciones.

En la línea 4 se hace el llamado a la fitnción de biblioteca G r a j c d i n (ver apéndice B), para desplegar la gráfica del espectro de potencia en forma de línea continua.

e) HIS

En esta opción se hace un llamado a la función de aplicación "Histograma" cuyo objetivo es desplegar un histogama del porcentaje de los intervalos R-R detectados que tienen un tiempo de duración dado (el tiempo está en milisegundos) Lleva como parametro la cadena que contiene los intervalos R-R detectados "IntRR" Para una mejor descripción de esta función, se incluye el &go que se explica línea a línea

Código de la funcion de aplicación "Histograma".

1 .- CuentaValores(IntRR,Valores). 2.- MinimoMaximo(Valores,26,&min.&max); 3 .- LlenaCadenas(O,rnax,5O,CaáEn~Y,CadEntY, 1); 4.- RealACads(CadEntX,CadEntY,ValoresX,ValoresY); - 5 _- LlenaCadena(Va1oresX); 6 _- DibujaEjes(ValoresX,ValoresY ,25,250); 7 .- GraficaBarras(Valores,max,9,3 ).

En la línea 1 se hace el llamado a la función de aplicación Cuentavalores, esta función genera un arreglo el cual contiene que porcentaje del total de los intervalos R-R detectados estan dentro de un intervalo de tiempo de duración, a cada posición del arreglo le corresponde un intervalo de tiempo dado.

En la línea 2 se hace llamado a la finción de biblioteca MinimoMavimo (ver apéndice B) en la cual se obtendrá el valor mínimo y el valor máximo del arreglo de números que se desplegarán en la gráfica. Los valores mínimo y maximo se utilizan en la línea 2 y en la línea 5 como parámetros de las funciones que se mandan llamar.

En la línea 3 se hace llamado a la función de aplicación LlenaCadenas, esta función tiene los siguientes parámetros: Valor maximo del arreglo de números a desplegar, valor mínimo del arreglo de números a desplegar, valor que contendra la pnmera división del eje de las ordenadas, apuntador al arregio de valores de tipo real que son los valores de las divisiones del eje ordenado,

28

Page 28: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

apuntador al arreglo de valores de tipo real que son los valores de las divisiones del eje abciso, factor con el que se ira incrementando las subsecuentes divisiones del eje de las ordenadas. Esta función generá dos cadenas con los valores correspondientes a las diviciones de los ejes de la gráfica del espectro de potencia de la señal, los apuntadores a estas cadenas se utilizan como parámetros de la siguiente función que se llama en la línea 4.

En la línea 4 se hace el llamado a la jknción de biblioteca RealACads (ver apéndice B), la cual convierte dos arreglos de valores reales a dos arreglos de cadenas de caracteres, esto para tener en forma de cadena de caracteres los valores de las diviciones de los ejes de la gráfica del espectro de potencia de la señal.

En la línea 5 se hace el llamado a la función de aplicación Llenacadena, la cual genera una cadena de valores fijos los cuales serán los que contendrán las diviciones del eje de las ordenadas.

En la línea 5 se hace el llamado a l a finlción de biblioteca Dibujaqes (ver apéndice B), para dibujar los ejes de la gráfica del htstograma con sus correspondientes diviciones.

En la línea 7 se hace el llamado a la función de biblioteca GraficaBarras (ver apéndice B) que despliega una gráfica de tipo barras que representa un htstograma.

f ) TIEMP

En esta opción se hace un llamado a la función de aplicación "GraficaTiempo" cuyo objetivo es desplegar una grafica del tiempo de duración de cada intervalo R-R detectado en milisegundos. Lleva como parametro la cadena que contiene los intervalos R-R detectados "IntRR". Para una mejor descripción de esta función, se incluye el código que se explica línea a línea.

Código de la funcion de aplicación "GraficaTiempo".

I I 1 - GraficaTren(ApCadena,50,5), 2 - MrumoMaxlmo(ApCadena, Ap-RR, &MenY,&MayY), 3 - outtextxy(200,60,WR mmmo = "), 4 - outtextxy(3 20,60,itoa(MenY *VE LMUEST,cad, 1 O)), 5 - o~1ttextxy(200,50,"RR maxlmo = 'I),

6 - outtextxy(320,5O,itoa(MayY*WLM~ST,cad, lo)), 7 - outtextxy(200,7O,"RR promedio = "1, 8 - outtextxy(320,70,itoa(Promedio( ApCadena, Ap-RR)*VELMüEST,cad, lo)),

En la línea 1 se hace llamado a la fwición de aplicación GraficaTren (Esta función se describe en el inciso d) ) para desplegar la gráfica del tiempo de duración ( en miliseg. ) de cada intervalo R-R detectado. Los parámetros de esta función son: Apuntador a la cadena de enteros que se desplegarán, Valor que contendrá la primera división del eje de las ordenadas (valores en miliseg.) y factor a n el que se irá incrementando las subsecuentes divisiones del eje de las ordenadas.

En la línea 2 se hace llamado a la fitnción de biblioteca MinimoMaximo (ver apéndice B) en la cual se obtendrá el valor mínimo y el valor máximo del arreglo de números que se desplegarán en la gráfica. Estos valores se obtienen para desplegar su valor como datos adicionales a la gráfica.

Las líneas de la 3 a la 8 despliegan datos adicionales a la gráfica como son: valor del tiempo (en milisegundos) de duración del internalo R-R máximo, valor del tiempo (en milisegundos) de

29

Page 29: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

I

duración del intervalo R-R mínimo y valor del tiempo (en milisegundos) promedio de duración de todos los intervalos R-R detectados.

Opción Salir

Esta opción termina con la ejecución del programa de aplicación, dejando el modo gráfico original del monitor con la función de aplicación "CierraGraf".

30

Page 30: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

ABENDICE A

En esta sección se describe el tipo de archivos que pueden ser leidos así como las características de la señal que será procesada.

DESCRIPCI~N DE ARCHIVOS

Los archivos que contienen al ECG digtalizado tienen las siguientes características 1 - El archivo debe ser de tipo binano 2 - El tamaño máximo puede ser hasta de 4 GBytes Pari que el análisis en frecuencta de los mtervalos

El tamaño máximo de los archivos R-R sea confiable, se requiere un mininio de 500 mtervalos R-R [l] p e m t e analizar ECGs que contengan mucho mas de 500 intervalos R-R

DESClUPCIÓN DE LA SEÑAL

La señal original (ECG) estará contenida en un archivo de disco con las siguientes Características:

1.- Los datos que contiene el archivo serán leídos como enteros con signo (2 bytes), cada entero representa el valor de la señal maestrada en un instante de tiempo. Esto está basado en que la mayoría de los Convertidores halógico-Digital (.4DC) generan datos de tipo entero de 16 bits (2 bytes), por lo tanto cada dato de la señal debe estar contenido en el archivo como un entero de 2 bytes. Ver Fig. 1.

3 1

Page 31: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

0 0 0 0 2 5 8 10 13 14 14 14 12 11 9 7 5 4 2 1 1 O0 1 1 1 1 1222 3 3 3 3 3 3 3 3 3 3 6 11 20 33 51 72 91 103 105 96 77 53 27 5 -1 1 -23 -28 -28 -23 - 28 -28 -23 - 17-10-5-1-0121 1110000000000001 12233445678891010 1 1 1112 12 12 13 14 16 182022242729313437 3942444749 52 54 55 56 5757585857575756565452 504743 40 3633 2923 20 17 14 12 10 8 7 5 321 10000

Figura 1. Dos representaciones de un Electrocardiograma. (a) Arreglo de números enteros que representan valores de amplitud como una función del tiempo. (b) Variación en el tiempo de la forma de onda.

Esta representación numénca del ECG es ilamada SEÑAL DIGITAL. En [2] menciona que después de años de experiencia en aprender las caractensticas de estas señales, la representación numérica de este tipo es particularmente buena al analizar su forma de onda analógm y deducir si tales señales son normales o anormales.

2.- La frecuencia a la que debe ser maestreada la señal es variable.

32

Page 32: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

I - -7

APENDICE B I

En esta sección se describen las funciones que serán Mplementadas, especificando el objetivo, tipo de entradas, prototipo, tipo de salidas y una descripción general para cada una de eiias.

1 Funciones que corresponden al procesamiento de una I señal digital. I

FUNCI~N: LPF

PROTOTPO: void LPF(int LongCad, irit *Y1)

OBJETTVO: Manda los datos de tipo entero, que están Contenidos en una cadena (en forma secuencial) a la función que realiza un filtro Pasa-Bajas, para así obtener estos datos filtrados.

ENTRADA: 1 _- Apuntador a una cadena de enteros 2.- Longitud de la cadena.

SALIDA: Apuntador a una cadena de enteros

OBSERVACIONES: El apuntador a la cadena de enteros es el mismo tanto para la entrada como para la salida.

FUNCIÓN: FiltroPasaBaja.

PROTOTIPO: int FiltroPasaBaja(int Dato)

OBJETIVO: Realiza el filtrado de la señal dato a dato, utilizando un arreglo en el cual guarda datos procesados anteriores al dato actual.

ENTRADA: Dato a procesar de tipo entero con signo.

SALIDA: Dato procesado retornado por la función misma.

OBSERVACIONES: Utiliza variables estáticas para conservar valores que Utilizara en su próximo acceso. La función puede ser utilizada para procesar datos en tiempo real. Esta función esta implementada y descrita ampliamente en [3].

33

Page 33: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

FUNCIÓN: HPF.

PROTOTIPO: void HPF(int LongCad, int *Y 1)

OBJETIVO: Manda los datos que están contenidos en una cadena (en forma secuencial) a la función que realiza un filtro Pasa-Altas, para así obtener estos datos filtrados.

ENTRADA: 1 .- Apuntador a una cadena de enteros 2.- Longttud de la cadena.

SALDA: Apuntador a una cadena de enteros

OBSERVACIONES: Nótese que el apuntador a la cadena de enteros es el mismo tanto para la entrada como para la salida.

FUNCIÓN: FiltroPasaAita.

PROTOTIPO: int FiltroPasaAlta(int Dato)

OBJETIVO: Realiza el filtrado de la señal dato a dato, utilizando un arreglo en el cual guarda datos procesados anteriores al dato actual.

ENTRADA: Dato a procesar de tipo entero con signo.

SALIDA: Dato procesado retornado por la función misma.

OBSERVACIONES: Utiliza vanables estáticas para conservar valores que utilizara en su próximo acceso. La función puede ser utilizada para procesar datos en tiempo real. Esta función esta implementada y descrita ampliamente en [3].

FUNCIÓN: Derivacion

PROTOTIPO: void Derivacion(int LongCad, int *Y 1 ).

OBJETNO: Manda los datos que estan contenidos en una cadena (en forma secuencial) a la función que realiza una Derivación, para así obtener estos datos derivados.

ENTRADA: 1 .- Apuntador a una cadena de enteros 2.- Longitud de la cadena.

SALIDA: Apuntador a una cadena de enteros

OBSERVACIONES: Nótese que el apuntador a la cadena de enteros es el mismo tanto para la entrada como para la salida.

34

Page 34: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

FUNCIÓN: Deriva

PROTOTIPO: int Deriva(int Dato).

OBJETíVO: Realiza la derivación de la señal dato a dato, utilizando un arreglo en el cual guarda datos procesados anteriores ai dato actual.

ENTRADA: Dato a procesar de tipo entero con signo.

SALIDA: Dato procesado retornado por la función misma.

OBSERVACIONES: Utiliza variables estáticas para conservar valores que utilizara en su próximo acceso. La función puede ser utilizada para procesar datos en tiempo real. Esta función esta implementada y descrita ampliamente en [3].

FWNCIÓN: VenIntegracion.

PROTOTIPO: void VenIntegracion(int LongCad, int *Y 1).

OBJETIVO: Manda los datos que están contenidos en una cadena (en forma secuencial) a la h c i ó n que realiza un filtro Pasa-Bajas, para así obtener estos datos filtrados.

ENTRADA: 1 _- Apuntador a una cadena de enteros 2.- Longitud de la cadena.

SALIDA: Apuntador a una cadena de enteros.

OBSERVACIONES: Nótese que el apuntador a la cadena de enteros es el mismo tanto para la entrada como para la salida.

FUNCIÓN: Integra

PROTOTIPO: int Integra(int Dato)

OBJETIVO: Realiza la integración de la señal dato a dato, utilizando un arreglo en el cual guarda datos procesados anteriores al dato actual.

ENTRADA: Dato a procesar de tipo entero con signo

SALIDA: Dato procesado retornado por la función misma.

OBSERVACIONES: Utiliza variables estáticas para conservar valores que utilizara en s u próximo acceso. La función puede ser utilizada para procesar datos en tiempo real. Esta función esta implementada y descrita ampliamente en [3].

35

Page 35: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

FUNCIÓN: DetecPico.

PROTOTIPO: int DetecPico(int j , h t *Yp,float Umbral)

OBJETIVO: Verifica si el valor en cierta posiciÓn, dentro de una cadena, es un pico. Esto se logra calculando la pendiente bajo la fórmula de dos puntos (Pendiente-y22-~1/~2-~1), uno de los puntos es la posición en el arregio con su correspondiente valor y el segundo punto es algunas posiciones mas adelante. SegUn [3], existe un pico cuando hay un cambio de pendiente. Este cambio se da cuando se cumplen las siguientes condiciones, el valor de la pendiente correspondiente a la posición anterior es mayor que cero y el valor de la pendiente correspondiente a la posición actual es cero.

ENTRADA: 1 .-Posición en la cadena del valor que se está verificando. 2.- Apuntador a la cadena de enteros. 3.- Límite que debe superar el valor que se esta verificando.

SALIDA: Valor del pico detectado retornado por ia función misma. Esta valor es de tipo entero

FVNCIÓN: Calpendiente.

PROTOTIPO: int CalPendiente(int j, int *Yp) OBJETiVO: Calcula la pendiente por medio de la fórmula Pendiente = y2-y1 / x2-xl. Uno de los puntos es la posición en una cadena con su correspondiente valor y el segundo punto es algunas posiciones atrás.

ENTRADA: 1 .- Posición en la cadena 2.- Apuntador a la cadena de enteros

SALIDA: Valor de la pendiente retornado por la función misma.

FUNCIÓN: Umbrales.

PROTOTIPO: void Umbrales(short int NumUmbra1,int PicoSena1,int PicoRuido ,float *Umbral 1 ,float *Umbral2,float *Umbral3)

OBJETIVO: Ajusta los umbrales dependiendo del valor del Último pico de señal o de ruido [3]. ENTRADA: 1 .- Número que identifica el umbral que debe ser ajustado, este número es de tipo entero corto ya que solo tomará los valores de 1 para umbral 1 o 2 para umbral2. 2.- Valor del pico máximo de la señal. 3 . - Valor del pico máximo de mido.

SALIDA: 1 .- Valor ajustado del umbral 1 2.- Valor ajustado del umbral 2. 3 .- Valor ajustado del umbral 3.

36

Page 36: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

FUNCIÓN: Limitesm.

PROTOTIPO: void LimitesRR(int Arregint[], int Promedio).

OBJETIVO: Ajusta los promedios correspondientes a los límites de los intervalos R-R [3]

ENTRADA: 1.- Arreglo que contiene los intervalos R-R detectados hasta el momento. Los datos que contiene dicho arreglo son de tipo entero y corresponde al número de muestras que tienen de separaaon dos complejos QRS continuos. 2.- Promedio de los Últimos 8 intervalos R-R detectados [3].

SALIDA: Promedio ajustado de los Úitimos 8 intervalos R-R detectados

OBSERVACIONES: Si se quiere obtener el valor del intervalo R-R en tiempo, se multiplica dicho valor por la velocidad de muestreo.

FUNCIÓN: IntervaiosRR.

PROTOTIPO: void IntervalosRR(int*Y ,int LongCad,int *IntRR)

OBJETIVO: Obtiene los valores de los intervalos R-R.

ENTRADA: 1 .-Apuntador a la cadena de enteros. 2.- Longitud de la cadena. 3.- Apuntador al arreglo que contiene los intervalos R-R detedados hasta el momento.

SALIDA: Apuntador al arreglo que contiene los intervalos R-R detectados.

OBSERVACIONES: Nótese que el arreglo que contiene los intervalos R-R es el mismo tanto para la entrada como para la salida.

FUNCIÓN: TDF.

PROTOTIPO: void TDF(int *ArrInt,stnid Complejo TabComp[TAMCADRR])

OBJETIVO: Realiza la Transformada Discreta de Fourier de un arreglo de enteros.

ENTRADA: Arreglo de datos de tipo entero

SALIDA: Arreglo de estructuras que contienen datos complejos.

F U N C I ~ N : er-c omp í ej os

PROTOTIPO: struct Complejo Oper-Compiejo(COMPLEJ0 *PriOper, COMPLEJO *SegOper, char Operacion)

OBJETIVO: Realiza sumas, restas y multiplicaciones con dos números complejod.

37

Page 37: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

ENTRADA: 1 .-Primer operando complejo. 2.- Segundo operando Complejo. 3 .- Caracter correspondiente a la operación deseada

SALIDA: Número complejo resultante.

OBSERVACIONES: Los números complejos son estructuras que contienen dos datos de tipo entero, uno para la parte REAL y otro para la parte IMAGINARIA.

FUNCIÓN: FFT.

PROTOTIPO: void FFT(struct Compleio TribComp[TAMCADRR],int in)

OBJETIVO: Realiza la Transformada RJpida de Fourier de un arreglo de enteros.

ENTRADA: 1.- Arreglo de estructuras quc contienen datos complejos. 2.- Logaritmo en base dos (10% N Fourier. Este dato es de tipo entero

In) del número de puntos con que trabaja la transformada rapida de

SALIDA: Arreglo de estructuras que coiitienen el dato real e imaguiario.

PROTOTIPO: void MagniEspecí st r i i c ~ Complejo TabComp[TAMCAD], int *ApCadena).

OBJETIVO: Obtiene la magnitud dcl :irrtglo complejo sumando el cuadrado de la parte real con el cuadrado de la parte imaguiaria.

ENTRADA: Arreglo de estructuras que contienen números complejos.

SALIDA: Apuntador a la cadena de enteros que representan los valores calcuidos, es decir, la magnitud de cada una de los complejos.

38

iBr

Page 38: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

Funciones que corresponden al manejo de archivos.

FUNCIÓN: AbreArchESC.

PROTOTIPO: long int AbreArchESC(char NomArch 1 [TAMNOMAR],APUNTADOR *Ap)

OBJETNO: Abre un archivo de tipo binano para escritura, si el archivo no existe lo crea.

ENTRADA: Cadena de caracteres que conforman el nombre del archivo donde se encuentra la señal original a procesar y la ruta de acceso a él. El tamaño de la cadena está detínida por iuia constante de 50 caracteres, ya que se toma en cuenta la situación en la que la ruta de acceso conste de vanos subdirectorios.

SALIDA: 1 . - Tamaño en bytes del arclii\o t'l cual es retornado por la función misma. Este vaior es de tipo entero largo (4 bytes) considerando que t'l tnriiaño de los archivos descritos no sobrepasan el límite de este tipo de dato. 2.- Apuntador ai archivo. Este valor es obtaiifl- oor parametro y es de tipo APUNTADOR.

OBSERVACIONES: APUNTADOR es ~ u i tipo definido de tipo FILE.

FUNCIÓN: AbreArchLEC.

PROTOTIPO: long int AbreArchLECí char NomArchl[TAMNOMAR],APUNTADOR *Ap)

OBJETIVO: Abre un archivo de tipo biiinno para lectura.

ENTRADA: Cadena de caracteres q w conforman el nombre del archivo donde se encuentra la señal origuial a procesar y la ruta de acceso a el El tamaño de la cadena está definida por ima constante de 50 caracteres, ya que se toma en cuenta la situación en la que la ruta de acceso conste de \arios subdirectorios.

SALDA: 1.- Tamaño en bytes del archivo. el cual es retornado por la función misma. Este valor es de tipo entero largo (4 bytes) considerando qiie el tamaño de los archivos descritos no sobrepasan el límite de este tipo de dato. 2.- Apuntador al arctuvo. Este valor es obtenido por parametro y es de tipo APUNTADOR.

OBSERVACIONES: APUNTADOR es un tipo definido de tipo FILE.

FUNCIÓN: LeeCadenaCar.

PROTOTIPO: void LeeCadenaCar( void )

OBJETIVO: Lee los primeros 266 caractcrt's del archvo que contiene la señal del ECG. Estos caroclteres son solamente información referente a la niisiiin suial

ENTRADA: Ninguna.

SALIDA: Ninguna.

39

Page 39: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

--

Funciones que corresponden a la interfase con el usuario

FUNCI~N: GraficaLin

PROTOTIPO: void GraficaLin(int *RR,int Numint,int menjnt may,int Posx,int Posy)

OBJETIVO: Despliega una gráfica punto a punto uniendolos con líneas continuas.

ENTRADA: 1 .-Apuntador al arreglo de Lalores enteros que conformarán la gráfica. 2.- Número de valores a desplegar en l a yr3fica 3.- Valor menor de todo el arreglo de valortr mteros. 4.- Valor mayor de todo el arreglo de valores enteros. 5.- Posición horizontal del origen de los tits \'alor de tipo entero. 6- Posición vertical del origen de los ejes \ dor de tipo entero.

SALIDA.- Ninguna.

FUNCIÓN: GraficaBarras

PROTOTIPO: void GraficaBarras( lilt *\'alares, int Maximo, ht AnchoBarra,

OBJETIVO: Despliega una gráfica de barras int EspacioEntBarras).

ENTRADA: 1 .- Apuntador a la cadtin que contiene los valores de tipo entero que conformarán la gráfica 2.- El valor máximo de los valores 3 dcsplegar 3.- Ancho de las barras. Valor de tipo altero 4.- Espacio entre las barras. Valor dc tipo entero

SALIDA: Ninguna.

FUNCIÓN: DespliegaSenal

PROTOTIPO: void DespSenal(int Posicion.int *ApCadena,int Sensib,int Long-vent, int offsetx,int offsety)

OBJETIVO: Despliega una cadena de enteros dentro de una ventana previamente definda.

ENTRADA: 1.- Posición dentro de la cadena a partir de la cual ventana. Valor de tipo entero. 2.- Apuntador a la cadena de enteros que contiene los datos que se desean desplegar. 3.- Valor del factor de sensibilidad. Este \ nlor es de tipo entero. 4.- Longitud de la ventana. Valor de tipo ciitcro 5.- Posición en el eje de las absisas a pnr-r! I ,It. 13 cual se desea desplegar los datos. 6.- Posición en el eje de las ordenadas n 1 7 . 1 1 ~ I r de l a cual se desea desplegar los datos.

se desplegará la cadena en la

S ALiDA: Ninguna.

Page 40: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

FUNCIÓN: DibujaEjes.

PROTOTIPO: void DbujaEjes(Arregl0Cad *ValoresX, ArregloCad *ValoresY, int OrigenX, int OrigenY,)

OBJETIVO: Dibuja en la pantalla los ejes de coordenadas de un tamaño constante, con sus correspondientes divisiones para cada eje.

ENTRADA: 1 .- Apuntador al arreglo que contiene el valor de cada división del eje de las

2.- Apuntador al arreglo que contiene el k d o r de cada división del eje de las absisas. 3.- Posición horizontal del origen de los tics Valor de tipo entero. 4.- Posición vertical del origen de los eje> L 3ior de tipo entero.

ordenadas.

SALIDA: Ninguna.

FUNCIÓN: IniGraf.

PROTOTIPO: void IniGraflvoid).

OBJETIVO: Configura el monitor en n i d o gafico

ENTRADA: Ninguna.

SALIDA: Ninguna.

FUNCIÓN: Ponerunidades.

PROTOTIPO: void Ponerunidades( int Opcion)

OBJETIVO: Imprime en la pantalla las irnidades correspondientes a cada una de las gráficas.

ENTRADA: "Opcion" Valor que diferencia cada una de las gráficas.

SALIDA: Ninguna.

FUNCIÓN: Deshacevent.

PROTOTIPO: void DeshaceVent(void)

OBJETIVO: Deshace la ventan actual delando el colo de fondo

ENTRADA: Ninguna.

SALIDA: Ninguna.

41

Page 41: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

IWNCI~N: Suena.

PROTOTIPO: void Suena(void).

OBJETíVO: Produce un sonido en foiina de "bip" para teclas no validas o cuando se sale de los limites de de alguna ventana.

ENTRADA: Ningina.

SALIDA: Ninguna.

FUNCIÓN: Scroll.

PROTOTIPO: int Scroll(int tecla,int *Y .int *incl ,int sen,int Cont, int inc).

OBJETIVO: Controlar el desplazamiento horizontal de la señal.

ENTRADA: 1 .- Apuntador al arreglo en el que esta contenida la señal. 2.- Valor de la tecla leida. 3 .- Variable en la que se retorna la posición a partir de la cual se desplegó la señal. 4.- Factor de sensibilidad. 5.- Número de muestras que se quiere desplazar la señal. 6.- Posición anterior.

SALIDA: Valor de la posición inicial de la señal desplegada actualmente.

IWNCIÓN: Controlasens.

PROTOTIPO: int ControlaSens(int *Y).

OBJETNO: Hace las llamadas correspondientes a las funciones que controlan la sensibilidad y el despliegue de un arregio de enteros.

ENTRADA: Apuntador al arregio en el que esta almacenada la señal.

SALIDA: Factor de sensibilidad.

FUNCIÓN: MueveLinea.

PROTOTIPO: int MueveLinea(int tecla,int xl ,int LimDer,int Lim,int LimIzq).

OBJETIVO: Recorre e imprime en la pantalla las líneas que se Utilizan para marcar el complejo QRS deseado. Las líneas se recorren de muestra en muestra o a un intervalo mayor, de acuerdo a como se indique ca las fleChaS.

Page 42: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

ENTRADA: 1 .- Valor de la tecla leida. 2.- Posición en l'x'l donde se desea poner la imagen. 3 . - Límite hasta el cual llega la línea del lado derecho cuando se incrementa de m\ieiti 'a 211 i i i : e , t . n

3.- Límite hasta el cual llega la línea del lado derecho cuando el incremento es ina';c?r- de i 4.- Límite hasta el cual llega la línea del lado izquierdo.

SALIDA: Valor de la posición actual de la línea.

FUNCIÓN: LimExpíica.

PROTOTIPO: void LimExplica(int x, int y, int x1,int y1,int x2,int y2, char *Iterris[], int i,char *Cade[],int pos.:nt ancho t

OBJETIVO: Despliega el mensaje correspondiente al item a seleccionar

ENTRADA: 1 .- Posición horizontal de la ventana de despliegue. 2.- Posición vertical de la ventana de despliegue. 3 .- Límite izquierdo de la ventana actual. 4.- Limite superior de la ventana actual. 5.- Límite derecho de la ventana actual 6.- Límite inferior de la ventana actual. 7.- Apuntador al arreglo de cadenas que contiene los textos correponientes a los items. 8.- Número del item seleccionado. 9.- Cadena de caracteres que codonnan el mensaje. 10.- Posición donde se imprime la cadena de caracteres (Cade). 1 1 _- Ancho de la ventana dende se va a desplegar el mensaje.

SALIDA: Ninguna.

FUNCION: Tolerancia

PROTOTIPO: void Tolerancia(float *DTOL)

OBJETIVO: Permite cambiar la sensibihdad del detector por punto fiducial.

ENTRADA: Valor de la sensibilidad o tolerancia.

SALIDA: Valor de la sensibilidad o tolerancia.

FUNCIÓN: Fondo.

PROTOTIPO: void Fondo(void)

OBJETIVO: "Pinta" la pantalla y dibuja un marco con un color diferent

ENTRADA: Ninguna

SALDA: Ninguna.

43

Page 43: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

FUNCIÓN: Recuadro

PROTOTIPO: void Recuadro(int izq,int izclpat, int *AR,int long-vent).

OBJETIVO: Dibuja un recuadro en el que se despliega una o dos secciones de un arreglo de enteros.

ENTRADA: 1 .- Posición dentro del arreglo a partir de la cual se desplegar la primer sección en el recuadro. 2.- Posición dentro del arreglo a partir de la cual se desplegará la segunda sección en el recuadro. 3 .- Apuntador al arreglo de enteros. 4.- Posición dentro del arreglo hasta la cual se desplegará.

SALIDA: Ninguna.

FUNCIÓN: ven.

PROTOTDPO: void Ven(int xl , int y l , int x2, int y2,int *Y,int *alp& *clp,char flag). .

OBJETIVO: Hace las llamadas correspondientes a las funciones que imprimen la señal en la pantalla dentro de una ventana, que imprimen las líneas para seleccionar el QRS deseado y despliega los mensajes correspondientes a cada etapa del programa.

ENTRADA: 1 .- Tope izquierdo. 2.- Tope superior. 3.- Tope derecho. 4.- Tope inferior. 5.- Apuntador al arreglo en e! que esta almacenada la señal. 6.- Bandera indicadora de despliege, "O" despliega el archivo elegido, "1" despliega la señal a procesar.

SALIDA: 1 .- Posición inicial del complejo QRS seleccionado. 2.- Posición final del complejo QRS seleccionado.

44

Page 44: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

r FüNCIONES DIVERSAS

FUNCIÓN: Real ACads.

PRORTOTIPO: void RealACads(float *CadEnt..,float *CadEntY,Cadenas ValoresX[6], Cadenas ValoresY[6])

OBJETIVO: Convierte cada uno de los elementos de dos cadenas de tipo float (Real), a cadenas de carateres para obtener dos arreglos de cadenas de caracteres.

ENTRADA: 1 .- Apuntador a la primer cadtria de floats 2.- Apuntador a la segunda cadena de f loats

SALIDAS: 1 .- Apuntador al primer arreyio de cadenas de caracteres. 2.- Apuntador al segundo arreglo de caderias de caracteres.

FUNCIÓN: EntACads.

PROTOTIPO: void EntACads(int *CadEnt.X.int *CadEntY,Cadenas ValoresX[ó], Cadenas ValoresY[6]).

0BJETIVO:Convierte cada uno de los elementos de dos cadenas de tipo entero, a cadenas de carateres para obtener dos arreglos de cadenas de caracteres

ENTRADA: 1.- Apuntador a la pnriw cadena de enteros. 2.- Apuntador a la segunda cadena de tmteros

SALIDAS: 1.- Apuntador al primer arreglo de cadenas de caracteres. 2.- Apuntador al segundo arreglo de cadenas de caracteres.

M C I Ó N : Sensibilidad.

PROTOTIPO: int Sensibilidad(int ValIni. int tecla)

OBJETNO: Obtiene el factor de sensibilidad. El factor de sensibilidad se refiere al valor por el cual se divide o multiplica cada uno de los datos de una cadena de enteros para aumentar o disminuir su valor.

ENTRADA: 1.-Valor de sensibilidad inicial Este valor es de tipo entero. 2.- Código ASCII de la tecla que indica el aumento o disminución del valor de sensibilidad.

SALIDA: Valor del factor de sensibilidad Este valor es de tipo entero y es retomado por la función misma.

45

Page 45: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

FUNCIÓN: Caiposicion.

PROTOTIPO: int CalPosicion(int Pos Act, int Desplazamiento, char Tecla)

OBJETIVO: Calcula la posición, en una cadena de cualquier tipo de dato, a partir de la posición actual y un desplazamienta dentro de la cadena. La función requiere del código de una tecla que indica la dirección del desplazamiento.

ENTRADA: 1 _- Posición actual en la cadena Valor de tipo entero. 2.- Valor del desplazamiento de tipo entero 3 ,- Código ASCII de la t k l a que indica la dirección del desplazamiento

SALIDA: Valor de la posición en la cadena después del desplazamiento.

OBSERVACIONES: Los Códigos de las teclas que tendran efecto en la función sólo serán los correspondientes al desplazamiento horizontal. El valor del desplazamiento debe tomar íos siguientes valores para que tenga efecto en la función: 2, 4, 8, 16, 32, 64. 128, 256 o 512.

FUNCIÓN: MinimoMaximo.

PROTOTIPO: int MmmoMaximo( int *Cadena& LongCad,int *Men,int *May,int izppat)

OBJETIVO: Obtiene los valores maxim0 y mínimo de un arreglo de enteros, así como la posición dentro del arreglo donde se encuentra el valor niauimo.

ENTRADA: 1 .- Apuntador al arregJo de enteros. 2.- Longitud del arreglo de enteros 3.- Posición a partir de la cual busca los valores mínimo y máximo.

SALIDA: 1 .- Valor máximo. 2.- Valor minimo. 3 .- Posición del valor máximo

FUNCIÓN: ObtenLog.

PROTOTIPO: int ObtenLog(int Numero, int Base).

OBJETIVO: Obtiene el logantmo de un número de acuerdo a la base dada, aproximando su valor al entero inmediato superior.

ENTRADA: 1 .-Número de tipo entero al que se le aplica el logantmo. 2.- Base del logantmo. Dato de tipo entero

SALIDA: Logaritmo aproximado al entero inmediato supenor

46

Page 46: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

FUNCI~N: Promedio.

PROTOTIPO: int Promedio(1nt *ApCadena,int LongCad)

OBJETIVO: Obtiene el promedio de los valores contenidos en una cadena de datos de tipo entero,

ENTRADA: 1 .-Apuntador a la cadena de datos de tipo entero. 2.- Longitud de la cadena de datos de tipo entero.

SALIDA: Valor promedio resultante

47

Page 47: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

I 1

APENDICE C I En esta sección se presenta el código de las funciones Mplementadas.

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * FUNCIONES DE BIBLIOTECA " ' I ARCHIV0S.C 'I1' *

* Funciones que corresponden al manejo de archivos. *

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

* *

* *

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * * DECLARACI~N DE CONSTANTES *

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * *

#define TAMNOMAR 50 /* Tamaño máximo del nombre del archivo que contiene la señal original a procesar */

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * * *

DECLARACI~N DE VARIABLES * *

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

typedef FILE * APUNTADOR;

APUNTADOR ApArchl; APUNTADOR ApArch2; APUNTADOR &Arch-ECG;

/*long int AbreArchESC(char NomArch 1 [TAkíNOMAR],APUNTADOR *Ap); long int AbreArchLEC(char NomArch I [TAMNOMAR],APUNTADOR *Ap); void LeeCadenaCar(void)*/

48

Page 48: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * *

* OBJETIVO: Crea un archivo de tipo binano para escritura, si el archivo ya existe sólo * lo abre. * * ENTRADA: "NomArchl" Nombre del archivo. *

* FuNCIÓN: AbreArchESC * *

* * * *

SALIDA: "AbreArchESC" Tamaño en bytes del archivo creado o abierto Apuntador al archivo de tipo APUNTADOR.

* *

* " 4"

OBSERV.: APUNTADOR es un tipo definido de tipo FILE. * * * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

long int AbreArchESC(char NomArch 1 [TAMNOMAR],APUNTADOR *&) { struct mlk EstAr;

if ((*Ap = fopen(NomArch1,"wb-t")) = NULL) { prinq"no se puede abrir el archivoh"); exit( 1); 1

fíndfírst(NomArch 1 ,&EstAr,O); return EstAr.fffsize; }

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * * FUNCIÓN: AbreArchL,EC. * * OBJETIVO: Abre un archivo de tipo binario sólo para lectura. * * ENTRAJlA: "NomArch1" Nombre del archivo. * * SALIDA: "AbreArchLEC" Tamaño en bytes del archivo creado o abierto *

Apuntador ai archivo de tipo APUNTADOR. * * "AP" *

* OBSERV.: APUNTADOR es un tipo definido de tipo FILE. * * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

long int AbreArchLEC(char NomArch1 [TAMNOMAR],APUNTADOR *Ap) { struct a l k EstAr;

i f ((*Ap = fopen(NomArchl,"rb+")) = NULL) { prinfl"no se puede abrir el archivoli");

1 exit(1);

fíndfírst(NomArch1 ,&EstAr,O); return EstAr .ff-fsize; 1

49

Page 49: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

* * * FUNCIÓN: LeeCadenaCar. * * OBJETIVO: Lee los primeros 266 caracteres del archivo que contiene la señal de ECG. * * * * ENTRADA: Ninguna. * * SALIDA: Ninguna. *

Estos caracteres son solamente mformación referente a la misma señal.

* OBSERV.: Esta clase de archtvos son los utilizados para calibrar las funciones y los * * * utiliza en el software final. * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

* programas que se van realizando, pero realmente la función en sí no se

* *

void LeeCadenaCar(void) { int *Y;

Y = (int *) malloc( 13 3 *sizeof(int)); flushall(); fread(Y,sizeof(int), 1 3 3, Ap Arch-ECG); f r e e o ; 1

50

Page 50: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

* FUNCIONES DE BIBLIOTECA "" DIVERSAS.C "" * * *

* * * *

Funciones diversas. * *

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

* DECLARACIOV DE VARIABLES *

*******************************************************************************/

* *

* *

typedef char Cadenas[ó];

int CaícuíaO@(int min,int max,int long \ent.int *offsetx,int *offsety) c int c=O, al to;

*offsetx = (lOO-longvent)/2; alto = max-min; whle(alto > 85) alto = alto -85;

while(max > 85) c max=max-85; d+; 1

*offsety = 70; return (c); 1

5 1

Page 51: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * *

* * FUNCIÓN: MinirnoMaxirno() * OBJETIVO: Obtener los valores máximo y mínimo de un arreglo de enteros. * ENTRADA: "Cadena" Apuntador al arreglo de enteros. * "LongCad" Longitud del arreglo de enteros. * * "May"

* * * * *

SALIDA: "Men" Apuntador al valor mínimo de la cadena. Apuntador al valor máximo de la cadena.

* *******************+*******************~***************************************l *

int MinimoMaximo(int *Cadena,int LongCad.int *Men,int *May,int i q a t ) { int i,min,max,pos;

max = min = *(Cadena+izQqat); for(i=O;i<LongCad;i++) { if( *( Cadena+i+i z ~ q at)<min)

if(*(Cadena+i+izqpat)>max) c max = *(Cadena+i+izQqat); pos = i ; 1

min=* (C a dena+i+izqpat);

1 if(Men!=NULL && May!=NuLL) { *Men=min; * M a p n a x ; 1

retum@os); 1

I************** * * FUNCIÓN : * OBJETIVO: * ENTRADA: * * * SALDA : * *

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Detecta-Fb. * *

Detectar el pico máximo y su localización dentro de l a Ventana Patrón. * i) Apuntador AR(*AR) al archivo donde se encuentra el ECG

ii)Índice de movimiento de la Ventana PatrÓn(izppat) a lo largo del ECG. * iii)Longitud de la Ventana Patrón (long-vent). Regresa en Detecta-Pico. 13 localidad (dentro de la Ventana Patrón) donde * se encontró el pico mauinio

*

*

* *******************************************************************************/ *

52

Page 52: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

int Detecta-Pico(int * m i n t izqpatjnt long-vent) { int i=O,pico,pico-max=O,n;

picomax = *(AR+izqpat+i); for (i=O;i<=long_vent- 1 ;i++) { pico = *(AR+izqpat+i); if @icopico-max) { pico-max = pico; n = i; 1

1 retum(n); 1

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

* * FUNCIÓN: ObtenLog() * OBJETIVO: Obtiene el logaritmo de un número de acuerdo a la base dada, aproximando * * ENTRADA: "Numero" Número de tipo entero al que se le aplica el logaritmo. * "Basell Base del logantmo. * * SALIDA: "ObtenLog" Logantnio del número. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . int Obtdog(int Numero, int Base) {

* * su valor al entero inmediato superior. *

*

int n=O;

while(Numero > pow(Base,n)) n++;

return n; 1

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * * FUNCIÓN: RealACads() *

* caracteres, donde cada cadena consta de seis caracteres. *

* "CaáEntY" Apuntador a la segunda cadena de floats. *

* OBJETIVO: Convierte cada uno de los elementos de dos cadenas de tipo float (real), * * a cadenas de caracteres para obtener dos arreglos de cadenas de *

* ENTRADA: "CadEntX" Apuntador a la pnmer cadena de floats. *

* * * *

SALIDA: ValoresX" Apuntador al pnmer arreglo de cadenas de caracteres. * * "ValoresY" Apuntador al segundo arreglo de cadenas de caracteres.

.................................................................................

53

Page 53: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

void RealACads(float *CadEntX,float *CadEntY,Cadenas ValoresX[6], Cadenas ValoresY[6])

{ . . int 1;

for(i=O;i<5;i++) gcvt(*(CadEntX+i),4,ValoresX[i]);

for(i=O;i<ó;i++) gcvt(*(CadEntY+i),4,ValoresY [i]);

1

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

* FUNCIÓN: EntACads() * * OBJETIVO: Convierte cada uno de los elementos de dos cadmas de tipo entero,

a cadenas de caracteres para obtener dos arreglos de cadenas de * caracteres, donde cada cadena consta de seis caracteres. *

* "CadEntY" Apuntador a la segunda cadena de enteros. * SALIDA: "ValoresX" Apuntador al pnmer arreglo de cadenas de caracteres.

ValoresY" Apuntador al segundo arreglo de cadenas de caracteres.

* *

. * * *

* ENTRADA: "CadEntX" Apuntador a la primer cadena de enteros. *

* * * *

* *

*****************************~*~~~~**~********************~********************J void Ent ACads( int *CadEntX , int * C a dEnt Y, Cadenas ValoresX [ 61,

Cadenas ValoresY[ó]) { int i;

for(i=O;i<5;i++) itoa( *(CadEntX+i),ValoresX[i], for(i=O;i<ó;i++) itoa( *(CadEntY+i),ValoresY [i],

1

O).

O);

* * * FUNCIÓN: CaiPosicionO * * OBJETíVO: Calcula la posición, en una cadena de cualquier tipo de dato, a partir de la

* * ENTRADA: "PosAct" Posición actual en la cadena. * * "Desplazamiento" Val or del desplazamiento. * * "Tecla" Código ASCíi de la tecla que indica la dirección del * * desplazami ento * * SALIDA: "CalPosicion" Valor d& l a posición en la cadena después del * * desplaza riii tnt o *

*

requiere del Código de una tecla que indica la dirección del desplazamiento. * * posición actual y un desplaza miento dentro de la cadena. La función *

54

Page 54: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

* * correspondientes al desplazamiento horizontal. El valor del desplazamiento * *

OBSERV.: Los Códigos de las teclas que tendrán efecto en la función sólo serán los *

* debe tomar los siguientes valores para que tengan efecto en la función: * 2,4,8,16,32,64,128,256 o 512. * * * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

int CalPosicion(int PosAct,int Desplazamiento,int Tecla) { switch(Tec1a) { /*Caso en que el desplazamiento es hacia la derecha*/ case 77: switch(PosAct){

case 1: Desplazamiento++; break; case 2: Desplazamiento=DespIazamiento+2; break; case 4: Desplazamiento=Desplazarniento+4; break; case 8: Desplazamiento=Desplazamiento+S; break; case 16: Desplazamiento=Desplazamento+16; break; case 3 2 : Desplazamiento=Desplazamiento+3 2; break; case 64: Desplazamiento=DespIazamientot64; break; case 128:Desplazamiento=Desplazamiento+ 128;break; case 256:Desplazamiento=Desplazamiento+256;break; case 5 12:Desplazamiento=Desplazamiento+512;break; default: break; 1 break;

/*Caso en que el desplazamiento es hacia la derecha*/ case 75: switch(PosAct){

case 1 : Desplazamiento-. break; case 2: Desplazamiento=Desplazamiento-2; break; case 4: Desplazamiento=Desplazamiento-4; break; case 8: DespIazamiento=Desplazamiento-8; break; case 16: Desplazamiento=Desplazamiento-16; break; case 32: Desplazamiento=Desplazamiento-32; break; case 64: Desplazamiento=Desplazamiento-64; break; case 128:Desplazamiento=Desplazamiento-l28;break; case 256:Despiazamiento=Desplazamient0-256;break; case 5 12:Desplazamiento=Desplazamient0-5 12;break; default: break; } break;

default: break; }

return Desplazamiento; }

55

Page 55: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

* FUNCIÓN: Sensibilidad() * * *

* *

* OBJETIVO: Obtener el factor de sensibilidad. El factor de sensibilidad se refiere al * valor por el cual se divide o multiplica cada uno de los datos de una * cadena de enteros para aumentar o disminuir su valor. * ENTRADA: "Valh" Valor de sensibilidad inicial. * "tecla" Código ASCII de la tecla que indica el aumento o disminución del valor * de sensibilidad. * * SALIDA: "Sensibilidad" Valor del factor de sensibilidad. * * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . int Sensibilidad(int Valh,int tecla) {

* * *

*

switch(tec1a) { /*Caso FLECHA ARRIBA */ case 72: ValIni--;

/*caso FLECHA ABAJO */ case 80: Valh++;

break; default: break; 1 return V a l h ;

break;

}

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * * FUNCIÓN: Promedio(). *

* ENTRADA: "ApCadena" Apuntador a una cadena de valores tipo entero. * * "LongCad" Longitud de la cadena de enteros. * * SALIDA: "Promedio" Valor promedio resultante *

................................................................................

* OBJETIVO: Calcula el promedio de los valores que se encuentran en una cadena * * de enteros. *

* *

int Promedio(int *ApCadena,int LongCad) { int i; long unsigned int suma=0;

for(i=O;i<=LongCad- 1 ;i++) suma = suma + *(ApCadena+i);

retum((int)suma/LongCad); 1

56

Page 56: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

. _^__I....._._.__.--._ ~~

~

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

* FUNCIONES DE BIBLIOTECA INTERFAS.C ""

* * * * * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

* * *

* *

* Funciones que corresponden a la interfas con el usuario.

/*******************************************************************************

* DECLARACION DE CONSTANTES *

*******************************************************************************/

* *

* *

#definePROF 4 /*Profundidad de la barra en 3d*/ #define W A R S 25 #define POSABJY 230 /*Posición abajo en y (250)*/ #define LONGX 3 10 #define LONGY 200 #define NUMERO 1 1 #define FINVENT 462 /*Coordenada final en x de la ventana de despliegue*/ #define ESPACIO 20 #define FONDO 3

/*Número de barras*/

//#define TAMANOl 12000 #define INTMüES 40

/* \u i i icro de muestras a leer del archivo*/ /*Número dc muestras que se desplaza la*/ /*línea para marcar el QRS*/

/******************************************************************************* * PROTOTIPOS DE FUNCIONES * *************************~***~***~~********************************************/

void DespSenal(int,int *,int,int,int,int ), void LimExplica(int,int,int,int,int,int,char *Items[],int,char *cad[],int,int);

57

Page 57: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

char *ExpliVen 1 [I={ 'I

11 Salir al sistema",

NULL

Leer ECG de un Archivo, los archivos deben tener extension .DAT",

1;

char %en1 [I={ "ECG", "Salir",NULL

);

char *ExpliVen2[]={ II Detector de QRS por Denvada I filtros",

Detector de QRS por punto Fiducial", 11

II Salir al menu principal".

NULL 1;

char *ven2[]={ "DeteC", "Fid", "Salir",NULL

1;

char *ExpliVen3[]={ I1 Espectro de Potencia de los intervalos R-R",

Grafica de Tiempo vs Iritenlalos R-R",

II Histograma de intenalos R-R", II

I1 Salir al menu pnncipal". NULL

} >

char %en3[]={ "EsPot", " Histo", "Tiem", 'I Salir" ,NULL

};

char *ExpliVen4[]={ I'

'I

Calcula el Espectro por Transforniada Discreta de Fourier", Calcula el Espectro por Transfoniirida R pida de Fourier",

II Regresa al menu antenor" NULL

1;

58

Page 58: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

char *ven4[]={ "TDF", "TRF", 'I Salir",NLJLL

1;

/*Mensajes a desplegar en la pantalla*/ char *mensajes[]={

" ¢3 Mover, @Avance, ESC Salir, J Continuar", 'I U Mover, @Avance, ESC Regresar. J Continuar'', 'I ESC h c i a r , J Aceptar'' , " U Scroll,@ Aumenta = I'

I' Seleccione Sensibilidad = O ,@ Modificar, J Aceptar",

I'

, ESC Salir. J Continuar", @ Modificar Amplitud, J Continuar",

II ECG FILTRADO, DERIVADO E INTEGRADO", ECG FILTRADO. SELECCIONE EL QRS PATRON,

ELECTROCARDIOGRAMA (ECG) ORIGINAL", intervalos RR detectados = ' I ,

Intervalos RR detectados = ". Picos QRS's detectados = ' I ,

I1

I'

I' Latidos Rechazados = ' I ,

11

I'

I' RR maximo = ", 'I RR promedio ='I,

RR mmimo = ",NULL 1,

/******************************************************************************* * * *

* * DECLAR.ACIÓN DE VMABLES

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . *

typedef char ArregloCads[6]; int Ap-RR=O; int bandesc4;

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * FUNCIÓN: IniGraf. * OBJETIVO: Configura monitor en modo gráfico * ENTRADA:Ninguna. * SALIDA: Ninguna. *******************************************************************************/

* *

* *

i i

I

59

Page 59: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

void hGraf(void) { int gdriver = DETECT, p o d e , gerr;

initgraph( &driver, & p o d e , " C :\WAQUETES\\BORLANDC\\BGn\"); gerr = graphresuit(); if &err != grOk) { pnntf("BG1 error: % s W , grapherrormsg(gerr)); exitkerr); 1

1

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * FUNCIÓN: Ponerunidades. *

* las gráficas. *

* SALIDA: Ninguna. * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

* OBJETíVO: Imprime en la pantalla las unidades correspondientes a cada una de

ENTRADA: "Opcion" Valor que diferencia cada una de las gráficas.

*

* *

void PonerUni dades( int Opci on)

int color;

olor = getcolor(); / / settextstyle(TRIPLEX-FONT, HO RiZ-DRO); /I settextstyle(TRIPLEX-FONT.HORIZ-DIR,O);

setcolor(wHrrE); switch( Op ci on) { case 3 : outtextxy(29,4,"msegg");

/I outtextxy(3 76,200,"# de"), I1 outtextxy(3 56,2 10,"intervalo");

outtextxy(365,227,"RR"); break;

outtextxy(365,226,"mseg"); break;

case 2 : outtextxy(l,4,"% DE INTERVALOS ");

case 1 : 0uttextxy(lS,4,"~H(jWy"); outtextxy(365,227,"w"); break;

default: break; 1 settextstyle(O,HORIZ-DlR, 1); setcolor(co1or);

}

60

Page 60: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * FUNCIÓN: Deshacevent. *

* ENTRADA: Ninguna. * * SALIDA:Ninguna. * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

* OBJETIVO: Deshace la ventan actual dejando el colo de fondo. *

void DeshaceVent(v0id) c setfill sty1 e( S OLID-FILL,F ONDO); floodfill( 5 520); 1

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * * FUNCIÓN: Suena(). *

* sale de los límites de alguna ventana. * * ENTRADA:Ninguna. * * SALIDA:Ninguna. *

**************************************************~****************************l

* OBJETIVO: Produce un sonido en forma de "bip" para teclas no validas o cuando se *

* *

void Suena(void) c

sound(690); delay(l50); nosound();

1

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * FUNCIÓN: scroll(). *

* horizontal de la señal. . * * ENTRADA: Y" Apuntador al arreglo en el que esth contenida la señal. * * "tecla" Valor de la tecla leida. *

* desplegó la señal. * * "sen" Factor de sensibilidad. * * "Cent" Número de muestras que se quiere desplazar la señal. * * 'linc" Posición antenor * * SALIDA: "inc1" Valor de la posraon inicial de la señal desplegada actualmente. * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

* OBJETIVO: Hace las llamadas correspondientes para controlar el desplazamiento *

* 'lincl" Variable en la que se retorna la posición a partir de la cual se *

61

Page 61: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

int Scroll(int tecla,int *Y,int *incl ,int sen,int Cont, int inc,int Long) E switch(tecla){ /* Caso flecha derecha*/ case 77: if((inc)<=(Long/TAMANOZ*/-FINVENT-2-Cont))

{ setcolor(1); /*Cambia el color al del fondo de la ventana*/ DespSenal(inc,Y,sen,FI-2,0,70); /*"Borra" la señal bdsplegada en la ventana*/ setcolor( 15); DespSenal(inc+Cont,Y,sen,FlNVENT-2,0,70); /*Despliega la señal */ inc = CalPosicion(Cont,inc,tecla); } else { setcolor( 1); DespSenal(inc,Y,sen,FI"T-2,0,70); setcolor( 15); i n ~ L o n g í T A M A N 0 2 */-F INVENT-3 ; Desp Sena1 (inc,Y, sen, FINVENT- 2, O, 70); Suena(); 1 break;

/*Caso flecha izquierda*/ case 75: if(inc>=Cont)

{ setcolor( 1); Desp Senal(inc,Y, sen,FINVENT-2,0,70); setcolor( 15); DespSenal(inc-Cont,Y,sen. FINVJ2NT-2,0,70); inc = CalPosicion(Cont,tnc,tecla);

} else if(inC!=o) { setcolor( 1); DespSenal(inc,Y,sen,FlNVENT-2,0,70); setcolor( 15); DespSenal(O,Y,sen,FINVENT-2,0,70); i n c 4 ; 1 else Suena();

break; /*Caso flecha arriba*/ case 72: if(Cont<5 12) /*Limite superior de desplazamiento*/

Cont = Cont*2; break;

/*Caso flecha abajo*/ case 80: if(Cont>l) /*Límite infenor de desplazamiento*/

Cont = Cont/2; break;

default: break; I *incl = inc;

62

Page 62: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

return Cont; 1

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * * FUNCIÓN: ControiaSensO. * * OBJETIVO: Hace las llamadas correspondientes a las funciones que obtienen el valor * * *

de sensibilidad y a la funcion que despliega una señal en la pantalla. * * ENTRADA: "Y" Apuntador al arre@o en el que está almacenada la señal.

* SALIDA: "am" Factor de sensibilidad * * *

int ControlaSens(int *Y) { int bandera+; static int aum=3; int Tecla;

/*Factor de sensibilidad*/

while(! bandera) { setcolor( 15); Desp Senal(O,Y,am,FINVENT- 2. O . 7 O ) . Tecla = getche(); switch(Tec1a) { /*Caso FLECHA ARRIBA*/ case 72: if(aurw-4)

/*Despliega la señal */

/*Limite siipcnor del factor de sensibilidad*/ { setcolor( 1); DespSenal(O,Y,aum.Fl~\'ENT-2.0,70); aum=Sensibilidad(auni. Ttda ). }

break; /*Caso FLECHA ABAJO*/ case 80: if(aum<óO) /*Limite infenor del factor de sensibilidad*/

{ setcolor( 1); Desp Senal(0,Y , a m , F IN VE NT- 2 ,O, 70); aum=Sensibilidad(aum,TecIa 1, }

break; /*Caso ENTER, se acepta la señal desplegada*/ case 13: bandera = 1; /*termina ciclo while*/

break; default: break; }

1

1 return a m ;

63

Page 63: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * * FUNCIÓN: MueveLinea(). *

OBJETíVO: Recorre e imprime en la pantalla las líneas que se utilizan para marcar * * * *

* ENTRADA: "tecla" Valor de la tecla leida. * * "xl" Posición en x donde se desea poner la imagen. * * * incrementa de muestra en muestra. * * "Limll Limite hasta el cual llega la linea del lado derecho cuando el * * incremento es riiabor de 1 . *

el complejo QRS deseado. Las líneas se recorren de muestra en muestra * o a un intervalo mayor, de acuerdo a como se indique con las flechas. *

"LimDer" Límite hasta el cual llega la línea del lado derecho cuando se *

* * * *

"LimIzq" Límite hasta el cual llega la linea del lado izquierdo. * SALIDA: "xl" Valor de la posicioii actual de la línea. *

*******************************************************************************/

int MueveLinea(int tecla,int x 1 ,int Lini Der .int Lim,int LimIzq) { static int pos*;

switch(tec1a) { /*Caso FLECHA DERECHA*/ case 77: /*Si el incremento es de I í muestra en muestra)*/

irnos*) {if(xl<LimDer-1) /*Si no limite derecho*/ xl++;

else Suena();

1 else /*Si esta entre limite derecho v ESPACIO muestras atras*/ if(x 1 <LimDer-ESPAC I O /*si no es límite derecho*/ { if((x 1 +INTMuES)< Li mDer- ES P ACIO)

xl+=INTMuES, else

xl = LimDer-ESPACIO, 1

else Suena();

break; /*Caso FLECHA IZQUIERDA*/ case 75: /*Si el decremento es de 1 */

irnos*) /*Si no se ha llegado a l a otra Iiriea*/

{ if(x 1 >Lim) xl-- ;

else Suena();

64

Page 64: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

I else if(x 1 >LimIzq) { if((xl-INTMUES)>LimIzq)

else

I else Suena();

break; /*Caso FLECHA ARRIBA*/ case 72: pos = 1;

/*Caso FLECHA ABAJO*/ case 80: pos = O;

break; default: break; I

x 1 -=INTMsJEs ;

x l = LimIzq;

break;

return x l ; 1

................................................................................

* * * FUNCIÓN: LimExpiica(). *

* ENTRADA: "xll Posición honzontal de la ventana de despliegue. * * "y" Posición vertical de la ventana de despliegue. * * "xl" Límite izquierdo de la ventana actual. * * "yl" Limite supenor de la ventana actual. * * "y2" Límite inferior de la ventana actual. *

* correponientes a los items. * * 11'11 1 Número del item seleccionado. * * "Cade" Cadena de caracteres que conforman el mensaje. * * "pos'' Posición donde se imprime la cadena de caracteres (Cade). *

* * SALIDA:Ninguna. *

* OBJETIVO: Despliega el mensaje correspondiente al item a seleccionar. *

* W" Límite derecho de la ventana actual. *

* '%ems" Apuntador al arregio de cadenas que contiene los textos *

* * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

void LimExplica(int x, int y, int x char *Items[],int

c int h , n ;

setviewport(x+3O,y,6OO,y+m~h0, cleaMewpolt();

,int y1 ,int x2,int y2, ,char *Cade[],int pos,int ancho)

65

Page 65: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

setcolor(wHITE); íedangle(0,0,570-~,an~h0); setfillstyie(S0LID-FILL, 1); floodfill(5,5,15); settextstyle(O,HORE-DIR, 1); n = anch0=30?1:3; for( Wj= 1 ; k<n; k++,j++)

I outtextxy(5,1 O *j ,items [i]); outtextxy@os, lO*j,Cadelj- 11);

} setviewport(x1 ,y1 ,x2,y2,1); 1

I++;

/***************************~***~******~~***~~~~******************************** * FUNCIÓN: Tolerancia(). * * OBJETIVO: Permite cambiar l a sensibilidad del detector por punto fiducial. * * ENTRADA: "DTOL" Valor de la sensibilidad o tolerancia. * * SALIDA: "DTOL" Valor de l a sensibilidad o tolerancia. * *******************************************************************************/

void Tolerancia(float *DTOL) { char *cad[ l],tecla;

cad[0] = "4"; LimExplica( 100,300,130,300,600.3 30,rnensajes,5,cad,240,30);

// outtextxy(220, 10,110.411); do

c tecla = toupper(getch0); switch( tecl a) { case 72 : if((*DTOL)< 0.6)

(*DTOLH*DTOL)+O. 1, break;

case 80 : if((*DTOL) >= 0.2) (*DTOLH*DTOL)-O . I ,

break; default : break; 1

cad[0] = fcvt(*DTOL,l,NULL,NULL). LimExplica( 100,300,130,300,600.3 30. rii~nsajes,5,cad,240,30); }while(tecla != 13);

DeshaceVent(); 1

66

Page 66: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * * FUNCIÓN: DespSenal() * * OBJETIVO: Despliega la señal dentro de una ventana previamente definida. La longitud * * de esta ventana es declarada como una constante. * * ENTRADA: "Position" Posición dentro de la cadena a partir de la cual se desplegará * * la señal en la ventana. * * * * correspondientes a la señal que se desea desplegar. * * "Sensib" Valor del factor de sensibilidad. * * SALIDA: Ninguna. *

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . void Desp Sena1 (int Posicion,int * Ap C adena . i nt S ensi b,int Long-vent ,

"ApCadena'l Apuntador a la cadena de enteros que contiene los datos

* *

int offsetx.int offsety) { int i,valorxl,valoryl ,valorx2,valory2.

/*Se quiere incrementar la amplitud de la señal*/ if( Sensib<*) { i f ( S e n s i b 4 )

Sensib=2; else Sensib=(Sensib-2)*(-1); /*Obtiene el valor por el cual se debe

/*Indica que se incrementa la señal al doble*/

multiplicar cada dato para incrementar la amplitud*/ for(i==O;i<Long-vent/*FI"T- 2 * l . 1 + + ) {valoryl = offsety - (*(ApCadena+i-Pocicion)*Sensib/2); valory2 = offsety - (*(ApCadena-i -Position+ l)*Sensib/2); valorxl = i+offsetx; valorx2 = i+ l+offsetx; line(valorx1,valoryl ,valorx2,valory2); 1

1 else for(i=O;i<Long-vent;i++) {valoryl = offsety - (*(ApCadena+i+Posicion)/Sensib/2); valory2 = offsety - (*(ApCadena+i+Posicion+ l)/Sensib/2); valorx 1 = i+offsetx; valorx2 = i+ l+offsetx; line(valorx1,valoryl ,valorx2,valory2); }

}

/**********************************~*******************************************~ * * * FUNCIÓN: GraficaBarrasO * * OBJETIVO: Despliega una gráfica de barras *

67

Page 67: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

* ENTRADA: "Valores" Apuntador a la cadena que contiene los valores que confor- * * marán la gráfica. * * "Maxima" Valor máximo de los valores a desplegar. * * AnchoBarra" Ancho de las barras. * * "EspacioBarras'I Espacio entre las barras. * * SALIDA: Ninguna. * * * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

void Grafi caBarras( int *Valores, int Ma xi mo , int AnchoBarra, int E sp aci oEntBarras)

{ int ValorCampana,xl, y l , x2, y2,i;

Valorcampana = 100/(Maximo); for (i = O ; i < NUMBARS; i++) { if(*(Valores+i)!=O) c xl = 42+(AnchoBarra+EspacioEntBarras) * 1;

y1 = (POSABJY - (*(Valores+i)*2*ValorCampana)) ; x2 = xl + AnchoBarra; y2 = POSABJY; bar3d(xl, yl , x2, y2,PROF,l); }

} }

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * FUNCION: Fondo. * * OBJETIVO: Pone la pantalla con el color de FONDO y dibuja un marco con un color * diferente. * * ENTRADA: Ninguna. * * SALIDA: Ninguna. * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

*

void Fondo(void) { setlinestyle@ OLD-LINE,O,THIC K-WIDTH); redangie(o,o,getmaxxo,getmaxYo), set fill sty1 e( S OLD-FILL , F ONDO); floodfill( 5,5,15); setlinestyle(S0LID-LINE,O,NORM-WIDTH), 1

68

Page 68: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * FUNCION: Recuadro(). *

* arreglo de enteros. *

* primer sección en el recuadro. *

* segunda sección en el recuadro. * * "AR" Apuntador al arreglo de enteros. *

* OBJETIVO: Dibuja un recuadro en el que se despliega una o dos secciones de un

ENTRADA: "izq" Posición dentro del arreglo a partir de la cual se desplegará la

*

* *

* "izppat" Posición dentro del arreglo a partir de la cual se desplegará la *

* "long vent" Posición dentro del arregio hasta la cual se desplegará. * * SALIDA: N i n g i a . * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . void Recuadro(int izq,int izppat, int *AR,int long-vent) { int Men,May,~ffsetx,~ff~ety,~;

MinimoMaximo(AR,longvent,&Men,&May,izppat); c=CalculaOff(Men,May,long-vent,&offsetx, &offsety); setviewport(10,180,110,350,1); setcolor( 15); rectangIe(0,0,100,170); setviewport( 11,181,108,348,l); rectangIe(l,l,97,167); setfillstyle(SOLID-FILL, 1); fl00dfi11(20,20,1); setlinestyle(SOLID-LINE,O,THTC K-WIDTH); setcolor(2); DespSenal(izppat, AR,c+ 1 ,long-vent,offsetx,offsety); setlinestyle(SOLID-LINE,O,NORM_WIDTH); setcolor( 15); DespSenal(izq, AR,c+ 1 ,longvent,offsetx,offsety); delay(100); setlinestyle(SOLD-LINE,O,THICK - WIDTH); setcolor( 1); Desp Senal( izppat, AR,c+ 1 ,long-vent,offsetx,offsety); setcolor( 1); Desp S enal( i zq, AR, ct 1 , 1 ong-vent, offsetx, offsety); setlinestyle(SOLID-LINE,O,NORM_WIDTH);

1

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * * FUNCIÓN: ven(). * * * *

OBJETIVO: Hace las llamadas correspondientes a las funciones que imprimen la * * *

señal en la pantalla dentro de una ventana, que imprimen las líneas para seleccionar el QRS deseado y despliega los mensajes correspon-

* dientes a cada etapa del programa. *

69

Page 69: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

ENTRADA: "xl,yl,x2,y2" Coordenadas correspondientes a la ventana en la que se va * desplegar la señal. *

"Y1' 'Yag" Bandera indicadora de despliege, "O" despliega el archivo elegido,

Apuntador al arreglo en el que esta almacenada la señal.

"1" despliega la señal a procesar.

* *

* SALDA: "alp" Posición inicial del complejo QRS seleccionado. *

* "clp" Posición final del complejo QRS seleccionado. *

void Ven(int x l , int yl , int x2, int y2,int *Y,int *alp,& *clp

{

,char flagjnt Long/* * * */)

void *bufl ,*buf2; unsigned size; int bandera=O,banderal=O,bandera2=0, bandera34,incl; int a 1 ,b 1 ,a2,b2,c 1 ,dl ,c2,d2,aum 1 ,Cont 1 = 1 . ind,tecla; char *cad[ 1],CadCont[3];

bandesc = O; a l = a2 = 180; c l = c2 = 100; d l = b l = 140; d2 = b2 = 30;

/*Coordenadas que indican la posición en la*/ /*cual se impnmen iniaalmente las líneas.*/

size = imagesize(a1, bl , a2, b2). if ((buf2 = malloc(size)) = NULL) { cl osegrsph(); printf("Error: not enough heap space in save-screen().\n"); exit( 1); I size = imagesize(c1, dl , c2, d2); if ((bufl = malloc(size)) =NULL) { closegraph(); printf("Error: not enough heap space in save_screen().W); exit( 1); } cad[O] = " ' I ;

LimExplica( 130,28O,xl+ 1 ,yl+ 1 ,x2- 1 ,y2- 1 ,mensajes,4,cad,2 10,30); setViewport(xl,y1,x2,y2,1); clearviewport(); setcolor( 15); rectangie(O,O,x2-x1 ,y2-yl); setfill style(S OLD-FILL, 1); floodfill( 1, 1,159; setViewport(xl+l,y1+1,~2-l,y2-1, I ) . aum l=ControlaSens(Y);

*Abre ventana de despliegue*/

70

Page 70: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

cad[O] = itoa( l,CadCont, 10);; LimExplica( 130,280,~1+l,yl+l,x2-l,y2-1,mensajes,3,cad,190,30); whil e( !bandera) c bandera1 = O; bandera34; tecla = getche(); Contl = Scroll(tecla,Y,&incl,auml,Cont 1 ,inc,Long);

cad[O] = itoa(Cont1 ,CadCont, 10); LimExplica( 130,280,x1+1,y1+1,x2-1.y2- 1 ,mensajes,3,cad,185,30); inc = incl; if (flag = '1') c switch(tec1a) { /*Caso ENTER, se va a marcar el pnnier límite deseado*/ case 13: getimage(c1 ,dl ,c2,d2,bufl),

&[O] = " ' I .

LimExplica( 130,28O,xl+ l , y l + 1 ,x2-l,y2-1,mencajes,0,cad,210,30); line(c1 ,dl,c2,d2); /*Línea continua*/ setlinestyie(2,1,1); while(! banderal) { bandera2 = O; getimage(a 1, b 1 ,a2, b 2, b uf2); line(al,bl,a2,b2); /*Linea punteada*/ tecla = getche(); p utimage(a 1, b2, buf2, O ) . a l = MueveLinea(tec1a.a I ,FINVENT-l,cl+l,cl+ESPACIO); a2 = a l ; switch(tec1a) { /*Se acepta el primer límite marcado*/ case 13: setlinestyle(0, I , 1 );

line(a1 ,b 1 ,a2,b2); putimage(c1 .d2,bufl ,O);

LimExplica( 130,280,x1+l,yl+1,x2-l,y2-l,mensajes,l,cad,210,30); setlinestyle(2,1,1); while(! bandera2) (getimage(c1 ,dl ,c2,d2,bufl);

/*Línea continua*/

cad[O] = I'";

line(cl,dl,c2,d2); /*Línea punteada*/ tecla = getche(); putimage(c 1 .d2,bufl ,O); c l = MueveLinea(tecla,cl,al,O,ESPACIO-1); c2 = c l ; switch(tec1a) { /*Se marca el segundo límite*/ case 13: putimagdcI,d2,bufl,O);

setlinestyldO,l, 1); lindc I .d I .c2,d2);

cad[O] = " ' I ;

71

Page 71: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

LimExplica( 130,280,~ 1+ 1 ,y 1+ 1,x2- l,y2- 1 ,mensajes,2,cad,2 10,30); while(! bandera3) {tecla = getche(); switch(tec1a) {

/*Se acepta el segundo limite marcado*/ case 13:

/*No se acepta el case 27

bandera2 = 1; banderal = 1; bandera = 1; bandera3 = 1; break; segundo límite marcado*/ putimage(c1 ,d2,bufl ,O); putimage(a1 ,b2,buf2,0);

cad[O] = itoa( 1 ,CadCont,lO); LimExplica( 130,28O,x1+ 1 ,yl+ 1 ,x2- 1 ,y2- 1 ,mensajes,3,cad,2 10,30), bandera2= 1 ; bandera 1 = 1, bandera3= 1 ; break;

default break; I

1 break,

/*No se acepta el segundo límite marcado*/ case 27 putimagdcl ,d2,bufl,0);

cetlinestyle(0, 1, 1); Iindc I ,d 1 ,c2,d2); setlinestyle(2,1,1); putimage(a 1 ,b2,buf2,0); LirnExplica( 130,280,~ 1+ 1 ,yl+ 1 ,x2- 1 ,y2- 1 ,mensajes,O,cad,2 10,30); bandera2 = 1; break;

default: break, }

1 break;

case 27: banderal = 1; /*No se desea marcar el complejo QRS*/

putimage(a 1 ,b2,buf2,0); putimage(cl,d2,bufl ,O); setlinestyle(O,l, 1); setfíllstyle(SOLID-FILL, 1); floodfill( 1,1,15); cad[O] = itoa(Cont 1 ,CadCont, 10); LimExplica( 130,280,~ I+ 1 ,y 1+ 1,x2-1 ,y2-l,mensajes,3,cad,210,30); break;

defauit:break; 1

1 break;

72

Page 72: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

/*No se desea marcar el complejo QRS*/ case 27: bandera = 1;

bandesc = 1; break;

default: break; 1

1 else

if(tecla = 13) bandera = 1;

if(tecla = 27) { bandera = 1 ; bandesc = 1 ; 1

1 setviewport( 130,280,600,3 10,l); DeshaceVent(); if(alp!=NULL && clp!=NULL) { *alp=cl+inc+ 1; *c 1 p=a l+inc+ 1 ;

1 free(bufl); free(buf2); }

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

* FUNCIÓN: menserroro. * OBJETIVO: Despliega un mensaje de error. * ENTRADA: Número correspondiente al mensaje de error. * SALIDA: Ninguna.

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

* *

*

* * * * *

void menserror(int numerror) c setcolor( 15); setviewport( 3 2,360,600,3 90,l);

rectangle(0,0,567,30); setfíllstyle(SOLD-FILL, 1); floodfi11(5,5,15); switch (numerror)

clearviewport();

{ . case 1 : outtextxy(5,10,"! ERROR -, Pnmero seleccionar ECG'));

case 2 : outtextxy(5, lo,"! ERROR -, No se eligi$ el tipo de detecci$nn"); break;

break;

73

Page 73: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

case 3 : outtextxy(5, lo,"! ERROR -, NO se encontro el archivo, cualquier tecla para continuar");

case 4 : outtextxy(5,10," - ESPERE UN MOMENTO ! ");

case 5 : outtextxy(5,10,"

break;

break;

break;

break;

break;

break;

break;

break; .

- OPRIMA CUALQUIER TECLA PARA C 0 " U A R ! ");

case 6 : outtextxy(5,10,"Escx-iba ruta y nombre de Archivo :");

case 7 : outtextxy(5,10,"Escriba la Frecuencia de Muestra :'I);

case 8 : outtextxy(5,10,"El Archivo contiene [ l Canal'O' , varios Canales-1'1 :'I);

case 9 : outtextxy(5,10,"Numero de Canal que desea procesar :");

case 10: outtextxy(5,10,"! ERROR -, El canal deseado no existe, cualquier tecla para continuar");

1 1

void CapturaFrec(v0id) c float FMl=O;

menserror(7); do { gotoxy(42,24); printf(" "); gotoxy(42,24); scanf("%i",&FM); }while('M <= O) 1 1 (FM >= 4001)); FM1= IOOOO/FM; FM1 = FMl/10; VELMüEST = (int)FMl; I

int CapturaTipoArch(void) c int tipo= 1 o;

maserror( 8); do { gotoxy(62,24); printf('l "); gotoxy(62,24); scad(" %i " ,&tipo); }while((tipo < O) 1 1 (tipo > 1 ));

74

Page 74: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

retum(tip0); }

int CapturaCanal(void) { int can+;

menserror( 9); do c gotoxy(42,24); printfl" "); gotoxy(42,24); scanf("%i",&can); }whlle((can <= O) 1 1 (can > 20 )); return( can); }

75

Page 75: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

* FUNCIONES DE BIBLIOTECA ‘“‘ PR0CESA.C “ ‘ I * * *

* * * * * * *

Funciones que corresponden al procesamiento de una señal digital *

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * * *

DECLARACI~N DE CONSTANTES * *

//#define VELMUEST #define TAMCADRR 1000

#define LIMITMAX 32767

5 /* Valor de la velocidad de muestreo en ms. */ /* Tamaño máximo del arreglo que contendrá los

valores de los intervalos R-R detectados. */

typedef struct Complejo COMPLEJO,

float Umbral 1=300,Umbra12=O,Umbra13=300;

int AntPend=O; float splu=O,nph=O; int ApRR14; float p romedioPM=O ;

/* umbrales que se utilizan para detectar los intervalos R-R */

,

struct Complejo {

1;

/* Estructura compleja */ float Real,Imag,

76

Page 76: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * * FUNCIÓN: FiltroPasaBaja() * * OBJETIVO: Realiza el filtrado del dato que le llega. Para realizar esto utiliza un * * * dato actual. *

arreglo en el cual guarda datos procesados anteriormente para filtrar el *

* ENTRADA: "Dato" El dato a procesar. * * SALIDA: "FiltroPasBaja" Dato procesado. *

* procesar datos en T E M P O REAL. *

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

* OBSERV.: Esta función utiliza variables ESTATICAS para conservar los valores que * * utilizará en su próximo acceso. La función puede ser utilizada para *

* *

int FiltroPasaBaja(ht Dato) { static int yl=O,y2=O,x[26],n=l2; int Yo;

x[n] = x[n+13] = Dato; y0 = (yl<<l)-y2+x[n]-(x[n+6]<<l)+x[n+12]; y2 = y l ; Y1 =Yo; yO>>=5;

if(--n<O) n = 12;

return y0;

/* El resultado se divide entre 32 para eliminar la ganancia del filtro */

1

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * * FUNCIÓN: L P F ~ *

* enteros que es precisamente la información. * SALIDA: "Yl" Apuntador a la cadena de enteros que contiene la información

* procesada . *

* en él mismo la información procesada. * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

* * OBJETIVO: Procesa un bloque de información aplicando un filtro pasa baja.

ENTRADA: "Longcad" El tamaño del bloque, "Yl" apuntador a la cadena de * *

* *

* OBSERV.: El apuntador "Yl" recibe la información sin procesar y regresa .*

* *

void LPF(int LongCadjnt *Y1) c int i ,Dato;

77

Page 77: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

for(i=O;i<LongCad;i++) I Dato = *(Yl+i); *(Y l+i) = FiltroPasaBaja(Dat0); I

I

* * * FUNCIÓN: FiltroPasaAlta() * * OBJETIVO: Realiza el filtrado del dato que le llega. Para realizar esto utiliza un * * * dato actual. * * ENTRADA: "Dato" Dato a procesar * * SALIDA: "FiltroPasaAlta" Dato procesado. *

OBSERV.: Esta función utiliza vanables ESTATICAS para conservar los valores * * procesar datos en TIEiLlPO REAL. *

*******************************************************************************/

arreglo en el cual guarda datos procesados anteriormente para filtrar el *

* * que utilizará en su prounio acceso. La h c i ó n puede ser utilizada para *

* *

int FiltroPasaAlta(int Dato) { static int y1 = O, x[66], n2 = 32. int yo;

x[n2] = x[n2+33] = Dato; yo = yl+x[n2]-x[n2+32]; y1 -=yo; if(--n2<0) n2 = 32; return (x[n2+16]-(yO>>5)); /* El resultado se divide entre 32 para

eliminar la ganancia del filtro */ }

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * * FUNCIÓN: H P F ~ *

* ENTRADA: "LongCad" El tamaño del bloque. * SALIDA: "Y1" Apuntador a la cadma de enteros que contiene la información

* procesada * OBSERV.: El apuntador "Y 1 " r e a bc 13 información sin procesar y regresa ai e1

* mismo la tnformaciori prwcsada *

**********************************~********************************************/

* OBJETIVO: Procesa un bloque de información aplicando un filtro pasa altas. *

* *

* *

* *

78

Page 78: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

void HPF(int LongCadjnt *Y 1 ) c int i,Dato;

for(i4;i <LongCad;i++) { Dato = *(Yl+i); *(Yl+i) = FiltroPasaAlta(Dato); 1

}

/******************************************************************************* * * * FUNCIÓN: Deriva() * * OBJETIVO: Realiza la derivación del dato que le llega. Para realizar esto utiliza un * arreglo en el cual guarda datos procesados anteriormente para derivar * el dato actual. *

* *

* ENTRADA: "Dato" Dato a procesar * * SALIDA: "Deriva" Dato procesado * *

*

*******************************************************************************/ int Deriva(int Dato) { static int x_derv[4]; int j ,y; y = @ato<<i)+x-derv[3]-x-den [ I I-( ~~derv[O]<<l); y>>=3; for(j=O;j<3 ;j++) x-derv[i] = x-derv[i+ 1 1 ;

x-derv[3] = Dato; return (y?);

OBSERV.: Esta función utiliza vanables ESTATICAS para conservar los valores que * * utilizará en su prouinio acceso. La función puede ser utilizada para *

procesar datos en TIE'ZIPO REAL. El resultado se eleva al cuadrado. * * *

/* el resultado se eleva el cuadrado */ }

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * * FUNCIÓN: DerivacionO * * OBJETIVO: Procesa un bloque de Información aplicando derivada. * * ENTRADA: "LongCad" Tamaño del bloque. *

SALIDA: "Yl" Apuntador a la cadtna de enteros que contiene la información * procesada. *

OBSERV.: El apuntador "Y 1" rtu-ibe 13 información sin procesar y regresa en él * mismo la informaciori p I ocesada *

*******************************************************************************/

* *

* *

* *

79

Page 79: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

void Derivacion(int LongCad, int *Y 1 )

int ¡,Dato; for(i=O;i<LongCad;i++) { Dato = *(Y l+i); *(Y l+i) = Deriva(Dat0); }

/******************************************************************************* * * * FUNCIÓN: Intagrao * OBJETIVO: Realiza la integración del dato que le llega. Para realizar esto utiliza un

* * el dato actual. * * ENTRADA. "Dato" Dato a procesar * * SALIDA: "Integra" Dato procesado *

* procesar datos en TIEMPO REAL. *

*******************************************************************************/

* * arreglo en el cual guarda datos procesados anteriormente para integrar *

* OBSERV.: Esta función utiliza vanables ESTATICAS para conservar los valores que * * utilizará en su proximo acceso La función puede ser utilizada para *

* *

int Integra(int Dato) c static int x[32],ptiu; static long sum = O ; long ly; int y:

if (++ptr-32)

sum-= xbtr]; sum+= Dato; xlptr] = Dato;

if(ly>32400) /* se valida para evitar el sobrefiujo */ y = 32400;

else y = (int) ly; return y;

ptr = o;

ly = sum>>5;

1

80

Page 80: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * * FUNCIÓN: VenIntegracionO * * OBJETIVO: Procesa un bloque de información aplicándole integración. * * ENTRADA: "LongCad" Tamaño del bloque. *

SALIDA: "Yl" Apuntador a la cadena de enteros que contiene la información * procesada. *

OBSERV.: El apuntador "Y1" recibe la información sin procesa; y regresa en él * mismo la información procesada. *

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

* *

* *

* *

void VenIntegracion(int LongCad,irit *Y I )

{ int i,Dato;

for(i=O;i<LongCad;i++) { Dato = *(Yl+i); *(Y l+i) = Integra(Dat0); 1

1

................................................................................

* * * FUNCIÓN: DetecPiw() * * * * * *

OBJETiVO: Detecta la postaon donde se encuentra un pico, esto se logra Calculando * * * * *

la pendiente bajo la fórmula de dos punto (Pad = y2-yl/x2-x1), uno de los puntos es la posiaÓn dada por el punto que se está verificando y el segundo punto es 5 posiciones mas adelante. Cuando se detecta un cambio de signo en la pendiente se dice que en ese punto existe un pico.

* ENTRADA: "j" La posición del punto que se verifica. *

* posición * OBSERV.: Se conserva el valor de la pendiente anterior ya que es una variable

* global. *

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . int DetecPicu(int j,int *Yp,Boat Umbral) { int Pend;

* "Yp" Apuntador a la cadena de datos de la señal . * * SALIDA: "DetecPico" Valor diferente de cero cuando se detecta un pico en ésta *

* *

* *

81

Page 81: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

if(*(Yp-tj)> promedioPM * 0.6 && *(Yp+j) < promedioPM * 2 1 1 Ap-RR 4) { promedioPM = (promedioPM + (*(Yp+j)))/2; AntPend = Pend; retum(*Wp+j 1);

1 else { AntPend = P a d ;

1 retum(0);

} else { AntPend = Pend;

} }

else retum(0);

return( O);

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * *

* OBJETIVO: Ajusta los promedios de los limites de los intervalos R-R. Esto ayuda a * detectar los QRS sin errores * * ENTRADA: "IntRR" Arreglo donde se encuentran los intervalos detectados hasta el * * momento * * "Prom2" Promedio de los intervalos R-R anteriores. * * SALIDA: l'Prom2'' Promedio actualizado o ajustado de los inttervalos R-R, inclusive * el dtimo detectado * ................................................................................

* FUNCIÓN: LimitesRRo * *

*

* *

void LimitesRR(int *IntRR, int *Prom2) { unsigned int Prom 1 =O; int ContRR,LimitMin,LimitMax; int i, Cont Apunt;

if(Ap-RRX) C i f (Ap-RR9

{ for(i=O;i<Ap - RR;i++) Prom1 = Prom1 + *(IntRR+i);

Prom 1 = Prom 1 /Ap-RR; 1 else { for(i=Ap-RR-8;i<Ap RR;i++)

Prom1 = Promí + *(IntRR+i),

82

Page 82: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

Prom1 = PromlíS; Cont Apunt = Ap-RR- 1 ; LimitMin = *Prom2*0.92; LimitMax = * P r o d * 1.16; *Prom2 = O ; ContRR = O; do { if(( *(IntRR+ContApunt)>=LimitMm) & (*(IntRR+ContApunt)<=LimitMax)) { *Prom2 = *Prom2 + *(IníRR+ContApunt); ContRR++;

1 Cont Apunt--; }while((ContApunt>- I) & (ContRR<S)). if( ContRR=8) *Prom2 = *Prom2/8; /* si existen 8 intervalos detectados que

caigan dentro de dicho limite se hace el promedio, de lo contrario se le asigna el valor ideal al promedio de los intervalos R-R */

else *Prom2 = Proml;

1 }

1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * * FUNCIÓN: Umbrales() *

OBJETIVO: Ajusta los umbrales, dependiendo del valor del Último intervalo R-R o * del Último pico de nudo. * * ENTRADA: "NumUmbral" Especifica el umbral que se ajustará. * * "PlcoSenal" Valor del pico máximo de señal. * * "PicoRuido" Valor del pico máximo de ruido. *

* "Umbral2" Nuevo valor ajustado del umbral 2. * * "Umbral3" Nuevo valor ajustado del umbral 3 , * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . void Umbrales(short int NumUmbra1,int PicoSena1,int PicoRuido

* *

* SALIDA: "Umbral 1" Nuevo valor ajustado del umbral 1 , *

,float *Umbral 1 ,float *Umbral2,float *Umbral3)

if(NumUmbra1)

el se splu = O. 125*PicoSenal+ 0.875*sph;

sph = 0.25*PicoSenal+ 0.75*splu;

nph = O. 125*PicoR~ido + 0.87551pk1, *Umbral1 = npki + 0.25*(sph-nph); *Umbral2 = *Umbral 112; *Umbral3 = promedioPM + splu + 0.25*(spki-npki);

83

Page 83: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * * FUNCIÓN: CaíPendient4) *

* medio de la fórmula Pendiente = y2-yl/x2-x1. * * ENTRADA: ''f' La posición donde termina de ascender la ventana. *

* ventana de integración. * * SALIDA: "CalPendiente" valor de la pendiente. *

* para calcular la pendente *

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

* OBJETIVO: Calcula la pendiente del lado ascendente de la ventana de integración por *

* "Yp" apuntador a la cadena de datos de la señal que representa la *

* OBSERV.: La función toma 10 posictones atrás de la posición actual el segundo punto *

* *

int CalPendiente(int j,int *Yp) { int pendiente; pendiente=(( (*(Yp+j)>(*(Yp+j-( 1 SONELMUEST)/2)))/( 1 5ONELMUEST)/2); retum@endiente);

1

/******************************************************************************* * * * FUNCIÓN: htervaiosRR0 * * OBJETIVO: Obtiene los valores de los intervalos R-R. *

* * interva los R-R detectados hasta el momento. * * "LongCad" Tamaño del bloque que procesa. * * Arreglo que contiene los intervalos detectados hasta el momento. * * SALIDA: 'IApRRaux'l Apuntador a la posición actual del arreglo que contiene los * intervalos R-R detectados hasta el momennto. * * * OBSERV.: Si la función procesa vanos bloques de información (es dedir, es llamada

* ENTRADA: "Y" Apuntador a la cadena de valores del bloque de la señal. * "ApRRaux" Apuntador a la posición actual del arreglo que contiene los *

"IntRR" *

"intRR" Arregío que contiene los intervalos detectados hasta el momento. * *

* varias veces), se conserva la información en ApRRaux y en IntRR. * * * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . void Interval osRR(int *Y, int LongC ad, int * intRR)

c int seguidor+; int i=O,j=O,Prom2=lOO,Promedio=O; /* "Prom2" es el promedio de los

int T i e m p d ; /* "Tiempo" es el tiempo que ha transcumdo desde que Últimos 8 intervalos detectados */

que se detecto el Último intervalo, hasta el el momento */

/* "RRpicoMax" es el intervalo desde el ultimo intervalo R-R detec- tado hasta el último pico de señal que se considera prospecto a delimitar un intervalo R-R y "PosPico\lau" es su posición */

84

Page 84: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

int RRpicoMax=O,PosPicoMax~,Pi~,RRpico,Pos; int PendienteNueva,PicoMax=O,PicoMaxRuido=0;

while(O>=(DetecR~,Y, 1))) {

1 Pos = j; Tiempo = j; for(i=J;i<LongCad- lO;i++) c

++j;

if (Tiempo >= Prom2*1.66) { if(!RRpicoMax)

{ T i e m p d ; Pos+;

} else { PendienteNueva = CalPendiente(i,Y); if (PendienteNueva >= (Promedio/(seguidor+ 1)))

Recuadro(i,i,Y, 50); *(IntRR+Ap-RR) = RRpicoMax; RRpicoMax = O; ++Ap-RR; seguidor++; Tiempo = i - PosPicoMax; Pos = PosPlcoMax; Promedio = Promedio + CalPendiente(i,Y); Umbrales( 2, *(Y+PosPicoMax), PicoMaxRuido, &Umbral 1, &Umbral2, &Umbral3); LimitesRR(TntRR,&Prom2);

1 3

1 else

if ((Pico = (DetecPico(i,Y, 1))) > O) { RRpico = i - Pos; /* Pos es la posición del pico anterior */

if ((RRpico > 360íVELMUEST) & (RRpico< Prom2*1.66)) if (pico >= Umbral1 && Pico<= Umbral3)

{ PendienteNueva = CalPendiente(i,Y);

{ if (PendienteNueva >= (Promedio/( seguidor+ 1)))

Recuadro(i,i,Y,SO); *(IntRR+Ap-RR) = RRpico;

Pos = i;

85

Page 85: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

++Ap-m; seguidor++;

Tiempo = O; Promedio = Promedio + CalPen&ente(i,Y); Umbrales( 1 ,Prco,PicoMaxRuido,&UmbralI ,&Umbral2,&Umbral3); LimitesRR(IntRñ,&Prom2);

1 1

else { if (Pico >= Umbral2) c if (pico >= PicoMax) { picoMax=Pico;

PosPicoMax = i ; RRpicoMax = RRpico;

1

1 else if ((RRpico > 200NELMUEST) & (RRpico <= 360NELMUEST)) if (pico>= Umbral 1 && Pico<=Umbral3) { PendienteNueva = CalPendiente(i,Y);

if (PendmteNueva >= (Promedio/(seguidor+ 1))) {

Recuadro(i,i,Y,SO); *(IntRR+Ap-RR) = RRpico.

Pos = i; ++Ap-m;

seguidor++; T i e m p d ; Promedio = Promedio + C ~IPendiente(i,Y); Umbrales( 1 ,Pico, Pi coMaxRuido,&Umbral 1 ,&Umbral2,&Umbral3); LimitesRR(IntRR,&Prom2);

1 else if (Pico >= PicoMaxRuido)

PicoMaxñuido = Pico; 1

1 else Tiempo++;

1 }

............................................................................

* * * FUNCIÓN: ~ a g , t ~ ~ ~ p e c ( ) * * OBJETIVO: Obtiene la magnitud del nrregio complejo sumando el cuadrado de la parte *

real con el cuadrado de In parte imagmaria. * *

86

Page 86: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

ENTRADA: SALIDA:

"TabComp" Arreglo de estructuras que conúenen números complejos. * "ApCadena" Apuntador a la cadena de enteros sin signo que representan

los valores calculados, es decir, la magnitud de cada uno de * *

los complejos. * *

void MagniEspec(stnict Complejo TabComp[TAMCADRR],int *&Cadena) c

int 1=1;

unsigned long int Magnitud; long int factor= 1 ;

do { Magnitud = (sqrt((((TabComp [i] .Real)*(TabComp [i] .Real)) + ((TabComp [i] .hag) *

if(Magmtud>LlMITMAX) {

(TabComp[i] .Imag)))))/factor;

i=l; factor = factor * 10;

1 else { *(ApCadena+i) = (int) Magnitud; i++; 1

} whil e(i <Ap-RR); 1

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * * FUNCIÓN: T D F ~ . *

* transformada discreta de Fourier. * * ENTRADA: " ArrInt" Arreglo de intervalos R-R detectados. *

* OBJETIVO: Obtiene el arreglo complejo de los intervalos R-R por medio de la *

* * * SALIDA: "TabComp" Arreglo complejo correspondiente a los intervalos R-R. *

................................................................................

void TDF(int *ArrInt,stnict Complejo TabComp[TAMCADRR]) { int i j=O;

float SumaReal=O,SumaImag=% float Rea1,Imag;

for(i=O;i<Ap-RR;i++) { for(J=Oj<Ap-RR;j++)

c Real=(*(ArrInt+j))*cos(i*j*2*3.14 16íAp RR); Imag+*(ArrInt+j))* sin(i*j*2*3.14 16/&- - RR); SumaReal = SumaReal + Real; Sumahnag = Sumahnag + h a g ;

1

87

Page 87: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

TabComp[i].Real = SumaReal; TabComp[i].hnag = Sumahnag; SumaReal4, Sumaha@;

1 1

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * * FUNCIÓN: Oper-Complejos0 * * OBJETIVO: Realiza sumas, restas y multiplicaciones con dos números complejos. * * ENTRADA: "PriOper" Primer operando complejo. * * I'SegOperII Segundo operando complejo. * * Wperacionl' Caracter correspondiente a la operación deseada. * * SALIDA: "Oper-Complejo" Número complejo resultante. *

uno para la parte REAL y otro para la parte IMAGINARIA. * OBSERV.: Los números complejos son estructuras que contienen dos datos enteros, * * * * * ................................................................................

struct Complejo Oper-Complejos(COMPLEJ0 *PriOper,COMPLEJO *SegOper,

c struct Complejo Resultado; float temporal 1 ,temporal2,temporal3 ,temporal4; .

char Operacion)

switch (Operation){

case '+I :Resultado.Real = PnOper->Real + SegOper->Real; Resultado.Imag = PriOper->hag + SegOper->Imag; break;

case I-' :Resultado.Real = PriOper->Real- SegOper->Real; Resultado.hnag = PriOper->hag - SegOper->hag; break;

case I*' :temporal 1 = SegOper->Real * PnOper->Real; temporal2 = SegOper->Real * PriOper->hag; temporal3 = SegOper->hag * PriOper->Real; temporal4 = -(SegOper->hag * PriOper->hag);

Resultado.Rea1 = temporal 1 + temporal4; Resuitado.hnag = temporal2 + temporal3; break;

default : break;

return Resultado; }

1

88

Page 88: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * * FUNCIÓN: ibitr() * * * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

int ibitr(int j,int nu) I int j l j j2 , temp;

j l = j ; temp = O; for(i=l ;i<=nu;i++) { j 2 = j l 12 ; temp = temp*2+(j 1-2*j2); j l = j2 ; I

retum(temp); 1

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * FUNCIÓN: F F T ~ *

* transformada Rápida de Fourier. *

* que se trabajara. * SALIDA: "TabComp" Arreglo complejo correspondiente a los intervalos R-R.

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

* OBJETIVO: Obtiene el arregio complejo de los intervalos R-R por medio de la *

* ENTRADA: "ln" Exponente con el que se delimitará el número de intervalos R-R con *

* * *

*

void FFT(struct Complejo TabComp[TAMCADRR],int in) { float PI=3.1416; int 1, 11 Parámetro del arregio 1 a considerar

k waste, P , n2, n u l ,

1,

11 indice del arreglo (arriba hacia abajo) 11 Auxiliar de la potencia de W

I/ Valor potenica de W (W a la p ) I/ Espaciamiento de los nodos duales /I Corrimiento a la derecha en el

I/ calculo del parámetro p 11 Contador que monitorea el numero de 11 pares de nodos duales que han sido I/ considerados

kl ,kln2=0, 11 Variables auxiliares Longitud; 11 Numero de datos

89

Page 89: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

float ar@, // Argumento del seno y del coseno C,S, íí Valores del coseno y del seno trea1,timag; I/ Variables temporales en la

/I transferencia de la parte /I real y parte imaginaria

Longitud = pow(2,Ln); n2 = Longitud2; nul = ln-1; k = 0 ; 1 =o:

do { I++; do { ¡=O; do { i++; waste = k/pow(2,nul); p = ibitr(waste,ln); arg = 2*PI*pLongitud; c = cos(arg); s = sin(arg); kl = k+l; kln2 = kl+n2; treal = TabComp[kln2- I ] Real *c+TabComp[kln2-1].Imag*s; timag = TabComp [kl n2- 1 ] I nia%*c-Ta bComp [k 1112- 1 ].Real*s; TabComp [kln2- 11 .Real = Ta bCornp [k 1 - 1 ] .Real-treal; TabComp [k 1 n2- 11. h a g = Tab C omp [k 1 - 13 .hag-timag; TabComp[kl-l] .Real = TabConip [k 1 - 13 .Real+treal; TabComp [k 1 - 13. h a g = Ta bC ornp [k 1 - 1 1. Imaetimag; k++; } whtle(i<n2); k = k+n2; } whle(k<Longitud);

k = 0 ; nul--; n2 =n2 12; } while(k1n);

k = O; do { k++; i = ibitr(k- 1 ,ln)t 1 ; if(i>k)

c treal = TabComp[k-l].Real;

90

Page 90: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

timag = TabComp[k-l].imag; TabComp [k- 1 3 .Real = TabComp[i- 11 .Real; Tab Comp [k- 1 1. h a g = Tab Comp [i- 1 3 . h a g ; TabComp[i-l].Real = treal; TabComp[i-l].hag = timag; }

} wtule(k<longitud); Ap-RR=Longitud; I

91

Page 91: UNIVERSIDAD AUTONOMA METROPOLITANA …cedip.edu.mx/tesinas/tesis_uam/Electrocardiograma Digital_UAM5523.… · utilizados para la obtención de los intervalos R-R. 1.2 ... las ondas

REFERENCIAS:

[i].- Pan, J. and Tompkins, W. J. 1985. A real-time QRS detection algorithm. IEEE Trans. Biomed. Eng. BME- 32:230-36.

[2].- Friesen G.M. , Janett T.C. , Jadallah M.A., Yates S.L., Quint S.R , Nayle H.T. , "A comparasion of noise sensitivity of nine QRS detection algorithms" , EEE Trans. Biomed. Eng., Vol 37 Pag 85-98, 1990.

[3].- P. M. Mahoudeaux et al., "Simple microprocessor-baded system for on-line ECG analysis", Med. Biol. Eng. Comput., vol. 19, pp. 497-500,1981,

[4].- J. Fraden and M. R. Neuman, "QRS wave detection", Med. Biol. Eng. Comput.,

[5].- D. Gustafson e€ al., "Dual microprocessor system for cardiovascular data acquisition, processing and recording", in Proc. 1981, IEEE Int. Conf. Industrial Elect. Contr. instrument., 1981, pp. 64-69.

[6].- W. P. Holsinger et al., "A QRS processor based on digital difermtiation", IEEE Trans. Biomed. Eng., vol. BME-18, pp. 212-217, 1871.

[7].- R. A. Balda et al., "The Hp ECG analysis program", Trends in Computer- Processed Electrocardiograms, J. H. vanBertme1 and J. L. Wiilems, E&. North

vol. 18, pp. 125132,1980.

Holland, 1977, pp. 197-205. [8].- M. L. Ahistrom and W. J. Tompians, "Automated high-speed analysis of holm

tapes with microcomputers", IEEE Trans. Biomed. Eng., vol. BME-30, pp. 651- 657, Oct. 1983.

[9].- W. A. H. Engelse and C. Zeelenberg, "A simple scan algorithm QRS-detection and feature extraction", IEEE Comput. Card., Long Beach: IEEE Computer Society, 1979, pp. 37-42.

[lo].- M. Okada, "A digital filter for the QRS complex detection", IEEE Trans. Biomed. Eng., vol. BME-26, pp. 700-703, Dec. 1979.

[ 113.- C. R. Meyer and H. N. Keiser, "Electrocardiogram baseline noise estimation and removal using cubic splines and statespace computation techniques", Comput. Biomed. Res., vol. 10, pp. 459-470, 1977. C. S. Wellaver et al., "Dig~tal filtering with aplicationsto electrocardiogram processing", IEEE Trans. Audio Electroacust., vol. AU-16, pp. 350-389, Sept. 1968.

[12].-

[13].- Roe1 W. DeBoer, Jonh M. Karemaker and Jan Strackee, "Comparing spectra of a series of point events particuiarL for heart rate variability data", IEEE Trans. Biomed. Eng., vol. BME-31, pp. 384-387, April 1984.

[ 141.- V. Barbaro, P. Bartohi, M. Fierli, "New algorithm for the detection of the ECG fiducial pomt m the averaging technique", Med. & Biol. Eng. & Comput., 1991, 29, 129-135.

92