ECG Digital
Sistemas Embebidos para Tiempo Real
Grupo 4:
Martín Bertrán
Natalia Martínez
Julián Rodríguez
Tutor: Juan Curto
Facultad de Ingeniería – Instituto de Ingeniería Eléctrica
2
Tabla de contenido
1. Resumen_____________________________________________________3
2. Introducción__________________________________________________3
2.1. Descripción del proyecto____________________________________3
2.2 Antecedentes_______________________________________________4
3. Objetivos_____________________________________________________4
4. Alcance_______________________________________________________4
5. Diseño_______________________________________________________5
6. Procesamiento________________________________________________6
6.1. Introducción______________________________________________6
6.2. Detección RR semillas______________________________________7
6.3. Detección QRS____________________________________________8
6.4. Detección onda T__________________________________________9
7. Implementación______________________________________________10
7.1. Entrada y preprocesamiento de la señal______________________10
7.2. Módulo de control________________________________________10
7.2.1. Inicialización_________________________________________10
7.2.2. Búsqueda en régimen__________________________________11
8. Pruebas_____________________________________________________11
9. Conclusiones________________________________________________13
10. Anexo______________________________________________________14
10.1. Conceptos del curso aplicados al proyecto___________________14
10.2. Especificación de proyecto________________________________15
10.3. Planificación del proyecto_________________________________19
3
1. Resumen
El proyecto se basa en el diseño de un dispositivo capaz de determinar ciertas
características de un ECG a partir de un microcontrolador MSP430F2274.
Se trata de un dispositivo de diagnóstico rápido o para monitoreo de pacientes desde el
hogar, por lo tanto solo se abarca la posibilidad se extraer características básicas que
permiten el diagnóstico de una cantidad acotada de anomalías, como por ejemplo el de
una arritmia.
El dispositivo también debe ser der capaz que comunicar los resultados mediante la
UART para poder compararlos con los obtenidos en Matlab.
En el diseño del control del dispositivo se usaran conceptos aprendidos durante el curso,
como es el caso de las colas y el encolado de funciones o la solución del problema de
datos compartidos.
2. Introducción
2.1. Descripción del proyecto
El proyecto consiste en diseñar la unidad de control de un dispositivo capaz de filtrar
señales de ECG y extraer ciertas características que permitan el diagnóstico rápido de
trastornos básicos o más comunes del corazón.
Figura 2.1: Gráfico normal de un electrocardiograma.
En la Figura 2.1 se observa el aspecto normal de un electrocardiograma.
Las características que abordaremos en el proyecto son las detección del complejo QRS
(onda formada por los puntos QRS), detección de inicio y final del complejo QRS,
detección del pico y final de la inda T.
A partir de esas características se pueden deducir ciertos comportamientos anómalos del
corazón.
Se debe transmitir esta información al usuario a través de una comunicación UART con
el PC.
4
Se deberá de contar con una base de datos que contenga señales ECG para poder
enviarlas mediante comunicación UART y adquirirlas con el instrumento en cuestión.
2.2. Antecedentes
Existen algunas páginas y artículos sobre el tema.
En la misma página de Texas Instrument se encuentra un proyecto completo sobre
detección de ECG.
http://www.ti.com/solution/ecg_electrocardiogram
Nuestro proyecto en particular es mucho acotado que el que se expone allí, por lo tanto
no se usará como referencia.
También se encuentran en internet algunas soluciones a los problemas de detección de
características de la señal.
http://www.tdx.cat/bitstream/handle/10803/6321/03CAPITULO2.pdf?sequence=3
Los algoritmos de búsqueda que usaremos están basados en ese último artículo.
3. Objetivos
Transmitir de forma exitosa números enteros a través de una comunicación
UART.
Procesar los datos y extraer ciertas características de la onda ECG.
Solucionar problemas de datos compartidos entre la ISR y el main.
Realizar el control usando encolado de funciones.
Transmitir los resultados mediante comunicación UART.
4. Alcance
En este proyecto no se abordará el tema de la adquisición de la señal ya que no se
dispone del hardware necesario.
Se cuenta con un banco de señales reales del MIT para poder probar los algoritmos.
Los datos se ingresan mediante una comunicación UART y es de esta misma forma que
se devuelven los resultados. Por lo tanto se tendrá que contar con una terminal en el PC
que sea capaz de enviar y recibir caracteres.
5
5. Diseño
El sistema es el que se muestra en la Figura 5.1.
Figura 5.1: Diagrama del sistema.
La UART se maneja por la ISR y almacena los datos un una cola de char.
Cuando hay un dato disponible se encola una función que convierte los caracteres de
entrada en un entero válido y se almacena en una cola de int.
Cuando hay suficientes enteros se encola el procesamiento, el cual guarda los datos
procesados en el array_w2.
Luego cuando se llega a la cantidad necesaria de datos en array_w2 el control encola la
diferentes funciones de extracción de características y se guardan los resultados.
Para transmitir dichos resultados el control agrega los datos en una cola int y encola una
función que transforma esos datos a caracteres para que se puedan entender al recibirlos.
Dicha función transforma los datos y los guarda en un cola char para su posterior envío
mediante la UART.
La cola de caracteres a la entrada es la única estructura de datos compartida entre la ISR
y el contexto main, por lo que se maneja de manera atómica.
6
La señal preprocesada W2 es leída y escrita desde el contexto main, por lo que no
resulta necesario protegerla contra problema de datos compartidos. Esta se almacena en
una estructura de arreglo circular.
Cada función de extracción de características cuenta con una estructura de datos
definida, esto se hace para poder encolar estas funciones como handlers sin parámetros
de entrada y accesar de manera conveniente a un solo puntero que contenga todos los
datos requeridos para el funcionamiento de la rutina. También simplifica el manejo de
variables e información necesarias para que la rutina Control realice sus tareas.
6. Procesamiento
6.1. Introducción
Para poder extraer las características se usará una transformada wavelet discreta
utilizando la función de Haar mostrada en el figura 6.1.
Fiugra 6.1: Wavelet de Haar.
Simplemente lo que hace esta transformada es tomar diferencias y promedios entre
muestras como se indica en la figura 6.2.
7
Figura 6.2: Transformada wavelet de Haar.
Sobre las señales que resultan se pueden aplicar los algoritmos de búsqueda para la
extracción de características.
6.2. Detección RR semillas.
Primero se busca el máximo en los primeros segundos de la señal para poder definir un
umbral positivo y otro negativo. Luego se buscan los picos positivos y negativos que
superen los umbrales.
8
Figura 6.3: Transformada de Haar de la señal con umbrales marcados.
Figura 6.4: Señal original con los picos detectados.
En la figuras 6.3 se muestra lo picos positivos y negativos que se generan en la
transformada. Cada cruce por cero entre un mínimo y máximo local se corresponde con
el pico R de la señal original, como se muestra en la figura 6.4. Estos primeros picos se
utilizan para definir los intervalos iniciales de búsqueda.
6.3. Detección QRS
Se comienza por detectar el complejo R en un intervalo definido por el último R y el
promedio RR utilizando umbrales como muestra la figura 6.5.
9
Figura 6.5: Detección de QRS.
A partir del pico negativo se busca el cruce por cero anterior a este, lo que se
corresponde con el pico de Q en la señal original.
Del mismo modo se procede para buscar S. Se busca el cruce por cero posterior al
máximo local de la transformada que se corresponde con el pico de S.
Una vez hallado el R se actualizan los umbrales y el intervalo RRav para la próxima
iteración.
6.4. Detección onda T
Para encontrar T se busca en una ventana consecutiva a una R y dependiente de RR.
Figura 6.6: Detección de onda T.
Primero se buscan el máximo y el mínimo de la transformada indicados en la figura 6.6.
Luego el cruce por cero entre esos puntos y el cruce por cero posterior al máximo.
El primer cruce por cero mencionado corresponde con el pico de la onda T y el segundo
cruce por cero se corresponde con el final de la onda T.
10
7. Implementación
7.1. Entrada y preprocesamiento de la señal
Originalmente se pensó en separar cada entero en su byte alto y bajo y enviarlos como
caracteres a través de la UART. Sin embargo, debido a problemas con el envío de
caracteres no imprimibles mediante la terminal serial del PC se cambio de paradigma.
Por lo que finalmente se opto por enviar los enteros de forma literal, enviando el
número 1125 como “1125,”. Esta solución implica mayores tamaños de cola de
recepción y un procesamiento ligeramente más complejo. Sin embargo, se considero la
solución como práctica y viable.
La rutina de atención a la interrupción añade el caracter a la cola Buff_RX y llama a la
función chartoint para que realice la conversión a enteros con cada dato completo
nuevo. Una vez que se cuentan una cierta cantidad de enteros se encola a la función
transformada.
La función transformada realiza la transformada de Haar de nivel 2 de los elementos de
la cola de enteros que utiliza chartoint. Para reducir los requisitos de memoria de esta
rutina se implemento la función sin utilizar bancos de filtros.
Esta función también mantiene un registro activo del último elemento añadido a la cola
de elementos transformados array_w2. Y encola periódicamente al módulo de control.
7.2. Módulo de control
Esta función consta de dos modos fundamentales:
Inicialización
Búsqueda en Régimen
7.2.1. Inicialización
El módulo de inicialización semillas_RR se encarga de detectar el primer complejo RR
una vez que se tienen unos 2 segundos de señal.
Las funciones implementadas dentro del mismo son:
*UmbrIni : Inicialización de umbrales, recorre el arreglo correspondiente a la
transformada dwt-haar de segundo nivel detectando el máximo y el mínimo absoluto. Y
establece los umbrales iniciales como el promedio entre el máximo (mínimo) y una
varianza definida como la suma de los cuadrados sobre número de muestras.
*Calc_Mm: Función encargada de almacenar los máximos y mínimos locales que se
encuentran sobre los umbrales en dos colas de enteros (una correspondiente a máximos
y otra a mínimos).
*ProcMaxmin: Clasifica los máximos y mínimos detectados como parejas (si sus
índices distan menos que una cantidad de muestras) y los guarda en una cola, o como
sin pareja M/m (máximo o mínimo sin pareja) en otra cola.
* ProcSpar: Extrae los elementos sin pareja de las colas (máximo o mínimo) y le asigna
como par el máximo/mínimo que se encuentre mirando unos índices por detrás y unos
11
índices por delante del elemento sin pareja siempre que estos se encuentres sobre un
umbral mínimo (para no caer en la franja de ruido caso en que se descarta el elemento).
Luego se agrega la pareja a la cola correspondiente.
La función Calc_RR se encarga de llamar a estas rutinas y de almacenar los índices en
la dwt-haar de los RR iniciales en una variable del tipo salidaRR_T (char R1, char R2,
char RR). También actualiza los umbrales para el caso en que solo se detecto una pareja
de máximos-mínimos y se deba volver a realizar la búsqueda de estos. Otro caso posible
es que se necesiten mas muestras por lo que hay una variable “flag_masmues” que se
setea en uno cuando se tiene menos de 2 parejas y se llego al mínimo umbral posible
(no se pude seguir disminuyendo porque se entraría en el ruido de la señal).
7.2.2. Búsqueda en régimen
La rutina de control encola de manera secuencial la búsqueda R, Q, S y T, asegurándose
primero que las mismas tengan disponibles los datos necesarios para su ejecución.
Se comunican los resultados obtenidos mediante un puntero a una estructura definida
para cada rutina de búsqueda.
Luego de procesarse un pulso completo QRST los datos obtenidos son convertidos a
char y se encola la función de recepción, la cual se encarga de enviar el primer dato por
la UART y habilitar la ISR de transmisión.
Las rutinas de búsqueda implementan los algoritmos descriptos en la bibliografía
presentada. Pero fundamentalmente solo se requiere manejar correctamente el arreglo
circular de la señal transformada y buscar cruces por ceros, máximos y mínimos en
entornos definidos. Por lo que esas funcionalidades son definidas en el módulo
funciones básicas.
8. Pruebas
Los algoritmos de búsqueda fueron inicialmente implementados en Matlab y testeados
en PC.
Ya con los algoritmos funcionando correctamente se procedió a implementarlos en C y
testearlos usando la herramienta de simulación C-Spy del IDE. Para esta etapa, la señal
se cargó directamente en memoria y se observaron en memoria los resultados obtenidos
por las rutinas de búsqueda. Estos datos se compararon con los obtenidos en Matlab
para asegurarse de que no presentaban diferencias.
La siguiente fase de testeo se dio sobre los módulos de UART y transformada de
HAAR, para lo cual se enviaron 2 horas de señal a través de la UART y se transmitió la
transformada calculada por el micro de nuevo a la PC para ser comparada con la
obtenida mediante Matlab.
Por último se integraron todos los módulos del proyecto y se probó el sistema en su
conjunto, dando como salida las coordenadas de los puntos de comienzo de las etapas
QRS.
A modo de ejemplo se presentan los resultados obtenidos para las señales 103 y 106 del
banco de señales ECG del MIT
12
Figura 8.1: señal 103 del MIT databank procesada y etiquetada.
Figura 8.2: detalle de señal 103 del MIT databank.
13
9. Conclusiones
Se probaron señales del banco de arritmia del MIT tanto en el micro como en matlab y
se obtuvieron resultados razonables con requisitos de procesamiento relativamente bajos
para el procesamiento y extracción de característica de una señal ruidosa.
La arquitectura de encolado de handlers y la modularidad del código hacen factible la
aplicación del proyecto a futuro.
Se debería haber invertido más tiempo de proyecto en mejores unit test para los
módulos por separado, esto hubiera reducido la carga de depurado de código sobre el
final del proyecto
14
10. Anexo
10.1. Conceptos del curso aplicados al proyecto
Comunicación UART de entrada y salida:
Se usaron módulos similares a los implementados para el laboratorio 5. Fue de
especial importancia para este proyecto seleccionar un baud rate que representase la
cadencia real de entrada de información al microcontrolador.
Problemas de datos compartidos:
La comunicación entre los datos obtenidos por la ISR y el contexto main presentaba
problemas de datos compartidos. Por lo cual se opto por implementar colas de datos.
Se opto por colas de datos por sobre otros métodos como semáforos ya que las colas
están adaptadas para bufferear datos de entrada de manera ordenada por lo que se
adaptaban a los requerimientos del sistema muy fácilmente.
Manejo de ISR:
Se opto por una arquitectura basada en encolado de handlers para lograr tener la
mayor flexibilidad a futuro en el agregado de tareas sin tener que estudiar el uso de
un RTOS
15
10.2. Especificación del proyecto
ECG digital
Integrantes:
Martín Bertran
Natalia Martínez
Julián Rodríguez
Tutor:
Juan Curto
Descripción del proyecto:
Diseñar la unidad de control de un dispositivo capaz de filtrar señales de ECG, detectar
frecuencia cardíaca y anomalías básicas.
Figura 1: Gráfico normal de un electrocardiograma.
En la Figura 1 se observa el aspecto normal de un electrocardiograma.
Las características que abordaremos en el proyecto son las detección del complejo QRS
(onda formada por los puntos QRS), detección de inicio y final del complejo QRS,
detección del pico y final de la onda T.
A partir de esas características se pueden deducir ciertos comportamientos anómalos del
corazón.
Se debe transmitir esta información al usuario a través de una pantalla LCD (en caso de
ser posible), o por la UART.
Se trata de un dispositivo de diagnóstico rápido o para monitoreo de pacientes desde el
hogar.
Se cuenta con una base de datos que contiene señales ECG para poder guardarlas en
memoria o a partir de otro procesador poder reproducirlas y así adquirirlas con el
instrumento en cuestión.
16
Antecedentes:
Módulo ECG:
*http://www.ti.com/solution/ecg_electrocardiogram
*Material del curso teórico y práctico de Ingeniería Biomédica referente a
electrocardiograma:
http://www.nib.fmed.edu.uy/curso_ib_2012.html
*Libro : “Ingeniería Biomédica perspectivas desde el Uruguay” compiladas por Franco
Simini.
*Banco de señales del MIT: http://www.physionet.org/physiobank/database/mitdb/
Objetivo del Proyecto:
Se desea lograr una unidad de control capaz de extraer ciertas características de las
señales recibidas usando determinados algoritmos. También se pretende transmitir esta
información al usuario y almacenar la señales en una memoria flash.
Las características a extraer son el comienzo y final del complejo QRS y el pico y el
final de la onda T.
A partir de esas características se pueden deducir ciertos comportamientos anómalos del
corazón, como puede ser una arritmia.
Se cuenta con los algoritmos de detección basados en DWT con onda madre Haar
implementados en Matlab. Entonces como primer objetivo se deberán implementar
estos algoritmos en C.
Luego de calculadas las características se deberá implementar un módulo de trasmisión
de la información adquirida a través de la UART.
También se estudiará la posibilidad de desplegar la onda y la información en un display.
Alcance del Proyecto:
En este proyecto, en principio no se resolverá el problema de la obtención de señales
debido a que no se cuenta con el hardware necesario para la correcta adquisición de las
mismas.
Se tomará una señal del banco y se la guardará en memoria para ser leída directo desde
allí. En una etapa posterior se leeran los datos de la UART conectandose con el PC. Se
estudiara en principio el banco de datos de arritmias del MIT-BIH.
La opción de desplegar datos en un display es algo que se evaluará y determinará con el
correr del proyecto. En caso de no ser posible utilizar un display LCD se evaluaran
opciones como display de 7 segmentos.
Los características extraídas se podrán enviar a través de una comunicación por medio
de la UART.
Descripción del sistema:
El sistema deberá identificar las caracteríticas señaladas de un ECG para poder, a partir
de ellas, detectar anomalías.
Tendrá que poder establecer una comunicación para que se puedan extraer dichos datos.
17
Si es posible la implementación de un display, este deberá mostrar alguna información
en su pantalla.
Figura 2: Diagrama de bloques general del sistema.
Requerimientos y restricciones del sistema:
En principio se supondra que se puede realizar el procesamiento en un MSP430 con
fclock=16MHz. En la primer etapa de evaluacion se pasara el codigo de extraccion de
características a C y se evaluara un estimativo grueso del ciclo de trabajo, en base a este
estimativo se decidira si se cambia a un microprocesador mas potente.
Diseño preliminar:
Hardware Adicional: En principio no se requerira HW adicional, en caso de ser posible
se evaluara añadir un display LCD.
Arquitectura de SW: Se evaluara el uso de una arquitectura basada en encolado de
funciones. Esto presenta una buena escalabilidad sin necesidad de usar un RTOS
Planificación:
Primer semana:
Implementar algoritmos en C.
Evaluar el peso del procesamiento para poder elegir entre el MSP430 o tener que
usar un microprocesador mejor.
18
Segunda semana:
Módulo de comunicación (UART) con preprocesamiento de la entrada.
Presentación de avance.
Tercera semana
Evaluar variacion de performance evaluando paquete MATH.
Módulo clasificador de ECG.
Cuarta y quinta semana:
Estudiar la posibilidad de un display.
Módulo salida al display (en caso de ser posible).
Documentación.
19
10.3. Planificación del proyecto
La planificación original del proyecto es la que se expone en las figuras 10.1 y 10.2.
Figura 10.1: Diagrama de Gant del proyecto.
Figura 10.2: Fechas planificadas de cada tarea.
Si bien las dos primeras semanas se coincidió bastante entre lo planificado y lo
realizado, a partir de la tercera semana se perdió esa similitud.
En parte porque se cambio de microcontrolador por uno cuya comunicación UART se
realizaba mediante el puerto USB y no con el DB9; pero lo que realmente hizo la
diferencia fueron los problemas que iban apareciendo ya con el proyecto avanzado.
Los primeros problemas fueron con la comunicación mediante UART. El problema de
los caracteres no imprimibles y de los tres caracteres iguales seguidos nos hizo perder
tiempo antes de encontrar lo que realmente estaba pasando.
20
Si bien esos problemas eran algo considerables, lo que realmente nos perjudicó fue el
encontrarnos que al unir todo el proyecto luego de haber probado cada parte por
separado, la memoria RAM del microcontrolador no era suficiente. Se tuvo que recortar
el proyecto por todos lados y adaptarlo a esa limitante con el tiempo jugando en contra.
La solución fue reducir todas las colas al máximo, tratando de ocupar solamente el
mínimo espacio necesario. También se cambiaron todos los números de flaot a int con
previa verificación del correcto funcionamiento de los algoritmos de búsqueda.
Otra medida que ayudó fue decimar la entrada, reduciendo así la cantidad muestras.
Utilizando Matlab se filtró la señal con pasabajos a la mitad de la frecuencia anterior y
se tomanron la mitad de las muestras. Se comprobó también que el filtrado no afectaba
el espectro de la señal de interés, por lo que no presentaba ningún cambio visible de
aspecto.
Si bien la búsqueda de la onda T estaba implementada y probada, se tuvo que omitir
para que el proyecto pudiese funcionar en el microcontrolador.
El depurado fue un proceso muy extenso. El depurado que se realizo en una etapa tardia
del proyecto (debido a tests modulares poco exhaustivos) requirio en promedio del
doble o triple de tiempo en aislar y corregir del que hubiese tomado en una detección
más temprana.
Otro aspecto que fue desfavorable con respecto al tiempo fue el estudio del uso de una
pantalla LCD. Se adquirió el hardware, se estudió el protocolo de comunicación y se
armó el circuito para poder conectarlo al microcontrolador, pero luego de muchas
pruebas se decidió abandonar la idea. Solo se determinó que el fracaso fue debido a un
problema eléctrico, ya que la pantalla no reaccionaba frente a los comandos emitidos.
En conclusión el tiempo que llevo realizar el proyecto fue muchas veces mayor al
estimado lo que habrá que tener en cuenta a futuras experiencias.