UNIVERSIDAD DE CASTILLA-LA MANCHA ESCUELA SUPERIOR DE INFORMÁTICA GRADO EN INGENIERÍA INFORMÁTICA TECNOLOGÍA ESPECÍFICA DE TECNOLOGÍAS DE LA INFORMACIÓN TRABAJO FIN DE GRADO SiMoA: Sistema de Monitorización del Asma Cristian Carretón Ruiz Diciembre, 2014 S I M OA: S ISTEMA DE M ONITORIZACIÓN DEL A SMA UNIVERSIDAD DE CASTILLA-LA MANCHA ESCUELA SUPERIOR DE INFORMÁTICA Tecnologías y Sistemas de Información TECNOLOGÍA ESPECÍFICA DE TECNOLOGÍAS DE LA INFORMACIÓN TRABAJO FIN DE GRADO SiMoA: Sistema de Monitorización del Asma Autor: Cristian Carretón Ruiz Director: José Bravo Rodríguez Director: Iván González Díaz Diciembre, 2014 Cristian Carretón Ruiz Ciudad Real – Spain E-mail: Cristian.Carreton@alu.uclm.es Teléfono: 684 078 215 c 2014 Cristian Carretón Ruiz Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License". Se permite la copia, distribución y/o modificación de este documento bajo los términos de la Licencia de Documentación Libre GNU, versión 1.3 o cualquier versión posterior publicada por la Free Software Foundation; sin secciones invariantes. Una copia de esta licencia esta incluida en el apéndice titulado «GNU Free Documentation License». Muchos de los nombres usados por las compañías para diferenciar sus productos y servicios son reclamados como marcas registradas. Allí donde estos nombres aparezcan en este documento, y cuando el autor haya sido informado de esas marcas registradas, los nombres estarán escritos en mayúsculas o como nombres propios. i TRIBUNAL: Presidente: Vocal: Secretario: FECHA DE DEFENSA: CALIFICACIÓN: PRESIDENTE Fdo.: VOCAL SECRETARIO Fdo.: Fdo.: iii Resumen A día de hoy la tecnología que más rápido esta evolucionando en cuanto a potencia y expansión mundial son los smartphones. Normalmente el uso que se le da al teléfono es el que siempre ha tenido que es el de mantener a personas en contactos y en los últimos tiempos con el "boom"de las aplicaciones móviles también como principal dispositivo de ocio. En este Trabajo Fin de Grado (TFG) se quiere ir más allá del entretenimiento y la comunicación, se crea una aplicación dentro del marco m-Health que consiste en hacer de los smartphone un dispositivo sanitario más, ya sea para el control de alguna enfermedad, telemedicina o las múltiples disciplinas que engloba m-Health. La enfermedad que va a ser controlada con esta aplicación es el asma que afecta a millones de personas en todo el mundo y cuyo mejor seguimiento es realizar espirometrías con la mayor frecuencia posible y ver como varía la función pulmonar. Para realizar este seguimiento se ha desarrollado una aplicación que es capaz de determinar el estado respiratorio del paciente sin necesidad de hacer una espirometría forzada que en muchas ocasiones causa crisis asmáticas en enfermos crónicos. Otro aspecto a destacar es la usabilidad ya que los usuarios solamente deben grabarse hablando con el teléfono móvil como si estuvieran realizando una llamada y la herramienta se encargará de facilitar al usuario una estimación de su estado respiratorio. V Abstract Today the technology that is evolving fastest in terms of power and global expansion is mobiles. Normally the use given to the phone is to keep people in contact and in recent times with the boom in apps smartphone has become the main mobile entertainment device. This TFG want to go beyond entertainment and communication, SiMoA is created within the m-Health framework which consists of making the smartphone a medical device plus either control disease, telemedicine or multiple disciplines covered m-Health. The disease which is going to be controlled with this application is asthma that affects millions of people around the world and whose better monitoring is spirometry as often as possible and see how change pulmonary function. To perform this monitoring an application has been developed that is able to determinate the respiratory status of the patient without the need for spirometry that often cause asthma attacks in chronically ill. Another aspect is usability because users only need to be recorded talking with mobile phone as if they were on a call and the tool will provide the user his status. VII Agradecimientos Cuantas vivencias desde la primera vez que entré por la puerta de la ESI, que lejos se veía este momento en aquellos entonces. Han sido años de mucho trabajo y sobre todo de conocer a mucha gente, algunos de los cuales se han convertido en amigos para toda la vida. Cada práctica o cada entrega siempre ha sido una historia, miles de anécdotas que recordaré siempre esos momentos en los que la impotencia era tal que lo único que nos quedaba era ponernos a sordear y así por lo menos se descongestionaba un poco la cabeza y ayudaba a verlo después de otra forma. Agradecer a mi círculo más íntimo de amigos por todo lo que me han dado. César que fue el primero en aparecer y ficharme para sus grupos de física y como pareja en programación, Javi con sus constantes bromas y su perseverancia que nunca da nada por perdido, Jesús que tanto nos ha enseñado y entregas ha salvado como nociones tecnológicas ha dado, Eulalio que siempre estaba disponible pero desde su cuartel general en Las Casas, David con el que sufrí los últimos embistes de la carrera y Rubén con su fiel pijama. Mencionar también a los tortugos que siempre han estado ahí con sus trabajos a última hora y sus fiestas. Eva, tu te mereces un libro para ti solita, podría pasarme la tarde agradeciendote todo lo que has hecho y haces por mi pero me centrare en tu paciencia que cuando la mía se gastaba siempre aportabas de la tuya para salvar cualquier problema que tuviera. Gracias por estar ahí siempre y darme esa calma necesaria para enfrentarse a las cosas que peor se me dan, y sobre todo por soportarme que no es tarea fácil. Mención especial a Iván, sin él todo lo que se redacta a continuación habría sido totalmente imposible de llevarlo a cabo. Te estaré muy agradecido siempre por todo lo que me has ayudado desde que esto echó a andar y por supuesto los mesecitos que te he pegado bombardeandote a correos a todas horas. Por último agradecer su apoyo a toda mi familia y en especial a mis padres que confiaron en mi cuando peor estaba la cosa y lo más fácil hubiera sido traerme de vuelta a casa. A todos los mencionados y a los que queden en el tintero... MUCHAS GRACIAS Cristian IX “En cada lucha aquel que va a muerte es el que gana ese terreno” xi Índice general Resumen V Abstract VII Agradecimientos IX Índice general XIII Índice de cuadros XVII Índice de figuras XIX Índice de listados XXIII Listado de acrónimos XXV 1. Introducción 1 1.1. Contexto del Trabajo Fin de Grado . . . . . . . . . . . . . . . . . . . . . . 1 1.1.1. Asma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.1.2. Extensión del Smartphone y mHealth . . . . . . . . . . . . . . . . 4 1.2. Problema y solución propuesta . . . . . . . . . . . . . . . . . . . . . . . . 6 1.2.1. Descripción del problema . . . . . . . . . . . . . . . . . . . . . . 6 1.2.2. Descripción de la solución . . . . . . . . . . . . . . . . . . . . . . 6 1.3. Estructura del documento . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 2. Objetivos 9 2.1. Hipótesis de trabajo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 2.2. Objetivo general . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 2.3. Objetivos específicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 2.3.1. Relativos a la detección de eventos respiratorios . . . . . . . . . . . 9 2.3.2. Relativos a la valoración del estado respiratorio . . . . . . . . . . . 10 XIII 2.3.3. Relativos a la aplicación Android . . . . . . . . . . . . . . . . . . 10 2.4. Herramientas y medios de trabajo . . . . . . . . . . . . . . . . . . . . . . 10 2.4.1. Lenguajes de programación y sistema operativo . . . . . . . . . . . 10 2.4.2. Medios Hardware . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 2.4.3. Medios Software . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 3. Antecedentes 19 3.1. Aproximación de los valores espirométricos . . . . . . . . . . . . . . . . . 19 3.1.1. Por medio del smartphone sin dispositivos adicionales . . . . . . . 19 3.1.2. Por medio de un hardware específico . . . . . . . . . . . . . . . . 20 3.1.3. Por medio de una aplicación de escritorio y un micrófono . . . . . 20 3.2. Reconocimiento de acciones respiratorias . . . . . . . . . . . . . . . . . . 21 3.3. Monitorización de los valores espirométricos . . . . . . . . . . . . . . . . 21 3.3.1. Concienciación a niños con asma . . . . . . . . . . . . . . . . . . 22 3.3.2. Seguimiento vía Short Message Service (SMS) . . . . . . . . . . . 23 3.4. Diferenciación entre respiraciones sanas y respiraciones con alguna patología 23 3.4.1. Extracción de características en la voz de asmáticos utilizando MFCCs 23 3.4.2. Clasificación de sonidos respiratorios utilizando análisis cepstral y GMM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4. Conceptos específicos del dominio 23 25 4.1. Algoritmo 1: detección de eventos respiratorios en habla continua . . . . . 25 4.1.1. MFCC: Mel Filter Cepstral Coefficents . . . . . . . . . . . . . . . 25 4.1.2. Construcción del template . . . . . . . . . . . . . . . . . . . . . . 28 4.1.3. Primer filtrado de la señal . . . . . . . . . . . . . . . . . . . . . . 30 4.1.4. Delimitación de eventos respiratorios . . . . . . . . . . . . . . . . 33 4.1.5. Segundo filtrado de la señal . . . . . . . . . . . . . . . . . . . . . 36 4.2. Algoritmo 2: Valoración del estado respiratorio del usuario . . . . . . . . . 37 5. Método de trabajo 41 5.1. Metodologías ágiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 5.2. Prototipado evolutivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 5.3. Desarrollo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 5.3.1. Inicio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 5.3.2. Módulo I: Captura señal de audio . . . . . . . . . . . . . . . . . . 43 5.3.3. Módulo II: Espirometría forzada y reconocimiento de eventos respiratorios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 xiv 5.3.4. Módulo IIa: Espirometría forzada . . . . . . . . . . . . . . . . . . 45 5.3.5. Módulo IIb: Obtención de los vectores de características de los Frames 48 5.3.6. Módulo III: Similitud template - muestra . . . . . . . . . . . . . . 52 5.3.7. Módulo IV: Valoración del estado respiratorio del usuario . . . . . 58 5.3.8. Módulo V: Diseño e implementación de la aplicación móvil . . . . 60 5.4. Diagramas UML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 5.4.1. Diagrama de casos de uso . . . . . . . . . . . . . . . . . . . . . . 65 5.4.2. Diagrama de clases . . . . . . . . . . . . . . . . . . . . . . . . . . 65 5.4.3. Diagramas de secuencia . . . . . . . . . . . . . . . . . . . . . . . 66 6. Resultados 69 6.1. Detección de respiraciones . . . . . . . . . . . . . . . . . . . . . . . . . . 69 6.2. Determinación estado respiratorio . . . . . . . . . . . . . . . . . . . . . . 70 6.2.1. Usuarios que presentan asma crónica . . . . . . . . . . . . . . . . 71 6.2.2. Usuarios que presentan asma estacional . . . . . . . . . . . . . . . 72 6.2.3. Usuarios que no presentan asma . . . . . . . . . . . . . . . . . . . 72 7. Conclusiones y propuestas 73 7.1. Limitaciones encontradas . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 7.2. Objetivos alcanzados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 7.3. Propuestas de trabajo futuro . . . . . . . . . . . . . . . . . . . . . . . . . 76 7.4. Publicaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 7.5. Conclusión personal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 Referencias 79 Recogida muestras comparativas: smartphone - espirómetro 85 .1. Recogida correspondiente al trabajo en el módulo IIa . . . . . . . . . . . . 85 .2. Recogida correspondiente al trabajo en el módulo IV . . . . . . . . . . . . 86 Distribución de la carga de trabajo del proyecto 89 Elección conjunto de entrenamiento y cálculo Bm/2 93 xv Índice de cuadros 4.1. Criterios para escoger los límites del evento respiratorio . . . . . . . . . . . 36 5.1. Diferencias entre metodologías ágiles y tradicionales . . . . . . . . . . . . 42 5.2. Relación colores-frecuencias . . . . . . . . . . . . . . . . . . . . . . . . . 46 5.3. Descriptores estadísticos Voz . . . . . . . . . . . . . . . . . . . . . . . . . 56 5.4. Descriptores estadísticos Respiración . . . . . . . . . . . . . . . . . . . . . 56 6.1. Resultados arrojados por el primer algoritmo . . . . . . . . . . . . . . . . 70 6.2. Pruebas finales determinación estado respiratorio . . . . . . . . . . . . . . 72 1. 90 Desglose (en meses) del desarrollo del proyecto . . . . . . . . . . . . . . . XVII Índice de figuras 1.1. Efecto que causa un ataque de asma . . . . . . . . . . . . . . . . . . . . . 2 1.2. Puntos en los que colocar el estetoscopio para realizar la auscultación . . . 3 1.3. Ejemplo de una espirometría en un hospital . . . . . . . . . . . . . . . . . 4 1.4. Medidor glucosa AgaMatrix . . . . . . . . . . . . . . . . . . . . . . . . . 5 1.5. Tensiometro Withings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 1.6. Esquema de la solución propuesta . . . . . . . . . . . . . . . . . . . . . . 7 2.1. Miembros de la Open Handset Alliance . . . . . . . . . . . . . . . . . . . 11 2.2. Arquitectura de Android . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 2.3. Dispositivo Android empleado en el desarrollo . . . . . . . . . . . . . . . 13 2.4. Espirómetro digital portátil SP10 . . . . . . . . . . . . . . . . . . . . . . . 14 2.5. SDK Manager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 2.6. Captura de la herramienta Trello con sus tres tableros . . . . . . . . . . . . 16 3.1. Procedimiento de extracción de características . . . . . . . . . . . . . . . . 20 3.2. Componentes que forman mobileSpiro . . . . . . . . . . . . . . . . . . . . 21 3.3. Diferenciación de silencio inicial - evento respiratorio - silencio final . . . . 22 3.4. Vista del entorno web de CHESS . . . . . . . . . . . . . . . . . . . . . . . 22 3.5. Los 20 primeros coeficientes correspondientes a las personas sanas . . . . . 24 3.6. Los 20 primeros coeficientes correspondientes a las personas asmáticas . . 24 3.7. Ejemplo de gaussianas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 4.1. Obtención del vector de características en base a un sonido . . . . . . . . . 25 4.2. Aplicación método pre-énfasis, donde se enfatizan las frecuencias altas . . . 26 4.3. Gráfico división de la señal en subframes con solapamiento . . . . . . . . . 26 4.4. Ejemplo banco de filtros Mel . . . . . . . . . . . . . . . . . . . . . . . . . 28 4.5. Proceso de multiplicación de filtros y periodograma . . . . . . . . . . . . . 28 4.6. Gráfico formación del cepstrograma a partir coeficientes MFC . . . . . . . 29 4.7. Procedimientos que se aplicarán sobre la señal en este filtro . . . . . . . . . 31 XIX 4.8. Diagrama sobre la delimitación de eventos respiratorios . . . . . . . . . . . 34 4.9. Ejemplo gráfico de peak y deep . . . . . . . . . . . . . . . . . . . . . . . . 35 4.10. Procedimientos a aplicar en el segundo filtrado sobre los candidatos . . . . 37 4.11. Mezcla de tres funciones gaussianas . . . . . . . . . . . . . . . . . . . . . 38 4.12. Esquema funcionamiento EM . . . . . . . . . . . . . . . . . . . . . . . . . 39 4.13. Distribución datos entrenamiento modelo enfermos . . . . . . . . . . . . . 39 5.1. Esquema del funcionamiento del prototipado evolutivo . . . . . . . . . . . 42 5.2. Arquitectura de los módulos que forman la aplicación . . . . . . . . . . . . 43 5.3. Submódulos y resultado del Módulo I: Captura señal de audio . . . . . . . 44 5.4. Espectrograma inicial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 5.5. Filtro 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 5.6. Filtro 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 5.7. Representación gráfica del espectrograma resultante . . . . . . . . . . . . . 47 5.8. Submódulos y resultado del Módulo IIb: Obtención de los vectores de características de los Frames . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 5.9. Ejemplo de muestra recogida por la aplicación: altura, edad, sexo, fecha toma, [asmático/alérgico/sano], estado . . . . . . . . . . . . . . . . . . . . . 49 5.10. Submódulos y resultado del Módulo III: similitud template - muestra . . . . 52 5.11. División en fragmentos respiratorios/voces . . . . . . . . . . . . . . . . . . 54 5.12. Aplicación de filtro de medias de 3 puntos sobre el componente b . . . . . . 57 5.13. Submódulos y resultado del Módulo IV: Valoración del estado respiratorio del usuario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 5.14. Activity inicial de la aplicación e instrucciones de uso . . . . . . . . . . . . 61 5.15. Introducir nombre y comenzar grabación . . . . . . . . . . . . . . . . . . . 62 5.16. Aspecto de la aplicación durante la grabación . . . . . . . . . . . . . . . . 62 5.17. Aspecto de la aplicación tras finalizar la grabación . . . . . . . . . . . . . . 63 5.18. Puntero azul y muestra del segundo que se esta reproduciendo . . . . . . . 63 5.19. Spinner que aparece durante el procesamiento . . . . . . . . . . . . . . . . 64 5.20. Esta activiy muestra los eventos respiratorios detectados . . . . . . . . . . 64 5.21. Spinner que aparece mientras se ejecuta el algoritmo . . . . . . . . . . . . 64 5.22. Activity final en la que se muestra el estado del paciente . . . . . . . . . . 64 5.23. Diagrama de casos de uso SiMoA . . . . . . . . . . . . . . . . . . . . . . 65 5.24. Diagrama de clases algoritmo detección de eventos respiratorios . . . . . . 66 5.25. Diagrama de clases algoritmo determinación del estado respiratorio . . . . 67 5.26. Diagrama de secuencia aplicación filtro 1 . . . . . . . . . . . . . . . . . . 67 5.27. Diagrama de secuencia wav-array float . . . . . . . . . . . . . . . . . . . . 68 xx 6.1. Porcentaje de aciertos en la detección de respiraciones . . . . . . . . . . . 69 6.2. Respiraciones detectadas en pepe.wav . . . . . . . . . . . . . . . . . . . . 71 7.1. Ejemplo grabación iPhone 4S . . . . . . . . . . . . . . . . . . . . . . . . . 73 7.2. Ejemplo grabación Nexus 4 . . . . . . . . . . . . . . . . . . . . . . . . . . 74 3. Datos aportados por los sujetos . . . . . . . . . . . . . . . . . . . . . . . . 86 4. Autorización empleada para obtener el consentimiento de las personas que han colaborado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 5. División del trabajo por meses . . . . . . . . . . . . . . . . . . . . . . . . 91 6. Divisón del trabajo por módulos . . . . . . . . . . . . . . . . . . . . . . . 91 7. Selección de evento respiratorio dentro de un audio . . . . . . . . . . . . . 93 8. Conjunto de entrenamiento seleccionado . . . . . . . . . . . . . . . . . . . 95 xxi Índice de listados 5.1. Representación array con GraphView . . . . . . . . . . . . . . . . . . . . 47 5.2. Métodos calcEnergy y calcZCR . . . . . . . . . . . . . . . . . . . . . . . 53 5.3. Ejemplo de la detección de un posible evento respiratorio entre los segundos 2y3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 5.4. Script cálculo de descriptores estadísticos . . . . . . . . . . . . . . . . . . 55 5.5. Filtro medias 3 puntos en Java . . . . . . . . . . . . . . . . . . . . . . . . 56 5.6. Cálculo similitud con el modelo de los asmáticos . . . . . . . . . . . . . . 59 5.7. Determinar el estado de obstrucción del paciente . . . . . . . . . . . . . . 60 1. Serialización de un objeto BreathTrainingSet . . . . . . . . . . . . . . . . 93 2. Recuperación del objeto serializado . . . . . . . . . . . . . . . . . . . . . 94 XXIII Listado de acrónimos OMS Organización Mundial de la Salud TFG Trabajo Fin de Grado FVC Capacidad vital forzada VC Capacidad vital FEV1 Volumen máximo de aire espirado en el primer segundo PEF Peak flow VAD Voice-Activity-Detection SMS Short Message Service CHESS Comprehensive Health Enhancement Support System MFCC Mel Filter Cepstral Coefficents DCT Discrete Cosine Transform CM Case Management OMS Organización Mundial de la Salud FFT Fast Fourier Transform XXV Capítulo 1 Introducción E este capítulo introductorio se da una idea del contexto en el que se desarrolla el proyecto, así como del problema a tratar y una descripción general de la solución propuesta para dicho problema, que será especificada en siguientes capítulos. N 1.1 Contexto del Trabajo Fin de Grado En estos tiempos, las tecnologías móviles están cada vez más presentes en la vida cotidiana de todo tipo de personas. Rara es la persona que no convive con un teléfono móvil, o más concretamente un smartphone, al que está pegada buena parte del día incluso mientras duerme no se aleja mucho más de un metro de él. Los smartphones se han hecho un hueco en la vida de todas las personas estando presentes en múltiples aspectos de la vida diaria. Permiten la monitorización de la actividad física, sea cual sea gracias a sus múltiples sensores (acelerómetro, giróscopo, gps, ... ); estar en contacto con los seres queridos en tiempo real, estar informados de todo lo que pasa en el mundo con un simple gesto, leer libros, escuchar música, ... un sinfín de posibilidades. Pese a todo el rendimiento que se piensa que se está sacando a estos dispositivos, podrían ofrecer muchas más funcionalidades, y lo que es más importante: convertirse en la herramienta más adecuada para tareas de monitorización continua, durante la vida diaria reduciendo la interacción con ellos a lo más mínimo. Se puede aprovechar la enorme capacidad de cómputo con que cuentan estos terminales, su portabilidad y sus sensores para realizar una correcta monitorización de ciertas enfermedades. En este caso, la enfermedad a controlar es el asma, ya sea crítica o estacionaria, que por razones de las que se hablará en siguientes secciones no es correctamente monitorizada en la mayoría de los casos,lo cuál es crucial a la hora de tratar la enfermedad y de prevenir posibles ataques de asma. 1.1.1 Asma El asma es una enfermedad respiratoria que afecta a unos 235 millones de personas a lo largo de todo el mundo según el último estudio de la Organización Mundial de la Salud (OMS) [WHOb]. Dicha enfermedad se caracteriza por ataques recurrentes de disnea (falta de aire) y sibilancias que varían en función de la severidad del caso. Los ataques de asma provo1 Figura 1.1: Efecto que causa un ataque de asma can la inflamación del revestimiento de los bronquios, lo cual estrecha las vías respiratorias disminuyendo el flujo de aire que entra y sale del pulmón (Figura 1.1 ). En función de la frecuencia o las épocas del año en que se produzcan dichos ataques el asma puede ser crónico o estacionario, debido a algún tipo de alérgeno. Los efectos que estos ataques provocan en las vidas de los que lo padecen son múltiples como pueden ser: dificultad o imposibilidad de la práctica deportiva, dificultad a la hora de realizar cualquier tipo de tarea cotidiana e incluso insomnio ya que los ataques suelen darse durante la noche. Pese a tratarse de una enfermedad crónica no tiene una tasa de mortalidad tan alta como pueden tenerlo otras.Según datos de la OMS en 2005 murieron por asma en el mundo alrededor de 255.000 personas. Cabe destacar que la gran mayoría de las muertes producidas a causa del asma, más del 80 % , tienen lugar en países pobres en los que no se combate adecuadamente ni tienen acceso a la misma tecnología ni medicinas que en países más ricos [WHOa]. El asma no puede curarse, pero si tomar las medidas adecuadas para que una persona que padezca esta enfermedad pueda llevar una vida sin complicaciones a causa de ella. Existen dos tipos de medicamentos para paliar o reducir los ataques de asma [Gun]: De alivio rápido: se deben tomar en caso de ataque de asma y su efecto es inmediato, durando el alivio entre 4 y 6 horas. Relajan los músculos alrededor de las vías respiratorias para así abrirlas y facilitar la respiración. Albuterol. A largo plazo: administrados diariamente para controlar los síntomas críticos. Disminuyen la hinchazón y mucosidades de las vías respiratorias, y previenen los ataques. Inhaladores corticosteroides, broncodilatadores de larga duración. Además de los medicamentos que sirven para paliar los efectos, para realizar un seguimiento de la evolución del asma y ver si los medicamentos que se le han recetado al paciente 2 son los adecuados, se realizan diferentes pruebas para detectar la severidad de la enfermedad mediante algunos de los factores que indican la presencia de asma: 1. Detección de sibilancias: las sibilancias son un sonido silbante y chillón durante la respiración, se da cuando las vías respiratorios muestran alguna estrechez impidiendo el paso normal del flujo respiratorio. Estos sonidos son un signo de que una persona presenta problemas respiratorios. Estos síntomas se suelen identificar mediante auscultación por medio de un estetoscopio por lo que el diagnóstico estará influido por la experiencia, oido y juicio de cada doctor [JZZ09]. Por ello se está investigando en el desarrollo de su detección automática para disminuir la subjetividad de la técnica de auscultación con estetoscopio. En la Figura 1.2 se muestra en los diferentes puntos del cuerpo tanto por delante como por detrás en los que se debe colocar el estetoscopio para realizar la auscultación. Sirviendo también al lector como una pequeña muestra de como se lleva a cabo el procedimiento y con qué material. Figura 1.2: Puntos en los que colocar el estetoscopio para realizar la auscultación 2. Función pulmonar: la espirometría mide algunos de los valores pulmonares del paciente mediante la expulsión forzada del aire. Los valores que arroja una espirometría al uso son: Capacidad vital forzada (FVC) es el volumen de aire expulsado durante la maniobra de espiración forzada. Indica la capacidad pulmonar y se expresa en litros. Capacidad vital (VC) es el volumen inspirado desde una situación de espiración máxima previa hasta la máxima inspiración. 3 Figura 1.3: Ejemplo de una espirometría en un hospital Volumen máximo de aire espirado en el primer segundo (FEV1) es el flujo espirado en un segundo, el primero en concreto. Peak flow (PEF) es el flujo máximo conseguido durante la espiración forzada. 1.1.2 Extensión del Smartphone y mHealth En estos tiempos donde la tecnología avanza día tras día, la medicina se aprovecha de ello para hacer un mejor seguimiento y diagnóstico de sus pacientes. Todas estas prácticas son incluidas en el término m-Health [Bra14], que deriva de e-Health donde se aplican las tecnologías de la información en diferentes escenarios médicos, pero en este caso centrándonos en los dispositivos móviles. Esta práctica, mHealth, ofrece muchas posibilidades como pueden ser: seguimiento de pacientes, recolección de datos clínicos, gestión de historiales o la telemedicina (médico y paciente se comunican, dando el primero un diagnóstico sin ser necesario su presencia en el mismo emplazamiento). Dentro de este TFG se empleará mHealth centrado en la monitorización de variables fisiológicas, existen muchas aplicaciones que incluso han sido aprobadas por doctores como medios para monitorizar multitud de estados fisiológicos. Existen aplicaciones que utilizan periféricos que se conectan al smartphone para controlar estas variables y otras que utilizan directamente los sensores que incluye el teléfono como pueden ser la cámara, el micrófono, el acelerómetro, el giróscopo y otros sensores. Aplicaciones con hardware adicional AgaMatrix + iBGStar: esta combinación de hardware y app se encarga de medir la glucosa en sangre, consiste en un hardware compatible con iPhone 4/4S que se conecta por el puerto inferior y tiene una ranura en la que incluir la tira con la sangre extraída del paciente. Envía la toma a la aplicación que se encarga de registrar el resultado e ir guardando el historial del paciente. Withings Wireless Blood Pressure Monitor: bracalete conectado por Bluetooth com4 Figura 1.4: Medidor glucosa AgaMatrix Figura 1.5: Tensiometro Withings patible con iOS y Android que permite tomar la tensión del paciente junto con una aplicación que marca de distintos colores el estado de su tensión arterial llevando así un seguimiento de su evolución Aplicaciones sin hardware adicional Cardiograph: aplicación que utilizando unicamente la cámara de un iPhone es capaz de determinar las pulsaciones escaneando los cambios de color que se producen en la huella del dedo para determinar la velocidad a la que late el corazón. SpiroSmart: es una aplicación compatible con el sistema operativo iOS, que permite el cálculo de la función pulmonar sin ayuda de ningún hardware especial, mediante un soplido (expiración forzada)sobre el micrófono integrado en los dispositivos. Todas las aplicaciones obedecen al principio de intrusión mínima fijado dentro del marco mHealth. En el caso concreto de este TFG se tratará de conseguir detectar alguna de las irregularidades respiratorias propias del asma en personas utilizando únicamente la entrada de micrófono de un smartphone y el análisis del habla continua para la demarcación exacta de los eventos respiratorios. Con tan solo el uso del micrófono se pueden calcular ,o al menos aproximar, los dos indicativos que se explicaban en la sección anterior, espirometría y sibilancias, pero en este caso, el trabajo se centrará en la clasificación de la respiración del paciente en normal, sana o con algún tipo de obstrucción respiratoria. Sumando a esto la impresionante extensión del smartphone en nuestro país, según datos del informe 2013Spain Digital Future in Focus en Junio de ese mismo año [com], había más de 55 millones de líneas telefónicas contratadas (de los cuales un 66 % son smartphones). También las ventas de tablets en nuestro país se han disparado por lo que una aplicación compatible con móviles y/o tablets podría ser utilizada por un mayor número de personas. La mayor parte de estos dispositivos cuentan con conexión a internet en todo momento mediante 3G o 4G permitiendo mandar y recibir datos a través de la red. Respecto a sistemas operativos, en España Android es el más usado, razón por la cuál es el que se utilizará en este TFG para poder alcanzar el mayor número de dispositivos móviles posible. 5 1.2 Problema y solución propuesta En esta sección se explicará el problema que se pretende resolver con la elaboración de este TFG y la descripción de la solución propuesta. 1.2.1 Descripción del problema Como se ha comentado en la sección anterior acerca de los métodos que existen para detectar el asma o el grado en que esta enfermedad afecta a un paciente destacan el cálculo de la función pulmonar (espirometría) o la detección de sibilancias, entre otros. El problema que trata de solucionar este TFG se desglosa en dos, por un lado la falta de monitorización continua de la enfermedad en gran parte de los enfermos de asma y la ocurrencia de ataques de asma en los enfermos más crónicos mientras realizan el estudio de la función pulmonar. Falta de monitorización continua La mayoría de los enfermos de asma por desgracia no tienen la oportunidad de contar con una monitorización continua de su enfermedad para seguir la evolución de la misma y proporcionar informaicón útil al médico especilista para poder paliarla de la mejor manera posible viendo de que forma afectan unos tratamientos u otros. La causa por la que su enfermedad no es correctamente monitorizada es por la saturación en las listas de espera para ser atendidos por los especialistas, que les llevan a sólo poder hacerse una o dos pruebas a lo largo de todo el año siendo los resultados obtenidos totalmente dependientes del estado del paciente en ese día. No tiene por que ser la tónica habitual en su día a día por lo que el médico le puede dar un tratamiento menos agresivo en caso de tener ese día unos buenos resultados, siendo insuficente para el resto de días o también podría ocurrir todo lo contrario. El paciente podría realizarse esta prueba en casa con cierta frecuencia sirviendose de algún espirómetro doméstico de los múltiples que existen pero no todos arrojan resultados parecidos a los profesionales, así como los prohibitivos precios de algunos de estos aparatos. Crisis asmáticas durante la espirometria El cálculo de la función pulmonar o espirometria donde se obtienen los valores que se han indicado en la sección anterior, es una prueba de esfuerzo en la que se exprimen los pulmones del paciente al máximo. Incluso a personas sin aparentes problemas respiratorios llega a costarles dar todo en esa prueba, los pacientes crónicos pueden padecer ataques de asma durante el transcurso de estas pruebas. 1.2.2 Descripción de la solución La solución que se propone en este TFG es hacer de un elemento tan cotidiano como lo es el teléfono móvil, una herramienta capaz de determinar el estado respiratorio de una persona utilizando solamente una grabación de voz para que los asmáticos (y no asmáticos) lleven siempre consigo el dispositivo y puedan hacer pruebas diarias. 6 Figura 1.6: Esquema de la solución propuesta Esta aplicación ofrecería al paciente una monitorización continua de su enfermedad pudiendo mostrar al neumólogo el estado respiratorio del paciente a lo largo de su utilización. Con estos datos el profesional podría tomar decisiones para prevenir futuros ataques de asma o cambiar de medicación para que ésta resulte más efectiva. Al igual que se ha comentado anteriormente, el producto final de este proyecto sería un aplicación para todo tipo de dispositivos Android (smartphone o tablet) que empleando únicamente el micrófono del terminal y una serie de algoritmos que permitirán la distinción entre fonemas y eventos de respiración asi como la valoración del estado respiratorio del paciente. En la Figura 1.6 se muestra gráficamente el funcionamiento deseado de la solución. 1.3 Estructura del documento Esta sección indica los diferentes capítulos de los que consta el presente documento, así como un pequeño resumen de lo que contiene cada uno de ellos. Capítulo 1: Introducción Es el capítulo en el que se encuentra en este momento, está formado por el contexto del TFG , el problema que se pretende solucionar, la solución que se propone y por último la descripción de la estructura del documento. Capítulo 2: Objetivos Este capítulo contiene la hipótesis de la que se parte en este proyecto, el objetivo general que se desea conseguir y los objetivos específicos. Además de la hipótesis y los objetivos, se explica el lenguaje de programación que se va a emplear y los medios software y hardware que han sido necesarios para conseguir dichos objetivos. Capítulo 3: Antecedentes En el capítulo de Antecedentes se muestran varios trabajos que tienen relación con el asma, ya sean de seguimiento de la enfermedad o relacionados con la aproximación de 7 valores espirométricos. Se explica el método empleado por cada uno y los resultados obtenidos en caso de que se trate de estudios. Capítulo 4: Conceptos específicos del dominio En este capítulo se da una visión general y teórica de los conceptos que se van a aplicar en este proyecto, cuya implementación será explicada con detalle en el Capítulo 5 Capítulo 5: Método de trabajo El capítulo 5 se explica la elección del método de trabajo y se desglosa el proyecto en módulos y submódulos, así como su implementación y desarrollo. Capítulo 6: Resultados En este capítulo se muestra la apariencia final de la aplicación Android y los resultados obtenidos tanto de la aplicación del algoritmo de detección de respiraciones como del segundo algoritmo que determina si existe o no obstrucción respiratoria en los eventos obtenidos en el primer algoritmo. Capítulo 7: Conclusiones y propuestas El capítulo de Conclusiones y Propuestas incluye los problemas que se han encontrado para conseguir los objetivos, qué objetivos se han conseguido y los aspectos que se podrían mejorar de la herramienta resultante. 8 Capítulo 2 Objetivos En este capítulo se expone la hipótesis, objetivos y medios empleados para solucionar el problema mostrado en el capítulo anterior con la solución sugerida. 2.1 Hipótesis de trabajo La posibilidad de monitorizar el estado respiratorio de una persona mediante la única ayuda de un smartphone. 2.2 Objetivo general El objetivo general de SiMoA es diseñar y construir una aplicación para smartphones Android, la cuál sea capaz de clasificar un fragmento de voz continua con eventos respiratorios, dentro de uno de los tres grupos existentes, en función de su estado respiratorio. 2.3 Objetivos específicos El objetivo principal del proyecto es la detección de desordenes respiratorios en el paciente, como se ha expuesto en la sección anterior. Para conseguirlo se han marcado los siguientes objetivos específicos: 2.3.1 Relativos a la detección de eventos respiratorios DET-01: Estudio de trabajos previos relativos a la detección de respiraciones en el habla continua. DET-02: Creación de un conjunto de entrenamiento formado por grabaciones respiratorias que servirán en la fase de entrenamiento del algoritmo de template matching a implementar. DET-03: Obtención de los Mel Filter Cepstral Coefficents (MFCC) que permiten caracterizar cada frame de la muestra de voz continua analizada, a lo que se sumarán otras características en el dominio del tiempo como pueden ser la energía en tiempo corto (short-time energy) y la tasa de cruces por cero de cada frame. Este conjunto de características permitirá hacer el matching con el conjunto de entrenamiento y distinguir eventos respiratorios del resto de fonemas. 9 DET-04: Diferenciación de los diferentes fonemas que formarán la muestra a estudiar, incluyendo la clasificación de cada uno de los fonemas en sonoros, no sonoros o eventos respiratorios. 2.3.2 Relativos a la valoración del estado respiratorio CLA-01: Búsqueda y estudio de trabajos previos en la diferenciación entre personas sanas y asmáticas mediante la voz. CLA-02: Elección de alguna característica de los audios con la cual sean diferenciables las respiraciones normales o sanas de las anormales o con algún tipo de patología respiratoria. CLA-03: Elección de un algoritmo que mediante inteligencia artificial sea capaz de clasificar en sano o asmático un eventos respiratorio ayudandose del conjunto de entrenamiento. CLA-04: Creación de dos conjuntos de entrenamiento bien definidos, uno formado por eventos respiratorios de personas sanas y otro formado por eventos respiratorios de personas que presenten algún tipo de patología respiratoria. 2.3.3 Relativos a la aplicación Android AND-01: Recogida de muestras de audio con el smartphone en un formato fácil de manejar y luego tratar con la señal recibida, sin pérdida de calidad en la señal. AND-02: Desarrollo de una aplicación Android que implemente ambos algoritmos, detección de respiraciones y valoración del estado respiratorio en tres grupos, y además muestre al usuario el resultado de su estudio de forma clara y concisa. 2.4 Herramientas y medios de trabajo 2.4.1 Lenguajes de programación y sistema operativo El sistema operativo elegido para este TFG ha sido Android [And], como ya se ha explicado en la sección 1.1.2. Android Inc. era una pequeña empresa que en 2005 compró Google y puso a sus antiguos empleados a trabajar sobre ella desarrollando una plataforma para dispositivos móviles basada en un kernel Linux que fue llamada Android. El objetivo de Google era crear un sistema flexible y actualizable a diferencia de los dispositivos móviles y sistemas operativos que existían hasta la fecha. En 2007 se crea la Open Handset Alliance (Figura 2.1), un consorcio de empresas relacionadas con la tecnología cuyo objetivo es desarrollar estandard libres/abiertos para dispositivos móviles. Este consorcio dará a conocer Android, al ser un sistema abierto, y hará que sea su sistema operativo por bandera obligando a sus miembros a que cada dispositivo que desarrollen sea compatible con Android. Entrando a un apartado más técnico, la plataforma se compone de varias capas (Figura 2.2): 10 Figura 2.1: Miembros de la Open Handset Alliance Capa del kernel: formada por el kernel, la gestión de memoria, los ajustes de seguridad y los drivers. Capa de librerías y Android Runtime: formada por las librerías, las librerías del núcleo de Java y la máquina virtual (Dalvik Virtual Machine) sobre la cual corren las aplicaciones. A partir de la versión Android 4.4 dicha máquina virtual se puede cambiar a ART. Capa del framework de aplicación: aquí se encuentran las aplicaciones para el manejo básico del dispositivo como la localización de archivos, aplicaciones del teléfono o cambiar de aplicaciones. Capa de aplicación: en esta capa se encuentra la interfaz del usuario, donde puede abrir aplicaciones, realizar llamadas y esos tipos de operaciones. A la hora de elegir un lenguaje de programación para crear la aplicación que correrá sobre la plataforma Android, existen múltiples opciones. La opción oficial, por así decirlo, es programar en Java contando incluso con numerosa documentación en el portal para desarrolladores de Android. Aún así hay otras alternativas que permiten generar aplicaciones Android en otros lenguajes: Basic4Android: es una plataforma que permite crear aplicaciones Android en VisualBasic. Mono: es un complemento para VisualStudio que permite crear aplicaciones utilizando C# y .NET. AppInventor: permite programar de forma gráfica arrastrando bloques sin necesidad de conocer ningún lenguaje de programación. 11 Figura 2.2: Arquitectura de Android PhoneGap: es una plataforma de desarrollo que permite crear aplicaciones utilizando HTML, CSS y Javascript, para luego exportarla a cualquier tipo de sistema operativo móvil (iOS, Android, Windows Phone). La elección en este TFG ha sido Java [GBGG05], este lenguaje de programación de alto nivel fue publicado en 1995 por la compañía Sun Microsystems. Java basa su sintaxis en C y C++ pero tiene muchas menos opciones a bajo nivel. El código Java se compila a bytecode, generando código neutro que puede ser ejecutado en cualquier máquina que cuente con JVM (Java Virtual Machine) sin ningún tipo de problemas de portabilidad. Sólo es necesaria una compilación, si se cambia de máquina no se tiene que recompilar. Java es un lenguaje orientado a objetos, que permite la herencia de una sola clase padre lo que permite múltiples posibilidades a la hora de programar. 2.4.2 Medios Hardware En cuanto a medios hardware, se pueden distinguir tres dispositivos en este proyecto: un ordenador portátil, dos teléfonos móviles y un espirómetro digital portátil. La totalidad del desarrollo del software y redacción de la documentación se ha realizado sobre un ordenador portátil Sony VAIO con las siguientes características: Modelo: Sony VAIO VGN-NS21M R Pentium(R) Dual CPU T3400 @ 2.16GHz x 2 Procesador: Intel 12 Figura 2.3: Dispositivo Android empleado en el desarrollo Memoria RAM: 4 GB Capacidad Disco Duro: 320 GB Sistema Operativo: una partición con Ubuntu 12.04 LTS y otra con Windows 7, ambos de 64 bits La necesidad de un dispositivo Android, para probar y depurar la aplicación se ha cubierto con un dispositivo LG Google Nexus 4 (Figura 2.3): Modelo: LG Google Nexus 4 Procesador: Snapdragon S4 Pro a 1.5GHz Memoria RAM: 2 GB Memoria interna: 16 GB Pantalla: WXGA True HD IPS Plus de 4.7 pulgadas Versión Android: Android KitKat 4.4.4 En la fase de pruebas del algoritmo además de las grabaciones obtenidas con el dispositivo Android también se ha empleado un dispositivo iOS solamente para grabar archivos de sonido y luego probarlos con este algoritmo. El dispositivo ha sido un iPhone 4S. Modelo: Apple Iphone 4S 13 Procesador: Procesador dual-core Apple A5 1GHz Memoria interna: 16 GB Pantalla: TFT IPS con luz LED de fondo touchscreen capacitivo (3,5 pulgadas) Versión iOS: iOS 7 Por último un espirómetro digital SP10(Figura 2.4), para comprobar el estado de los voluntarios con los que se ha ido probando y pidiendo colaboración en el proyecto en ciertos momentos del desarrollo. Figura 2.4: Espirómetro digital portátil SP10 2.4.3 Medios Software El sistema que se pretende desarrollar y la documentación pertinente se llevarán a cabo utilizando las siguientes herramientas software que en la medida de lo posible se ha intentado que sean compatibles con GNU/Linux Ubuntu. Se describirán dichas herramientas dividiéndose en desarrollo de la aplicación por un lado y documentación por otro. Desarrollo y codificación Android Studio: basado en el IDE IntelliJ IDEA, es el entorno de desarrollo creado por Google para crear aplicaciones Android. Ofrece un sistema de generación basado en Gradle que da una mayor flexibilidad al proceso de construcción de la aplicación. Permite ver los cambios en el diseño de la aplicación a medida que se va creando el archivo XML que define cada una de las pantallas de la aplicación (llamadas Activities), así como ver el resultado en distintos dispositivos. Al haber sido desarrollado por Google cuenta con soporte para su plataforma Cloud que facilita la integración con Google App Engine. Por estas y algunas otras ventajas frente al plugin ADT de Eclipse se ha optado por este IDE para este desarrollo. Descargable en [stu]. 14 Figura 2.5: SDK Manager Android SDK: es fundamental para la creación de aplicaciones Android, de la herramienta anterior se puede prescindir pero de esta no. El SDK proporciona las APIs de las diferentes versiones del sistema operativo y las herramientas necesarias para crear aplicaciones, probarlas y depurarlas. Tiene un gestor (Figura 2.5) cuyo servicio es mostrar todos las herramientas de las que se dispone y la versión de cada una de ellas para bajar las que sean necesarias en función a la aplicación que se esté creando. También incluye emuladores con Android para probar las aplicaciones, pero en el caso de este TFG es preferible hacer las pruebas sobre un terminal ya que se necesita acceder a un sensor (el micrófono). Descargable en [sdk] Audacity: es un software libre multiplataforma que permite la grabación y edición de múltiples formatos de audio. Además permite la grabación de varios canales de manera simultánea así como la grabación de muestras de hasta 192,000 Hz llegando a los 384,000 Hz en algunos dispositivos de alta resolución sobre Mac o Linux. Esta herramienta trabaja sobre sus propios proyectos pero da la posibilidad de exportarlos a los formatos tradicionales (wav, aiff, au, flac). En este proyecto se ha empleado Audacity para grabar las primeras muestras de sonido antes de tener dichas funcionalidades implementadas en el sistema así como estudiar las señales gráficamente y localizar coincidencias con los valores que arrojaba el algoritmo de demarcación de eventos respiratorios. Descargable en [aud]. Weka: es un software de libre distribución desarrollado en Java en la Universidad de Waikato que permite analizar datos mediante diversas técnicas de aprendizaje automático. Esta herramienta se ha utilizado para hacer el agrupamiento de las muestras y ver si las entrantes son mas similares a las sanas o a las que corresponden a asmáticos. Utiliza un formato especial de archivo con extensión ARFF (Attribute-Relation File Format) con tres secciones como son el nombre de la relacion (@RELATION), 15 Figura 2.6: Captura de la herramienta Trello con sus tres tableros los diferentes atributos a comparar (@ATTRIBUTE) y los datos que dan valor a esos atributos (@dDATA). Praat: es un software gratuito creado en la Universidad de Amsterdam con el fin de analizar el habla. Esta herramienta permite grabar sonidos y además obtener los espectrogramas generados, analizar la entonación, la intensidad y muchas otras características del habla. El uso que se le ha dado, ha sido el de comparar los valores obtenidos del análisis del habla por el algoritmo del sistema con los valores de este programa. Descargable en [BW]. RStudio: es un IDE que permite la programación y desarrollo de scripts en el lenguaje R. Este lenguaje es uno de los principales utilizados para cálculos estadísticos. En concreto se ha utilizado la versión para GNU/Linux en el cuál se ha creado un script que permite calcular una serie de descriptores estadísticos de varias muestras de datos para poder fijar diferentes umbrales que serán explicados en los siguientes capítulos. Descargable en [rst]. Trello: es una herramienta web que permite la gestión de proyectos, se trata de una aplicación colaborativa que cuenta con tres tableros formados por cartas. Los tableros son: TO DO (por hacer), DOING (haciendo) y DONE (hecho), donde se van poniendo y viendo las tareas y todos los miembros que estén trabajando en el proyecto pueden crear nuevas tareas o arrastrar las existentes al tablero adecuado en caso de que vayan progresando. En este caso sólo hay un miembro trabajando en el proyecto y esta herramienta ha servido para ir planificando los días. Se puede acceder a esta herramienta en [tre]. Meld: consiste en una herramienta para la comparación de documentos línea a línea al estilo del comando diff, pero éste cuenta con interfaz gráfica que facilita su uso coloreando las diferencias. El uso que se le ha dado ha sido en la fase inicial del proyecto durante las pruebas con el módulo I para comparar las cabeceras de los wav y también para las salidas que se obtenían del programa en la fase de pruebas para comparar si los resultados eran iguales. 16 Git: es un software de control de versiones que ha sido empleado a lo largo de todo el desarrollo tanto en la fase de pruebas de los algoritmos en Eclipse con el plugin (eGit) como en el proyecto final ya que AndroidStudio lo tiene incluido y es muy sencillo su manejo para el usuario. Memoria y documentación Kile: editor de LATEXmultiplataforma con licencia GPL, algunas de sus características son: autocompletado de comandos LATEX, coloreado de sintaxis, compilación y conversión en un sólo click, plantillas para facilitar la construcción y vista previa de partes del documento. Se ha utilizado para la completa elaboración de la memoria. Descargable en [kil]. Gimp: herramienta de diseño gráfico con licencia GNU que permite la edición y creación de imágenes digitales. Ha sido utilizada para recortar algunas imágenes que se han incluido tanto en la memoria como en la aplicación, reducir la resolución de algunas otras imágenes, y también para la creación de algunas de las imágenes. Descargable en [gim]. Libre Office Impress: se trata de una herramienta para la creación de presentaciones multimedia, cuenta también con muchas plantillas predefinidas para facilitar el trabajo y algunos efectos para la transición entre diapositivas. En el caso de este proyecto se ha utilizado para crear algunos de los esquemas que aparecerán en forma de imagen a lo largo de la documentación. Descargable en [lib]. Inkscape: herramienta de dibujo vectorial que ha sido utilizada para pasar las imágenes de la memoria al formato .eps y que su calidad fuera mayor para poder hacer zoom en el documento sin perder calidad. Dia: aplicación gráfica de propósito general para la creación de todo tipo de diagramas, en este caso ha sido empleada para la creación de los diagramas de casos de uso, de secuencia y de clases que se muestran en el capítulo 5. Librerías Java Weka-for-Android: es una librería que realiza las mismas funciones que weka pero tiene compatibilidad con Android a diferencia de la librería al uso de Weka. Ofrece resultados casi idénticos a los de la aplicación y esta librería es la que se ha empleado dentro del algoritmo en la aplicación móvil. 17 Capítulo 3 Antecedentes E capítulo incluye algunas nociones sobre el estado del arte de los diversos campos que se tratan en este proyecto. Se han dividido en cuatro secciones: una de aproximación de valores espirométricos, una para la detección de eventos respiratorios, otra de monitorización del asma y por último la que incluye trabajos relativos a la comparación entre eventos respiratorios sanos y eventos respiratorios en personas con algún grado de obstrucción en sus vías respiratorias. En todas las secciones se incluyen casos de estudio para una mejor ilustración. STE 3.1 Aproximación de los valores espirométricos En esta sección se pasará a explicar diversos casos de estudio en los que se calculan ciertos valores espirométricos. En uno de los casos de estudio soplando directamente sobre el smartphone, en otra conectando el smartphone via Bluetooth a un hardware adicional y por último, solamente respirando sobre un micrófono. 3.1.1 Por medio del smartphone sin dispositivos adicionales SpiroSmart [LGB+ 12], es un proyecto de la Universidad de Washington en el que crearon un espirómetro para dispositivos con el sistema operativo iOS. Para ello reunieron a 52 personas para que realizaran grabaciones de sus soplidos sobre el smartphone y además soplar también sobre un espirometro con conexión USB para volcar los datos a un ordenador. Los tres objetivos a aplicar a esas muestras sin calibrar eran: compensar la pérdida de flujo entre la boca y el micrófono, convertir la presión a flujo y quitar el ruido aplicando diversos filtros. El proceso que siguieron para extraer las características de las muestras se puede ver en la Figura 3.1. Una vez ya tenían la señal limpia, mediante machine learning crearon dos modelos de regresión, uno que aproximaba los valores espirométricos y otro que servía para caracterizar la curva resultante de la espirometría. Lograron aproximar los siguientes valores: FVC, FEV1, PEF, FEV1/FVC; comparándolos con los de un espirómetro convencional, nSpire KoKo Legend, demostraron que la media de error con SpiroSmart sólo era de un 5 %. 19 Figura 3.1: Procedimiento de extracción de características 3.1.2 Por medio de un hardware específico MobileSpiro [GPNS11] , trata de dotar a los enfermos de asma de una herramienta que les permita controlar su enfermedad sin necesidad de salir de casa. El proyecto consiste en un dispositivo hardware que se conecta a una aplicación de un smartphone (Android) por medio del Bluetooth, este dispositivo es un tubo que se conecta a una caja negra que ejerce de espirómetro y será quien envíe la señal al smartphone(Figura 3.2). Se utiliza un tubo para aislar la muestra de cualquier ruido externo y tener un soplido unidireccional. Además de servir para la monitorización propia de cada paciente, este proyecto tiene una parte didáctica ya que detecta maniobras erróneas al realizar la espirometría y avisa al paciente de ello. Los comportamientos erróneos que han logrado detectar sus algoritmos son: Tos Inicio lento: el paciente no comienza la maniobra soplando todo lo fuerte que puede Final temprano: si la maniobra después de alcanzar el PEF llega a cero antes de 6 segundos Además de ello proporciona un feedback positivo al paciente porque según se realiza la maniobra se va representando gráficamente el PEF y el FVC. Al final de la maniobra muestra los valores, la gráfica, unos checkbox para facilitar la expresión de su estado, y en caso de haber cometido algún error también se mostraría y se ayudaría a solucionarlo con un consejo. 3.1.3 Por medio de una aplicación de escritorio y un micrófono En el artículo de [AF14] lo que se persigue es facilitar la espirometría para personas con dificultades reduciendo la interacción al mínimo, solamente respirando delante de un micrófono sin necesidad de soplar. Su principal propósito era controlar la capacidad pulmonar de las personas que padecen cáncer de pulmón, pero es aplicable a cualquier enfermedad pul20 Figura 3.2: Componentes que forman mobileSpiro monar. Consiste en estimar la capacidad pulmonar mediante Voice-Activity-Detection (VAD) para detectar los momentos en que el paciente inhala o exhala el aire. Para calcular los valores pulmonares emplean la media de la duración de cada evento respiratorio así como la energía de dichos eventos, después de segmentar la señal en señales más pequeñas para facilitar su estudio. Cuando ya tienen la energía y duración media de los eventos respiratorios aproximan los valores con algunas ecuaciones obtenidas mediante regresión lineal, como por ejemplo: 15e (0,1524h − 0,0214a − 4,65)t (3.1) F V Cm = 100 donde e es la energía de la señal, h es la altura de la persona en pulgadas, a es la edad de la persona en años y t es la media de la duración de las inhalaciones y exhalaciones. Los resultados de este artículo exponen que tiene una alta precisión en sus estimaciones, superando el 85 %. 3.2 Reconocimiento de acciones respiratorias Con el fin de poder calcular los valores relativos a la espirometría y detectarlos en el habla, lo primero que se necesita es distinguir los eventos respiratorios del resto de fonemas. Este trabajo lo realizan en su artículo [RL07] dos miembros del IEEE, cuyo objetivo final era eliminar de las canciones los momentos donde los cantantes inspiran y expiran puesto que a veces resulta antiestético. Se aleja mucho del fin que persigue este proyecto pero el fundamento para detectar los eventos respiratorios es completamente utilizable. Lo primero que hacen es crear un conjunto de ejemplos reconocidos de eventos respiratorios y luego mediante un algoritmo de template matching comparar los ejemplos reconocidos o plantilla, con las muestras recogidas por el micrófono. Utilizan para construir la plantilla, como característica principal, los coeficientes cepstrales de frecuencias en la escala de mel, calculados a partir de las frecuencias en hercios originales que se tienen en un principio. En la Figura 3.3 se muestra gráficamente lo que pretendían detectar con la elaboración de éste proyecto y además de detectarlo eliminarlo. 3.3 Monitorización de los valores espirométricos A diferencia de los trabajos anteriores, se han llevado a cabo investigaciones en las cuales el objetivo era mantener un seguimiento adecuado de la enfermedad de los pacientes. 21 Figura 3.3: Diferenciación de silencio inicial - evento respiratorio - silencio final Figura 3.4: Vista del entorno web de CHESS El producto han sido herramientas tanto para móviles, como páginas web donde los usuarios debían introducir sus valores y/o síntomas respecto a la enfermedad. A continuación se citarán dos trabajos de este tipo. 3.3.1 Concienciación a niños con asma El trabajo de Gustafson et al. [GMA+ 12] forma parte de una completa plataforma de eHealth llamada Comprehensive Health Enhancement Support System (CHESS) a lo que se añade un módulo Case Management (CM). Está dirigido a padres y a niños que no llevan un control adecuado de su enfermedad. Consiste en una página web donde el usuario se registra y dentro de ella puede tener contacto con personas especializadas en el asma, un entrenador personal sobre temas del asma, líneas guía de como tratar el asma y una correcta retroalimentación para que los niños sepan si van en el camino adecuado. Cada mes una enfermera llama a los padres para comentar la evolución del niño, preguntar por la adherencia a los medicamentos recetados al niño y el comportamiento de éste. Para los niños cuenta con juegos y material audiovisual con información sobre su enfermedad para que ellos puedan comprenderla de manera fácil. En la Figura 3.4 se puede apreciar una vista general de la web que vería un usuario de ésta plataforma. 22 3.3.2 Seguimiento vía SMS Con Managing Asthma with Mobile Phones: A Feasibility Study [BP09] se fijó como objetivo mejorar el seguimiento de los enfermos de asma, en este caso la herramienta no tiene incluido ningún tipo de espirómetro ya que es necesario contar con uno convencional. Los pacientes miden su PEF una vez al día y mandan un SMS con el valor obtenido que será recibido por un servidor web. En caso de que el enfermo no hiciera esta medición antes de las 11 de la mañana la aplicación contaba con una alarma para advertirle que debía hacerlo. Estos datos son muy valiosos para los doctores y pacientes a la vez, ya que pueden ver la evolución de la enfermedad y en que fechas son más propensos a tener valores respiratorios negativos. 3.4 Diferenciación entre respiraciones sanas y respiraciones con alguna patología Al ser uno de los objetivos de este trabajo la diferenciación entre respiraciones sanas y respiraciones que presentan algún tipo de patología, se ha investigado en este campo obteniendo como factor común la extracción de características del audio en coeficientes cepstrales o lo que es lo mismo MFCC. 3.4.1 Extracción de características en la voz de asmáticos utilizando MFCCs En este estudio [Rac] llevado a cabo en el DCTM (Delhi College of Technology Management), se pretendía demostrar que los fonemas sonoros podrían ser un factor que diferenciara a un enfermo de asma de una persona sin ningún tipo de problema respiratorio partiendo de la hipótesis de que el uso de corticoides en los asmáticos provoca ciertos defectos y patalogías en los pliegues vocales, que permiten distinguir una voz asmática de una que no lo es. Para caracterizar los fonemas emplearon técnica muy concreta como es la extracción de coeficientes MFCC. Estos coeficientes caracterizan el audio y son muy utilizados en reconocimiento del habla. Los coeficientes MFCC con los que hicieron el estudio, correspondian a la pronunciación de las cinco vocales del español (a,e,i,o,u) tanto de voluntarios sanos como asmáticos, dado que son fonemas sonoros que hacen vibrar los pliegues vocales. Para extraer las características emplearon el software de pruebas con audio mostrado en el capítulo anterior, Praat y después representaron los datos obtenidos con MATLAB. En las Figuras 5.5 y 5.6 se aprecia claramente desde los primeros coeficientes MFCC hay diferencia entre las grabaciones sanas y asmáticas. 3.4.2 Clasificación de sonidos respiratorios utilizando análisis cepstral y GMM M. Bahoura y C. Pelletier [BP04] desarrollaron un algoritmo capaz de clasificar los eventos respiratorios en sanos o asmáticos, para diferenciar a los asmáticos se basaron en los wheezings o sibilancias que se producen en la mayoría de ellos al respirar, como distinción. Estos wheezings o sibilancias son sonidos continuos en determinadas bandas de frecuencia 23 Figura 3.5: Los 20 primeros coeficientes correspondientes a las personas sanas Figura 3.6: Los 20 primeros coeficientes correspondientes a las personas asmáticas que se producen en los asmáticos al estar las vías respiratorias obstruidas.Para detectarlas los médicos emplean auscultación con estetoscopio, pero el diagnóstico depende mucho de la experiencia del médico y de su propio criterio. Por ello desarrollaron este algoritmo que después de dividir una señal de audio en segmentos y obtener los coeficientes MFCC que lo caracterizan, las clasifican en sano o asmático en función de si hay presencia de sibilancias o no. Para clasificar los eventos respiratorios, utilizan modelos de mezclas gaussianas (GMM, Gaussian Mixture Model) los cuales forman un método estadístico de clasificación basado en matrices de medias y covarianza. Se crean dos modelos, uno de respiraciones sanas y otro de respiraciones no sanas para determinar si el audio entrante se clasifica como una respiración normal o por el contrario como una no sana. En la Figura 3.7 se pueden apreciar dos gaussianas, una que representa una respiracion normal (línea sólida) y otra una con sibilancias (línea discontinua). Figura 3.7: Ejemplo de gaussianas En cuanto a los resultados que arroja este algoritmo, utilizaron 12 muestras tanto sanas como con presencia de sibilancias y el algoritmo clasifico todas y cada una en su grupo adecuado. 24 Capítulo 4 Conceptos específicos del dominio E N este capítulo correspondiente a los Conceptos específicos del dominio, se explican los diferentes procedimientos a los que se va a someter el audio grabado que van a permitir el estudio de la señal y el descubrimiento de las características necesarias para solucionar el problema. En el capítulo posterior al presente se expondrán las fases del proyecto y que concepto de los mostrados a continuación se implementan en cada una de las fases. 4.1 Algoritmo 1: detección de eventos respiratorios en habla continua 4.1.1 MFCC: Mel Filter Cepstral Coefficents es un método de extracción de parámetros a una muestra de audio para su mejor representación y estudio. Se basa en el límite de la percepción humana a frecuencias superiores a 1kHz [Rac]. El tratamiento que sigue una señal de audio para obtener su vector de características se encuentra representado en la Figura 4.1. MFCC Figura 4.1: Obtención del vector de características en base a un sonido 25 1. Pre-énfasis: es un método cuyo objetivo es aumentar la energía de la señal correspondiente a las frecuencias altas y atenuar la señal correspondiente a las frecuencias bajas, ya que en éstas se encuentran sonidos que carecen de importancia para el reconocimiento de voz. En la Figura 4.2 se puede observar la aplicación de éste filtro a una señal. Figura 4.2: Aplicación método pre-énfasis, donde se enfatizan las frecuencias altas 2. División de la señal en frames: en esta etapa se coge la entrada de audio y se divide en pequeños frames, de entre 10 y 20 ms, con un solapamiento de alrededor de 5 ms (Figura 4.3). Es decir, suponiendo que se empieza desde cero: a) Frame 1: 0-9 b) Frame 2: 4-14 Figura 4.3: Gráfico división de la señal en subframes con solapamiento Cada uno de estos frames estará formado por un conjunto de muestras (samples) en 26 función de la frecuencia de muestreo a la que se haya grabado la entrada. Para calcular el número de muestras de cada frame se multiplica el tiempo en segundos que dura por la frecuencia de muestreo a la que se ha grabado. Esta etapa es necesaria debido a que la señal de audio, especialmente la voz humana, es una señal cuasiperiódica que guarda la periodicidad sólo en fragmentos de tiempo pequeños. Debido a ello se calculan dichos componentes ventana a ventana, con un solapamiento como se ha indicado para relacionar una ventana con la que le precede y la que le sucede. 3. Ventana de Hamming: a cada uno de los frames anteriormente mencionados, se les aplica una ventana de Hamming, que recorrerá todo el frame al que se aplicará la siguiente fórmula donde N corresponde al número de muestras por frame. La aplicación de ésta ventana de Hamming ayuda a filtrar las frecuencias falsas originadas al efectuar cortes bruscos sobre la señal original en la anterior etapa de división. W (n) = 0,54 − 0,46cos( 2Πn ) N −1 0≤n≤N −1 (4.1) 4. Transformada Rápida de Fourier: se aplica con el objetivo de pasar la muestra de estar en función del tiempo a estar en función de la frecuencia. Dicha operación se realiza con cada uno de los frames, obteniendo una parte real y otra imaginaria de las cuales se calculará su magnitud dando lugar a su periodograma . Se calculará sobre 512 contenedores en los cuales se alojarán las magnitudes calculadas. M agnitud = 1 ∗ (f f t.real)2 + (f f t.imag)2 nf f t (4.2) 5. Procesamiento del filtro Mel: los filtros Mel forman un banco de filtros que es un conjunto de filtros triangulares que se aplican al periodograma obtenido en la fase anterior. La aplicación de estos filtros ayuda a obtener información de una banda de frecuencia en concreto. La forma en que se distribuyen estos filtros entre las frecuencias está basada en como lo interpreta el oído humano. Como se puede observar en la Figura 4.4, a mayores frecuencias menor altura del filtro. En las frecuencias bajas hay mayor densidad de filtros triangulares que en las frecuencias altas, las cuales cuentan con menor cantidad de filtros pero más anchos. Normalmente se consiguen entre 20 y 26 filtros, pero sólo se utilizan los 12 o 13 primeros para calcular los coeficientes, resultando más filtros que coeficientes. De esos 12-13 valores el primero se elimina porque refleja la componente DC de corriente continua de la señal que no aporta nada útil al análisis. Para calcular la energía de cada uno de los filtros, se multiplica cada filtro por el periodograma de la muestra (Figura 4.5) obteniendo un valor por cada filtro que en la siguiente etapa pasará a ser un coeficiente cepstral, actualmente son valores espectrales. 27 Figura 4.4: Ejemplo banco de filtros Mel Figura 4.5: Proceso de multiplicación de filtros y periodograma 6. Log: a cada uno de los valores de energía obtenidos de cada banco, se modifica su escala a una logarítmica para facilitar el manejo de estos valores. Una vez se ha cambiado la escala, los coeficientes espectrales pasan a ser cepstrales. 7. Transformada Discreta del coseno: en esta etapa el espectro Mel se transforma a un dominio temporal mediante el Discrete Cosine Transform (DCT), resultando los MFCCs, también llamados vector acústico que caracterizará cada uno de los frames. 4.1.2 Construcción del template Como se ha indicado en el capítulo de introducción, se va a emplear un algoritmo de template matching. Para la creación de dicho template (o plantilla) se siguen una serie de pasos que se van a explicar a continuación: 1. Obtención de los vectores MFCC: lo primero que se hace es calcular los coeficientes MFCC de todos los elementos de cada subframe del conjunto de ejemplo. Se seguirá el procedimiento que se ha expuesto en la sección anterior, donde se explica todo el procedimiento MFCC. 2. Creación del cepstrograma de cada frame: a este paso se llega con un vector de MFCCs por cada uno de los subframes del conjunto de ejemplo. En este caso se han elegido 28 12 coeficientes MFCC por cada uno de los subframes (10ms) que forman un frame (100ms) con solapamiento incluido. Con todos estos vectores se crea el cepstrograma (Figura 4.6), cada columna del cepstrograma es uno de esos vectores. Por lo tanto el cepstrograma contará con 12 filas y tantas columnas como subframes tenga el frame de 100ms. Figura 4.6: Gráfico formación del cepstrograma a partir coeficientes MFC 3. Cálculo de la media y varianza (elemento a elemento): una vez se tienen los cepstrogramas de todos los frames del conjunto de ejemplo se calcula su media y su varianza, pero no entre matrices sino entre la serie de elementos encontrados en la misma posición de la matriz. Para poder hacer este tipo de operaciones todos los frames y subframes deben tener el mismo tamaño. 2 4 5 7 3 1 M edia = 3 5 7 + 9 8 5 8 1 3 4 6 2 + ··· = 2+7+··· n 3+9+··· n 8+4+··· n 4+3+··· n 5+8+··· n 1+6+··· n 5+1+··· n 7+5+··· n 3+2+··· n donde n es el número de cepstrogramas procedentes del conjunto de ejemplo. 2 4 5 7 3 1 Varianza = 3 5 7 + 9 8 5 8 1 3 4 6 2 P (2−avg)2 +(7−avg)2 +··· n P (3−avg)2 +(9−avg)2 +··· n P (8−avg)2 +(4−avg)2 +··· n + ··· P = (4−avg)2 +(3−avg)2 +··· n P (5−avg)2 +(8−avg)2 +··· n P (1−avg)2 +(6−avg)2 +··· n 29 P (5−avg)2 +(1−avg)2 +··· n P (7−avg)2 +(5−avg)2 +··· n P (3−avg)2 +(2−avg)2 +··· n (4.3) donde n es el número de cepstrogramas procedentes del conjunto de ejemplo y avg es la media correspondiente a esa posición en la matriz. Una vez se han obtenido los cepstrogramas, su media y su varianza ya se puede pasar al procedimiento para calcular la similitud entre la muestra del micrófono y el conjunto de entrenamiento o ejemplo. 4.1.3 Primer filtrado de la señal La entrada que recibe el algoritmo es una señal de audio grabada a una determinada frecuencia de muestreo, que será representada por un array de números en coma flotante con signo (floats en Java). Se dividirá en frames, los cuales se dividirán en subframes con un solapamiento correspondiente a la mitad del tamaño de subframe al igual que se ha explicado en la sección 4.1.1. Tras dividir la señal en frames se calcula el cepstrograma de cada uno de sus frames para después comparar dichos cepstrogramas con el cepstrograma del conjunto de entrenamiento. Cuando ya se tiene el cepstrograma de cada uno de estos "superFrames"se procede a aplicar este primer filtro. Este primer filtro afecta a dos dominios de la señal: 1. Dominio del tiempo, en este dominio se encuentra tanto la energía de corto plazo (short-time energy) como la tasa de cruces por cero (ZCR),se explicarán dentro de los apartados Energía de corto plazo y ZCR. 2. Relacionadas por el cepstrograma, correspondiente al coeficiente Cn que indica la semejanza de la muestra con el conjunto de entrenamiento o plantilla. En la Figura 4.7 se muestra un diagrama con los diferentes procedimientos a los que se someterá la señal y debe superar para que un frame sea considerado como precandidato a respiratorio. Coeficiente de similitud Cp El coeficiente de similitud Cp, ya no corresponde al filtrado relativo al dominio del tiempo de la señal sino que este va enfocado a la comparación de los cepstrogramas que se han calculado previamente. A continuación se describe paso a paso el proceso seguido para calcular éste coeficiente. 1. En primer lugar, se normalizan las diferencias entre el template y el cepstrograma del frame que se está estudiando, con el objetivo de compensar las diferencias en la distribución de los diferentes coeficientes cepstrales. En este paso se emplean la media y la varianza calculadas en la sección Construcción del template, y el cepstrograma obtenido en la sección Fase de detección. Este cálculo al igual que la media y la varianza se hará elemento a elemento, no como se realizan normalmente las operaciones entre 30 Figura 4.7: Procedimientos que se aplicarán sobre la señal en este filtro matrices. La ecuación para obtener la matriz D es: D= M −T V (4.4) donde M es el cepstrograma del frame que se esta analizando, T la media del cepstrograma del template y V la varianza del cepstrograma del template. 2. Después se multiplica cada columna de la matriz D, por una media ventana de Hamming que enfatiza los coeficientes cepstrales más pequeños. Este procedimiento permite una mejor diferenciación de los sonidos respiratorios de los que no lo son [RBH93]. 3. Ahora ya se puede calcular la medida de similitud, Cp, que se calcula tomando la inversa de la suma de cuadrados de todos los elementos de la matriz D. 1 C p = Pn PNc i=1 j=1 |Dij |2 (4.5) donde n es el número de subframes y Nc es el número de coeficientes MFCC calculados para cada frame. Si el valor del Cp es alto indica que el grado de similitud entre el cepstrograma del template y la matriz D son muy parecidos, en cambio si el valor es bajo indica poco grado de similitud entre el cepstrograma del template y la matriz D. Para diferenciar eventos respiratorios de los que no lo son se fijará un umbral para el coeficiente Cp, el cálculo de dicho umbral se explica en el Anexo .2. 31 Energía de corto plazo Cada uno de los frames cuenta con un valor de energía (o short-time energy) que caracteriza a dicho frame, dependiendo del valor de ella se puede considerar a un determinado frame como precandidato a evento respiratorio o no. Para calcular la energía de cada frame se aplica la siguiente fórmula a lo largo de toda la señal: E= X+1) 1 N0 +(N ∗ x2 [n] N n=N0 (4.6) donde x[n] corresponde a la señal de audio en la posición n, N es la longitud del frame y No corresponde a la posición inicial del frame del cual se está calculando su energía. Una vez se ha calculado la energía se pasa a una escala logarítmica aplicando la fórmula: E, dB = 10 ∗ log10 (E) (4.7) Tasa de cruces por cero o Zero Crossing Rate (ZCR) ZCR corresponde al número de veces que la onda de la seña del audio cambia de signo (positiva a negativa, y viceversa). Al igual que la energía también cuenta con una fórmula para su cálculo a lo largo de un frame. +N −1 1 N0X 0,5|sgn(x[n]) − sgn(x[n − 1])| ∗ ZCR = N n=N0 +1 (4.8) El umbral que se utilizará para discriminar entre precandidatos a eventos respiratorios se determinará mediante el proceso mostrado a continuación. Esta clasificación puede no arrojar resultados tan positivos como se esperan, por lo que tiene que pasar por un segundo clasificador que detecta los falsos positivos utilizando los valores del dominio del tiempo que se han mencionado y la duración de los eventos. Proceso de selección de los umbrales sobre las características: Short-time Energy y ZCR, para discriminar entre frames de respiración y frames de voz Con el objetivo de calcular estos umbrales se emplean diferentes cálculos estadísticos sobre una muestra inicial que contengan tanto fragmentos respiratorios como fragmentos de voz. En primer lugar se divide la señal de voz en varios archivos .wav que contengan o bien eventos de voz o bien eventos respiratorios. Para ello se analiza la muestra oyéndola y cortando cada uno de los fragmentos manualmente, además de que gráficamente se puede observar que fragmento corresponde a cada evento (aunque cabel a posibilidad de que las respiraciones sean confundidas con silencios). 32 Para corroborar que las respiraciones elegidas son correctas se aprovecha el primer coeficiente de similitud (entre el conjunto de entrenamiento y la muestra) Cp con valores superiores a Bm/2. Esto puede dar lugar a falsos positivos que se irán eliminando en fases posteriores del proyecto. Además para saber el momento del audio en que se encuentra el evento respiratorio se utiliza la posición dentro del vector inicial y la tasa de muestreo, obteniendo el segundo en que tiene lugar. Una vez se tienen los diferentes archivos .wav tanto de respiraciones como de fonemas se procede a su fragmentación en frames de la misma forma que se ha hecho anteriormente con la entrada de audio inicial. Se calcula el short-time energy y el coeficiente ZCR de cada uno de los frames. Después se juntan todos los datos de energía y ZCR para calcular dichos descriptores estadísticos y ya seleccionar los umbrales más característicos para cada tipo de Frame (fonemas de voz o eventos respiratorios). En el capítulo 5 se explica detalladamente las herramientas e implementaciones necesarias para conseguir los umbrales que se desean. 4.1.4 Delimitación de eventos respiratorios El resultado obtenido de la sección anterior se correspondería con varias sucesiones de subframes considerados precandidatos a evento respiratorio, en esta sección el objetivo es delimitar el inicio y fin de esos eventos empleando los mínimos locales de energía dentro de la muestra. Al igual que en la sección de filtrado anterior, se acompaña de un diagrama que ayuda a su comprensión (Figura 4.8). Filtro de medias de 3 puntos La aplicación del primer filtro de medias consigue suavizar la energía de los subframes, al depender cada subframe de los valores de sus adyacentes tanto a derecha como izquierda. Sólo se aplica al valor de la energía de los subframes, el siguiente filtro afectará a otro atributo diferente. La fórmula que se ha empleado ha sido la siguiente: Energa[i] = Energa[i − 1] + Energa[i] + Energa[i + 1] 3 (4.9) Picos (o peaks) y mínimos (o deeps) Lo primero es indicar a que corresponden estos conceptos y sobre que atributo se aplican. Un pico (o como será referido a lo largo de la memoria, peak ) es un subframe cuyo valor de su energía es mayor que sus valores vecinos tanto a la izquierda como por la derecha. Por el contrario un mínimo (o como será referido a lo largo de la memoria, deep) es un 33 Figura 4.8: Diagrama sobre la delimitación de eventos respiratorios 34 subframe cuyo valor de su energía encuentra entre dos peaks, o lo que es lo mismo sus vecinos inmediatos tanto a la derecha como a la izquierda poseen una energía superior a la suya. En la Figura 4.9 se muestra un ejemplo de un deep entre dos peaks. En el capítulo siguiente se explicará como se ha llevado a cabo la búsqueda tanto de deeps como de peaks. Eliminación de deeps insignificativos Los deeps referidos en la subsección anterior delimitaran tanto el inicio como el fin de los eventos respiratorios, pero no todos los deeps obtenidos se deberán considerar puesto que deben cumplir una condición para ser considerados deeps significativos. Un frame Xk se considera deep significativo si max{E(XL ) − E(XK ), E(XR ) − E(XK )} > (Emax − Emin )/4 (4.10) donde XL y XK son los picos más cercanos tanto a derecha como a izquierda, Emax y Emin son el máximo y el mínimo de la energía en la vecindad de los picos (no sólo los vecinos inmediatos sino un pocos más lejos a ambos lados). Filtro de medianas de 9 puntos El filtro de medianas considera el hecho de que un subframe se marque como respiración o no (1/0) en función de los cuatro subframe que lo preceden y los cuatro que lo suceden. Es decir, un subframe se marcará como respiratorio o no si el cálculo de la mediana entre él y sus ocho vecinos da como resultado 0 o 1, por lo tanto tiene en cuenta la influencia de los frames vecinos. Tras la aplicación de este filtro es cuando ya se marcan las sucesiones de 1s consecutivos como secciones candidatas y las sucesiones de 0s se marcan como eventos no respiratorios. De momento candidatas porque después se calcularán los bordes de dichas respiraciones y quizás puede que ocupen más espacio del que ocupan actualmente, al refinar dichos bordes, pudiendo concatenarse secciones candidatas próximas. Figura 4.9: Ejemplo gráfico de peak y deep 35 Búsqueda de deeps en candidatos y delimitación de candidatos Una vez se tienen determinadas las secuencias de frames respiratorios consecutivos y se han calculado los deeps significantes que existen en la muestra se debe buscar qué deeps están incluidos en cada una de esas secuencias. Esta búsqueda ayudará a definir el inicio y final de las respiraciones sirviendose de un cuadro (Cuadro 4.1) que define unos límites u otros en función del número de deeps que contenga cada una de éstas secciones delimitadas por su inicio y su fin [Xini,Xfin]. Número deeps en el intervalo Ningún deep 1 deep 2 o más deep Decisión El algoritmo busca los deeps más cercanos fuera del intervalo por ambos lados y los marca como límites de la respiración Si tiene un deep se marca este como límite izquierdo de la respiración y se busca a la derecha el deep más cercano fuera del intervalo. En caso de que alguno de los subframes a la derecha del deep incumplan alguno de los umbrales de energía o ZCR, se fijará el deep interior como límite derecho y se buscará el primer deep hacia la izquierda para marcarlo como deep inferior. Se marca como límite izquierdo el deep más cercano al inicio del intervalo y como límite derecho el más cercano al final del intervalo, ambos valores dentro del intervalo Cuadro 4.1: Criterios para escoger los límites del evento respiratorio 4.1.5 Segundo filtrado de la señal Este segundo filtrado se aplicará única y exclusivamente a las secciones candidatas, es decir aquellas sucesiones de unos consecutivas que son referidas como objetos BreathEvent. A diferencia del primer filtrado no va a tener en cuenta ni los cepstrogramas ni el coeficiente Cp, sólo se va a basar en el dominio del tiempo en cuanto a energía, ZCR y duración del evento respiratorio. En la sección anterior se ha explicado en que consiste la energía y ZCR, sólo falta explicar el por qué de un umbral en cuanto a la duración de los eventos candidatos. Se fijan umbrales tanto mínimos como máximos porque se puede dar el caso de que el algoritmo detecte como respiración algunos eventos excesivamente largos (fuera de lo normal) o eventos que son tan pequeños que no es posible que una persona pueda coger aire en fracciones de tiempo tan pequeñas. Los candidatos a respiración que logren pasar este filtro serán finalmente seleccionados como eventos respiratorios, los que no se volverán a marcar como fonemas o eventos no respiratorios. Al elegir los umbrales para este segundo y último filtro para la diferenciación de respiraciones se será especialmente estricto para que los resultados sean lo más robustos 36 posibles, es preferible que detecte menos respiraciones de las que hay con pocos o ningunos falsos positivos a que detecte todas las respiraciones existentes en la grabación pero con una mayor existencia de falsos positivos. Esta parte es muy delicada porque no es sólo la salida de este algoritmo sino también la entrada del siguiente, cuanto mejor delimite este algoritmo mejores resultados se obtendrán del segundo. A continuación se muestra un gráfico (Figura 4.10) con los diferentes procedimientos que debe superar cada uno de los breathEvents para poder se considerados respiración. Figura 4.10: Procedimientos a aplicar en el segundo filtrado sobre los candidatos 4.2 Algoritmo 2: Valoración del estado respiratorio del usuario Este segundo algoritmo se encargará de determinar el estado respiratorio del usuario en base a los eventos que fueron detectados y delimitados por el primero de los algoritmos. Como se ha comentado en la sección anterior, es crucial garantizar la robustez en la detección y demarcación de los eventos respiratorios que proporciona el primer algoritmo, puesto que dichos eventos constituirán la entrada del segundo algoritmo. En este sentido, hay que evitar la aparición de “falsos positivos” entre los eventos respiratorios detectados, es decir, es preferible perder agudeza en la detección de los eventos (creciendo el número de "falsos negativos"), haciendo más restrictiva la configuración del primer algoritmo, de modo que, aunque su salida no proporcione todos las respiraciones que ocurrieron durante el habla continua, sí que se detecten aquellas en las que se tiene una mayor certeza de que no serán eventos de voz u otro tipo, distinto de los de respiración. Así se evita, en cierta medida, que fonemas de voz mal identificados como respiraciones alimenten la entrada del algoritmo de 37 valoración del estado respiratorio. El vector de características elegido para discriminar entre los estado respiratorios: bueno, normal y con dificultad respiratoria se construye a partir de los coeficientes MFCC de los frames que componen los eventos respiratorios, que ya han sido calculados por el algoritmo anterior. El hecho de haber elegido los coeficientes MFCC es porque se han estudiado varios artículos en los que se demuestra diferencias claras entre respiraciones normales y anormales, siendo el más representativo [Rac]. Se ha optado por utilizar modelos de mezclas gaussianas (GMM) para caracterizar tanto un modelo de respiraciones normales como un modelo de respiraciones anormales (asma, bronquitis, ... alguna enfermedad pulmonar) al igual que lo realizan en el artículo [BP04]. Los modelos de mezclas gaussianas (GMM, gaussian mixture model) [JC08] nos permiten la clasificación de rasgos acústicos reflejando las características de la locución de forma estadística. Para ello realizan una suma ponderada (mezcla) de funciones de densidad de probabilidad gaussianas, lo permite representar alguna característica de la locución humana con alta fidelidad. En este caso se ha optado por la caracterización mediante coeficientes MFCC. Este método también se emplea para el reconocimiento del locutor en una audición [RQD00] debido a su gran resolución. En la Figura 4.11 se muestra un ejemplo de como se ha modelado una curva de función de densidad de probabilidad mediante una mezcla de tres funciones gaussianas. Figura 4.11: Mezcla de tres funciones gaussianas Para entrenar cada una de las distribuciones tanto de respiraciones buenas como anormales, se han creado dos modelos independientes. Se utiliza el algoritmo de entrenamiento EM (Expectation Maximization) con un conjunto de datos recopilado de personas con alguna enfermedad pulmonar para un modelo; y con personas sanas para el otro de los modelos. Este algoritmo EM se encarga de adaptar los parámetros estadísticos (media y varianza) que 38 definen cada gaussiana al conjunto de entrenamiento para lograr el mejor ajuste entre los datos en bruto y el modelo. Su nombre viene dado porque es un algoritmo iterativo dividido en dos pasos, Expectation y Maximization, lo que tiene lugar en cada uno de los pasos se puede apreciar en la Figura 4.12. Figura 4.12: Esquema funcionamiento EM En la Figura 4.13 se puede observar como se distribuyen los datos correspondientes al conjunto de entrenamiento del modelo de respiraciones con alguna enfermedad. Figura 4.13: Distribución datos entrenamiento modelo enfermos Una característica del modelo de gaussianas que va a determinar tanto la calidad de los resultados como el tiempo de cómputo necesario para obtenerlos será el número de gaussianas a emplear. Debe elegirse la cantidad adecuada ya que si se escogen muchas gaussianas se sobreajustaría la distribución y en caso de que las gaussianas elegidas fueran pocas no sería lo suficientemente flexible como para describir la distribución de los datos. Es decir cuantas más compenentes gaussianas mejor, pero llega a un punto en que son excesivas y los resultados no son los deseados. Para el caso particular que aquí nos ocupa, tras algunas pruebas empíricas, los mejores modelos de mezclas gaussianas (en términos de la relación entre precisión de la estimación y tiempo necesario para su entrenamiento) tanto para “respiraciones normales” y “respiraciones anormales”, se han obtenido empleando 16 gaussianas. Una vez entrenada y caracterizada cada distribución GMM, el objetivo será fijar un coeficiente de similitud que nos indique el grado de similitud de un conjunto de eventos respiratorios de prueba (proveniente de la aplicación del primer algoritmo de demarcación de 39 eventos respiratorios durante habla continua), con respecto de cada una de las distribuciones modeladas. En otras palabras el coeficiente nos proporciona una medida de “cómo de bien” se ajustan los eventos respiratorios identificados y delimitados por el primer algoritmo con uno y otro modelo de gaussianas. El índice de similitud estimado por Weka (Log likely-hood) para las muestras de test con respecto del modelo de “respiraciones normales” y con respecto del modelo de “respiraciones anormales” que sea más próximo a 0 determinará el estado respiratorio del usuario en ese momento. Entrando un poco más en detalle, en como se construye el coeficiente de similitud final, el proceso consiste en dividir el mayor de los valores de ajuste obtenidos entre el menor de los valores de ajuste del otro modelo y si el resultado está en [1, 1.05] se define como un estado respiratorio normal. En el caso de que el mayor de los valores sea el que exprese la similitud con las respiraciones normales y el coeficiente sea mayor a 1.05 se define como estado respiratorio bueno, y por último en caso de que el mayor de los valores sea el que exprese la similitud con las respiraciones anormales y el coeficiente sea mayor a 1.05 se define como estado con dificultad respiratoria. A pesar de las medidas tomadas para garantizar la robustez de los eventos respiratorios identificados y demarcados por el primer algoritmo que sirven de entrada al algoritmo de valoración del estado respiratorio, es posible que se lleguen a calcular los coeficientes de similitud sobre un “falso evento respiratorio”, respecto de los dos GMM (“respiraciones normales” y “respiraciones anormales”), para evitar su mala influencia sobre el resultado de valoración del estado respiratorio se cogerá la mediana de los coeficientes de similitud calculados sobre cada una de las muestras que componen el conjunto de test. No se emplea la media porque se ve más afectada por los valores atípicos que puede causar algún falso evento respiratorio. 40 Capítulo 5 Método de trabajo E este capítulo correspondiente al método de trabajo se dan las razones acerca de porque ha sido escogido uno en concreto, las ventajas que aporta y que procesos ha incluido cada una de las iteraciones. N 5.1 Metodologías ágiles El término ágil como tipo de metodología de desarrollo software se acuñó en 2001, en una reunión celebrada en Utah donde se concentraron 17 expertos del software. El objetivo principal de esta nueva metodología era dar la posibilidad de desarrollar software rápidamente y permitiendo aplicar cambios que surgieran a medida que avanzaba el proyecto. En contraposición las metodologías anteriores eran muy rígidas ya que todo estaba fijado en un contrato y la inserción de cambios era bastante complicada. Tras la citada reunión se creó una asociación (The Agile Alliance) que se dedica a promover y ayudar a las organizaciones a emplear este tipo de metodologías. Con el objetivo de dejar constancia de los principios que envuelven a las metodologías ágiles se creo el Manifiesto Ágil ([PL03]). A continuación se muestra una tabla con las ventajas de las metodologías ágiles con respecto a las tradicionales 5.1 5.2 Prototipado evolutivo El aspecto principal que define este método de trabajo es que el concepto de sistema de desarrolla a medida que avanza el proyecto. El equipo de desarrolladores crea diseña y construye un prototipo, que muestra al cliente y este da su opinión; la ventaja es que el equipo recibe la retroalimentación del cliente para bien corregir errores y volver a mostrárselo o directamente incluirlo en el sistema final (Figura 5.1). Cada vez que se llega a una entrevista con el cliente, si el prototipo es suficientemente bueno para el cliente, dicho prototipo pasa a ser parte del producto final e incluso es operativo para ponerse en funcionamiento con información real. Este tipo de prototipado se utiliza especialmente cuando los requisitos cambian con rapidez, el usuario no se muestra voluntarioso para facilitar todos los requisitos del sistema completo, o cuando ni el desarrollador ni el usuario tienen muy claro el área que abarcará el sistema. La razón principal por la que en 41 Metodologías ágiles Metodologías Tradicionales Basadas en heurísticas provenientes de prácticas de producción de código Especialmente preparados para cambios durante el proyecto Impuesta por el equipo de desarrollo Basadas en normas provenientes de estándares seguidos por el entorno de desarrollo Cierta resistencia a los cambios Impuestas externamente Proceso mucho más controlado, sigue normas Proceso menos controlado, pocos principios y políticas Ausencia de contrato y en caso de existir muy flexible Existe un contrato prefijado El cliente sólo se comunica con el equipo mediante El cliente es parte del equipo de desarrollo reuniones Grupos pequeños que trabajan en el mismo sitio Grupos grandes y distribuidos Pocos artefactos Más artefactos Pocos roles Más roles La arquitectura del software es esencial y se expresa Menos énfasis en la arquitectura del software mediante modelos Cuadro 5.1: Diferencias entre metodologías ágiles y tradicionales Figura 5.1: Esquema del funcionamiento del prototipado evolutivo 42 Figura 5.2: Arquitectura de los módulos que forman la aplicación este proyecto se ha optado por el prototipado evolutivo es cuando no se está muy seguro de la arquitectura o cuando hay dudas acerca de los algoritmos a implementar. Con esta técnica si la opción de un algoritmo resulta no ser la deseada, se desecha para en la siguiente iteración o prototipo entre una una opción. 5.3 Desarrollo 5.3.1 Inicio El inicio del presente proyecto tuvo lugar en Octubre de 2013, esta etapa incluye la búsqueda información acerca de las diferentes posibilidades que existían para crear un espirómetro en una plataforma móvil. Después de buscar información se llevo a cabo un estudio sobre ella y se decidió hacer sobre el sistema operativo Android y siguiendo como patrón el artículo SpiroSmart [LGB+ 12]. En las siguientes subsecciones se expondrá el desarrollo de los diferentes módulos del proyecto (Figura 5.2) , compuestos de varios submódulos en función de la complejidad del mismo. 5.3.2 Módulo I: Captura señal de audio Como primer paso para el desarrollo de este TFG se necesitaba partir de una señal la cual analizar y de ahí extraer los parámetros que caracterizaban el soplido del usuario. Este módulo se ha dividido en dos submódulos explicados en los puntos sucesivos. La descomposición en submódulos se puede ver gráficamente en la Figura 5.3 . 43 Figura 5.3: Submódulos y resultado del Módulo I: Captura señal de audio Submódulo A: Captura y almacenamiento de señal en formato WAV El inicio de todo es poder acceder al micrófono para guardar los datos que reciba por parte del usuario. Para ello se ha hecho uso de la clase AudioRecord de Android que permite capturar los sonidos del micrófono pudiendo configurar diferentes parámetros como son: Origen de la muestra: en este caso se ha elegido el micrófono, pero hay varias opciones (micrófono en la misma orientación que la cámara, llamada de voz, comunicaciones sobre voIP) Tasa de muestreo: se indica el número de muestras por segundo que se quieren tomar. Canales: se indica si se quiere un canal (mono) o varios (stereo) Formato representación del audio: se puede elegir entre PCM a 8 bits o a 16 bits. Tamaño del buffer: aquí se indica el tamaño del buffer sobre el que se quiere grabar la muestra. Una vez se ha grabado la muestra en el archivo, se le añade la cabecera correspondiente al formato WAV, que ofrece diferentes ventajas a la hora de analizar la muestra sin pérdida de calidad del sonido. El Activity prinicipal de grabación crea una instancia de la clase EnviromentRecorder que será la encargada de transformar el flujo de datos procedente del usuario en un archivo de audio wav. Submódulo B: Manejo de un audio wav como array de floats La relación de éste submódulo con el anterior es que la salida del anterior (archivo WAV) se utiliza como entrada para éste. El submódulo B se encarga de pasar el archivo WAV a un array de floats que representarán la señal del audio. De ello se encarga la clase WaveTools.java, que lee la ruta de un archivo WAV que se le pasa como parámetro y lo convierte en un array números en coma flotante con signo (tipo float en Java). Primero lee la cabecera para saber la tasa de muestreo, del tipo de archivo que se trata y los canales que tiene, una vez tiene esa información recoge porción a porción todo el audio. Como resultado final se tiene un arreglo de floats con signo, indicando las amplitudes de todos los componentes de la muestra. 44 Figura 5.4: Espectrograma inicial 5.3.3 Módulo II: Espirometría forzada y reconocimiento de eventos respiratorios El Módulo II se encargará de tratar la señal recibida del Módulo I para poder extraer los eventos respiratorios necesarios. Al igual que el primer módulo se divide en varios módulos cuyas entradas y salidas corresponden, es decir, la entrada de un submódulo B es la salida del submódulo A. 5.3.4 Módulo IIa: Espirometría forzada Submódulo A: Generación espectrograma Se recibe una señal en el dominio del tiempo de la cual se tiene que calcular su espectrograma. El citado espectrograma es el resultado de calcular el espectro de tramas enventanadas de una señal, resultando una gráfica tridimensional que representa la energía del contenido frecuencial de la señal según va variando a lo largo del tiempo. El objetivo del uso del espectrograma es calcular el espectro de la señal en diferentes fragmentos de tiempos consecutivos para caracterizar la señal. Para poder calcular el espectrograma lo primero que se ha realizado ha sido fragmentar la señal en pequeños segmentos solapados y enventanar cada uno utilizando la ventana de Hamming. Tras ello aplicar la Transformada Rápida de Fourier a cada muestra, que transforma el dominio de la señal, pasando de ser el tiempo a ser un dominio de frecuencias. Después de calcular la Fast Fourier Transform (FFT) a cada muestra se obtiene un número complejo, al cual hay que extraer su espectro elevando al cuadrado tanto la parte real como la imaginaria. Una vez se ha obtenido el espectro se calcula el logaritmo en base 10 al resultado de la operación anterior y se coloca en su intervalo de frecuencias correspondiente (al aplicar la FFT generalmente se divide el espacio de frecuencias en 256 o 512 intervalos). Si se representa la magnitud de los espectros poniendo cada uno consecutivo del otro en el tiempo (eje X), en el eje Y los rangos de frecuencias y en el eje Z las magnitudes obtenidas para cada frecuencia se obtiene el espectrograma (Figura 5.4). Los colores de cada uno de los puntos que existen en el gráfico son la amplitud de cada frecuencia ordenados así, Cuadro 5.2. 45 Color Rango Valores descartados o filtrados Magnitudes entre 0 y 10 Magnitudes entre 10 y 20 Magnitudes entre 20 y 30 Magnitudes >30 Cuadro 5.2: Relación colores-frecuencias A simple vista se puede apreciar que hay muchos valores negros y verdes, los cuales representan los rangos de frecuencia con magnitudes muy bajas. Para eliminar todo este ruido y sólo dar cabida en el espectrograma a los valores significativos se desarrolla el segundo submódulo que incluye varios filtros. Submódulo B: Aplicación filtros al espectrograma En este submódulo lo que se pretende es eliminar esos rangos de frecuencia con poca energía localizada. Se han empleado dos filtros: 1. Filtrado por columnas: consiste en recorrer cada una de las columnas del espectrograma, e ir eliminando los valores inferiores al 30 % del valor máximo de la columna. El resultado con respecto al espectrograma que se muestra en el apartado anterior, se puede ver en la Figura 5.5. 2. Filtrado bandas de energía: este filtro de lo que se encarga es de recorrer el espectrograma por cada rango de frecuencia (fila) y descartar los valores de magnitud aislados que no conformen una ráfaga continua de energía de al menos 300 ms con valores de magnitud significativos en un determinado rango de frecuencias. Una vez se ha aplicado el primer filtro el resultado del espectrograma inicial se corresponde con la Figura 5.5, después se aplica el segundo filtro teniendo como resultado la Figura 5.6. 46 Figura 5.5: Filtro 1 Figura 5.6: Filtro 2 Figura 5.7: Representación gráfica del espectrograma resultante Submódulo C: Representación gráfica muestra El último paso dentro de este submódulo consiste en la creación de una gráfica basada en el espectrograma final, tras aplicarle los dos filtros de los que se ha hablado en el submódulo anterior. Para ello el procedimiento que se ha seguido ha sido recorrer todo el espectrograma y calculando en cada columna de tiempo una media ponderada en función de la magnitud de la frecuencia en cada uno de los puntos, ésta frecuencia abarca desde 0 hasta el número de filas de la matriz. X columna[i] ∗ f ila[j] X media[j] = columna[i] Finalmente se obtiene un array unidimensional de floats que contiene la media ponderada de cada columna listos para su representación gráfica. La realización de la gráfica en base al array obtenido se ha llevado a cabo gracias a una librería de Android llamada GraphView (enlace), esta librería permite la generación de múltiples tipos de gráficos de manera sencilla incluso permitiendo que éstos gráficos sean dinámicos (se puede hacer zoom en ellos). La gráfica resultante del ejemplo con el que se viene desarrollando este módulo es la Figura 3. En el Listado 5.1 se muestra el código necesario para la representación. GraphViewData [] data = new GraphViewData [ mediasPon . length ]; for ( int i =0; i < data . length ; i ++) { data [ i ]= new GraphViewData (i , mediasPon [ i ]) ; } GraphView graphView = new LineGraphView ( this , " E s p i r o m e t r a " ); graphView . addSeries ( new GraphViewSeries ( data ) ) ; // data graphView . s e t M a n u a l Y A x i s B o u n d s (350 , 0) ; 47 LinearLayout layout = ( LinearLayout ) findViewById ( R . id . graph1 ) ; layout . addView ( graphView ) ; Listado 5.1: Representación array con GraphView Una vez que ya se había logrado toda esta representación se añadió a la aplicación una pequeña base de datos SQLite en la que se añadían varios datos de cada muestra que se hola mamitomaba. Todo esto era necesario para iniciar una recolección de muestras e ir comprobando como se comporta la aplicación. En la toma de muestras se realizaba una muestra sobre el smartphone por espirometría forzada y otra muestra sobre el espirómetro indicado en el capítulo 2. Tras haber realizado dichas muestras se llegó a la conclusión que los datos que se recibían en uno y otro no eran equiparables como para poder arrojar valores espirométricos fiables. Debido a ello se continuó con la investigación para ver de que forma se podían aproximar esos valores utilizando el smartphone. 5.3.5 Módulo IIb: Obtención de los vectores de características de los Frames En este módulo se explican las decisiones tomadas tras descartar el módulo IIa y el por qué se procede de dicha manera, además de exponer los submódulos que formarán el nuevo módulo. La descomposición en submódulos se puede ver gráficamente en la Figura 5.8 . Figura 5.8: Submódulos y resultado del Módulo IIb: Obtención de los vectores de características de los Frames Submódulo A: Cambio de dirección El resultado fue la nueva idea de detectar los eventos respiratorios en el habla, con técnicas que se explicarán a continuación y una vez se tuvieran dichos eventos su duración y energía aproximar los valores con ecuaciones ya existentes que relacionan los parámetros 48 Figura 5.9: Ejemplo de muestra recogida por la aplicación: altura, edad, sexo, fecha toma, [asmático/alérgico/sano], estado mencionados. Inicialmente se tomó la decisión de detectar los eventos respiratorios en el habla mediante el entrenamiento de un algoritmo con muchas muestras de diferentes sujetos variando sexo, edad, altura, peso, etc (Figura 5.9). Para ello se desarrolló una aplicación Android que lo único que hacía era que el usuario grabara un par de oraciones con alto contenido de vocales, y una vez grabadas se mandaba a una base de datos dentro del servidor de MAmI. La aplicación se puso en la tienda de Android, Google Play, con el nombre de Asma-Alergia-Voz, y se notificó a varias asociaciones de asmáticos y alérgicos de España y Chile resultando la toma de muestras muy participativa. Sin embargo de todas las 304 muestras que se encuentran en la base de datos muchas de ellas no son muestras correctas: son silencios, dicen otras frases, las dicen muy bajo, y diversas causas. Por tanto se investiga acerca de como puede realizarse el reconocimiento de los valores espirométricos con algún algoritmo que requiera menos muestras, llegando con ello al artículo [RL07] que con tan sólo unas pocas muestras, entre 5 y 10, es capaz de detectar eventos respiratorios con bastante exactitud. En este punto se desecha todo lo conseguido en el módulo IIa pero el módulo I se queda intacto, ya que para el nuevo enfoque sigue haciendo falta capturar la señal del micrófono y transformarla en un array de floats. De nuevo se vuelve ese array sin ningún tipo de procesamiento que se debe tratar para conseguir los valores que se desean. Todo el tratamiento se dividirá en submódulos y se pasará a explicar a continuación. 49 Submódulo B: Ventaneo de la señal Este submódulo cubre las necesidades que se exponen en el capítulo 4 sobre la división de la señal en frames y subframes con un solapamiento, que se muestra en la sección del cálculo de los coeficientes MFC (ver 4.1.1). El objetivo de este submódulo es dividir la señal de audio formada por un array de floats que se recibe como resultado del desarrollo y ejecución del Módulo I: Captura señal de audio. Para cumplir dicho objetivo se ha desarrollado una clase llamada Frame para facilitar la abstracción y manejo de todos los que forman el array. Su constructor recibe como parámetros el array de floats y la frecuencia de muestreo a la que se ha grabado para poder dividir la señal. Toda la división de la señal la realiza un método llamado doFraming() que recibe el tamaño del que se desean hacer sus partes (subframes) y el solapamiento entre subframes (subframeHopsize). Se recorre todo el array sacando nuevos subframes que también serán objetos Frame e irán destinados a una lista de subframes que además incluye su inicio y final dentro del frame mayor. Como resultado del desarrollo de este submódulo resultan objetos Frame que contienen una muestra menor a la original que recibe el constructor para después calcular los valores necesarios. Submódulo C: Hamming + FFT El submódulo anterior se ha desarrollado con el objetivo de poder calcular los coeficientes MFC de cada uno de los frames de la señal de audio recogida por el micrófono. Antes de calcular dichos coeficientes es necesario filtrar frecuencias falsas debidas al corte de la señal y pasar la señal de estar en función del tiempo a estar en función de la frecuencia. Por ello, se han creado dos clases, una se encarga de calcular los coeficientes MFC (MFCC.java) y otra para aplicar la transformada rápida de fourier (FFT.java) sobre las señales obtenidas del primer submódulo. En un principio MFCC.java sólo contaba con 4 métodos que llegaban al punto de la división de la señal sobre los 512 contenedores tras aplicar la FFT. Estos tres métodos eran: calcMFCC(): este método se encarga de llamar a todos los métodos necesarios para el cálculo de los arrays de características de la señal. Hasta este punto, acaba una vez clasificaba la señal en los 512 contenedores tras aplicar la FFT. windowingFrameSignal(): aplica la ventana de Hamming a la señal para posteriormente aplicar la FFT. (ver 4.1) magnitudeSpectrum(): llama a la clase FFT.java, que se explicará a continuación, recibiendo el resultado de aplicar la FFT y se calcula el espectro de cada elemento elevando al cuadrado su parte real e imaginaria. powerSpectrum(): recibe el array con los espectros y aplica una fórmula para asignarle 50 el contenedor FFT más cercano. La clase FFT.java no recibe ningún tipo de parámetro en su constructor y se llama a su método computeFFT con un frame como parámetro. Este método crea dos arrays de floats del mismo tamaño que el frame, en uno se alojará la parte imaginaria y en otro la parte real que se indicaba en la explicación. Después llama al método fft() que es el que recorrerá todo el frame asignando los valores correspondientes a los arrays anteriormente creados (real e imag). Se obtendrá así un periodograma basado en los espectros calculados que será utilizado en el siguiente submódulo para el cómputo de los coeficientes MFC. Submódulo D: Obtención coeficientes cepstrales En este submódulo se implementan el resto de métodos de la clase MFCC.java y la clase DCT.java. Lo primero que se hace es añadir a calcMFCC() el método filterBanks() que crea los bancos triangulares de los que se habla en el capítulo previo que cuenta los fundamentos teóricos. Este método pasa los frecuencias mínimas y máximas de hertzios a Mel para poder crear estos filtros y clasificar la señal, como resultado se obtiene una matriz cuyas filas son los filtros de los que se habla. Tras ello, el método fbEnergies recibe el periodograma calculado luego de la FFT y la matriz que representa los filtros Mel. Ahí recorrerá los filtros Mel asignando cada uno de los valores del periodograma a su filtro correspondiente y pasando el valor de la energía a una escala logarítmica. Por último la clase DCT.java implementa un método para calcular la transformada discreta del coseno a los valores de los filtros Mel para así transformarlos a un dominio temporal, obteniendo los valores que caracterizaran a ese frame (coeficientes MFC). Submódulo E: Creación cepstrograma El submódulo anterior tiene como salida los coeficientes cepstrales de cada uno de los subframes (fragmentos 10ms) que forman el frame (fragmento 100ms) que caracterizan la señal. Después hay que crear un cepstrograma en base a los vectores de características de los subframes que en conjunto caracterizarán al frame. Esta parte de la implementación se incluye en la clase Cepstrogram.java cuyo atributo es una matriz de floats que será el cepstrograma en sí. Cuando se crea un objeto Cepstrogram se reciben como atributos las dimensiones de éste, tendrá tantas filas como coeficientes cepstrales se hayan obtenido para cada subframe y tantas columnas como subframes dividan al frame. Cuenta con un método add que recibe como parámetros la columna a la que corresponde y el vector de coeficientes cepstrales, el método incluye cada vector dentro de la columna que corresponda. 51 Ya que se tienen los valores deseados que caracterizan cada frame se pasa a desarrollar un nuevo módulo, que aproximará la relación entre el conjunto de ejemplo y la muestra que se está analizando. 5.3.6 Módulo III: Similitud template - muestra Este módulo engloba las medidas de similitud que se han calculado para marcar la relación o no del audio grabado con un evento respiratorio, que corresponde al conjunto de ejemplo. Con respecto al capítulo de conceptos específicos del dominio en este módulo se cubre parte de la construcción del template (ver 4.1.2), el cálculo de la función de similitud Cp (ver 4.1.3), y por último la relación entre la energía y la tasa de cruces por cero con eventos respiratorios o no respiratorios. La descomposición en submódulos se puede ver gráficamente en la Figura 5.10 . Figura 5.10: Submódulos y resultado del Módulo III: similitud template - muestra Submódulo A: Creación del conjunto de entrenamiento Se le aplica el mismo procedimiento que se redacta en el Módulo IIb con los mismos tamaños tanto de frame como de subframe. El conjunto de entrenamiento se encuentra creado en la clase BreathTrainingSet.java cuyo único atributo es una lista de matrices bidimensionales de floats que corresponden a los cepstrogramas de cada audio del conjunto de ejemplo. Tiene un método addExample que recibe la ruta del audio que se va a emplear como parte del entrenamiento como único parámetro. El método se encarga de fragmentar el audio en frames y subframes, calcular los coeficientes cepstrales de la parte central de la muestra y crear el cepstrograma que se incluirá en la lista caracterizando al audio. 52 Submódulo B: Función similitud Cp Para poder calcular el coeficiente de similitud Cp, se ha creado una clase llamada SimilarityCoefficients.java que recibe como parámetro una lista de matrices que son el conjunto de entrenamiento, incluido en un objeto BreathTrainingSet como atributo. Esta clase calcula la media y la varianza elemento a elemento del conjunto de ejemplo (average() y variance()), y después se calcula la matriz D de la que se habla en el capítulo previo mediante el método calcDifferenceNormMatrixD() que será la que se empleará para medir la similitud. Para enfatizar los coeficientes cepstrales mas pequeños se utiliza el método liftering que utiliza una media ventana de Hamming sobre la matriz D. Por último, se calcula el coeficiente Cp con la fórmula 4.5 que en el código se encuentra implementado en el método computeCpCoefficient(). Submódulo C: Cálculo de energía y tasa de cruces por cero (ZCR) El cálculo de la short-time energy y del ZCR se lleva a cabo en dos de los métodos que contiene la clase Frame.java, donde emplea para cada una de ellas las fórmulas que se citan en el capítulo anterior (Fórmula 4.8 y Fórmula 4.6). Esos métodos son calcEnergy() y calcZCR que se pueden ver en el Listado 5.2. public void calcEnergy () { float sumatorio = 0; for ( int i = 0; i < frameSignal . length ; i ++) { sumatorio += Math . pow ( frameSignal [ i ] , 2) ; } // En decibelios : (−INF si todos los samples del frame son 0) setEnergy (10 ∗ ( float ) Math . log10 ( sumatorio / frameSignal . length ) ) ; } public void calcZCR () { // (0 si todos los samples del frame son 0) float sumatorio = 0; for ( int i = 1; i < frameSignal . length ; i ++) { sumatorio += 0.5 f ∗ Math . abs ( Math . signum ( frameSignal [ i ]) − Math . signum ( frameSignal [ i − 1]) ) ; } setZCR ( sumatorio / frameSignal . length ) ; } Listado 5.2: Métodos calcEnergy y calcZCR 53 Submódulo D: Selección de umbrales en relación a Short-time Energy y ZCR Como bien se ha explicado en el capítulo anterior, lo primero que se tiene que hacer es fragmentar la señal en archivos wav tanto de eventos respiratorios como de eventos de voz. Se ha empleado el software Audacity que permite ver como cambia la señal del audio e ir clasificando cada muestra en respiratoria o de voz. En la Figura 5.11 se puede comprobar la división en resp.wav y voz.wav de la muestra muestraIphone.wav. Figura 5.11: División en fragmentos respiratorios/voces Se obtiene así una lista de archivos wav con fragmentos o de voz o de respiración. Para situarlos en el tiempo se ha empleado el atributo start que indica la posición del primer elemento del frame dentro de la muestra inicial. Si se divide ese atributo por la tasa de muestreo se obtiene el segundo en que tiene lugar el evento (Listado 5.3). Hasta el momento sólo se utiliza el primer coeficiente de similitud Cp, considerando eventos respiratorios los frames cuyo coeficiente es mayor a 0.0025. Non−Breath Non−Breath Non−Breath XX Seg :2 XX Seg :2 XX Seg :3 XX Seg :3 XX Seg :3 XX Seg :3 XX Seg :3 Energia Energia Energia Energia Energia Energia Energia −33.95371 ZCR 0.08231293 −56.282913 ZCR 0.1845805 −64.43788 ZCR 0.35510203 −62.27859 ZCR 0.32517007 −57.73909 ZCR 0.21337868 −56.67229 ZCR 0.21473923 −58.025646 ZCR 0.23650794 Listado 5.3: Ejemplo de la detección de un posible evento respiratorio entre los segundos 2 y3 Tras ello se pasan todos los wav por el programa aplicando el método doFraming con las mismas medidas que el conjunto de entrenamiento para que los resultados sean coherentes. Se calcula la energía y la ZCR de cada uno de estos frames dividiéndolos como se ha dicho anteriormente en respiratorios o de voz. Estos resultados de voz y respiración en cuanto ZCR y energía se han incluido cada uno de los tipos en un archivo csv para después poder hacer los cálculos pertinentes desde la herramienta RStudio. En RStudio se ha creado un script .R que contiene todas las operaciones necesarias a aplicar a ambos conjuntos de muestras para conseguir los descriptores 54 estadísticos (Listado 5.4). Respiraciones<−read . csv ( " / home / cristian / Documentos / Respiraciones . csv " ) # en caso de ser las Voces o fonemas sonoros # Respiraciones<−read . csv (" / home / cristian / Documentos / Voces . csv ") n<−dim ( Respiraciones ) [1] # Media avgZCR<−sum ( Respiraciones $ ZCR ) / n avgEner<−sum ( Respiraciones $ Energia ) / n # Mediana median ( Respiraciones $ Energia ) median ( Respiraciones $ ZCR ) # Varianza sum (( Respiraciones $ Energia−avgEner ) ^2) / n sum (( Respiraciones $ ZCR−avgZCR ) ^2) / n # Cuartiles # ZCR quantile ( Respiraciones $ ZCR ,0.25) quantile ( Respiraciones $ ZCR ,0.5) quantile ( Respiraciones $ ZCR ,0.75) # Energia quantile ( Respiraciones $ Energia ,0.25) quantile ( Respiraciones $ Energia ,0.5) quantile ( Respiraciones $ Energia ,0.75) Listado 5.4: Script cálculo de descriptores estadísticos Los valores que se consiguen de ejecutar el script sobre las dos muestras son: Media aritmética de ZCR y energía Mediana de ZCR y energía Varianza de ZCR y energía Cuartiles de ZCR y energía A continuación se muestran dos cuadros (Cuadro 5.3 y Cuadro 5.4) con los resultados obtenidos de la aplicación del script R anterior sobre los dos conjuntos de muestras. Submódulo E: Marcado de bordes y eliminación de falsos deeps Desaparece el concepto de superFrame y ya solo se trabaja sobre una gran lista de objetos Frame correspondientes a los que anteriormente se llamaban subframes. Filtro de medias de 3 puntos: en la Figura 5.12 se muestra un ejemplo gráfico de lo que consiste un filtro de medias en este caso de 3 puntos. Para aplicar este filtro con los valores de las energías de los subframes contenidos en una lista y actualizar el valor 55 Voz Media Mediana Varianza Cuartil(0.25) Cuartil(0.5) Cuartil(0.75) Energia -39.37032 -37.25832 73.15023 -41.59542 -37.25832 -33.95717 ZCR 0.1569319 0.1318594 0.009295386 0.08157596 0.1318594 0.2087302 Cuadro 5.3: Descriptores estadísticos Voz Respiración Media Mediana Varianza Cuartil(0.25) Cuartil(0.5) Cuartil(0.75) Energia -60.52494 -60.82553 9.898509 -62.69718 -60.82553 -58.66686 ZCR 0.3107869 0.3105442 0.007061466 0.2504819 0.3105442 0.3899093 Cuadro 5.4: Descriptores estadísticos Respiración de estas energías en cada uno de los objetos Frame se ha empleado el siguiente código (Listado 5.5). private List < Frame > averageFilter ( List < Frame > demarcationFramesAux ){ List < Frame > filtroMedias = new ArrayList < Frame >() ; int i = 0; final int POINTS = 3; while ( i < d e m a r c a t i o n F r a m e s A u x . size () − POINTS + 1) { Frame [] aux = d e m a r c a t i o n F r a m e s A u x . subList (i , i + POINTS ) . toArray ( new Frame [ POINTS ]) ; Frame copy = new Frame ( d e m a r c a t i o n F r a m e s A u x . get ( i + POINTS / 2) ) ; float sum =0 f ; for ( int j =0; j < POINTS ; j ++) { sum += aux [ j ]. getEnergy () ; } copy . setEnergy ( sum / POINTS ) ; filtroMedias . add ( copy ) ; sum =0; i ++; } return filtroMedias ; } Listado 5.5: Filtro medias 3 puntos en Java Identificar picos y deeps: sobre la lista de tipo Frame resultante de aplicar el filtro de 56 Figura 5.12: Aplicación de filtro de medias de 3 puntos sobre el componente b medias, se identifican sus picos con el método peakMarking que compara la energía de cada uno de los miembros de la lista con la de los frames anterior y posterior. En caso de que el anterior y el posterior sean menores que el del centro, indica que el Frame central corresponde a un pico (o peak). Para identificar los deeps se hace lo mismo pero a cada uno de sus lados la energía debe ser mayor que la suya, esta función la realiza el método deepsMarking. Si se trata de un deep se pasa por un filtro que asegura que no se coge cualquier deep sino que los picos que lo rodean cumplen con un mínimo. El método isSignificantDeep es el que determina si un determinado deep es significativo o no. Delimitar eventos respiratorios y aplicación de las reglas: al aplicar el filtro de medianas el método candidateBreathSectionsAndMedian además de calcular la mediana se encarga de crear objetos BreathEvent que corresponden a cada una de las sucesiones de eventos respiratorios sucesivos (isBreathFrame=1). Estos objetos BreathEvent junto con la lista de deeps contenidos por la muestra se recorren buscando cuantos deeps hay dentro de los límites de cada uno de estos objetos, esta operación es llevada a cabo por el método addDeepInBE. Cuando ya cada una de éstas secciones candidatas tiene definido el número de deeps significativos que contiene, se le aplican las reglas contenidas en la Tabla 4.1 para definir los límites inferior y superior de los eventos respiratorios. El método edgeMarking se encarga de aplicar las reglas en función de si contiene 0, 1, 2 o más deeps significativos en su interior. Submódulo F: Segundo proceso de filtrado Eliminación final de falsos positivos una vez se tiene la lista de candidatos y son delimitados con el método edgeMarking, en función de los deeps significativos que contiene, se llama al método falsePositiveRejection con cada uno de los candidatos que se encuentran en la lista. Este método se encarga de eliminar los candidatos que no cumplan la condición de duración del evento respiratorio mínimo (MIN_LENGTH_BREATH) y que de nuevo cumpla con el criterio de energía sea mayor al mínimo impuesto ya desde el primer filtrado. 57 5.3.7 Módulo IV: Valoración del estado respiratorio del usuario Para valorar las respiraciones obtenidas en el primer algoritmo, como buena, normal o con dificultad respiratoria, se ha utilizado una herramienta llamada Weka que incorpora varios algoritmos de inteligencia artificial. En este caso como se ha indicado en el capítulo anterior se emplea el clustering y en concreto la técnica EM que arroja un coeficiente de similitud que cuanto más cercano a cero es más se parece al modelo. La Figura 5.13 muestra los diferentes submodulos de los que se compone. Figura 5.13: Submódulos y resultado del Módulo IV: Valoración del estado respiratorio del usuario Creación archivos ARFF y modelos En primer lugar se deben crear los archivos ARFF, son los únicos además de los csv con los que puede trabajar la librería de weka de ambos modelos. Para ello se han seleccionado manualmente eventos respiratorios de voluntarios sanos y de voluntarios asmáticos de los cuales se han calculado los coeficientes MFCC y se han incluido dentro del proyecto. Para crear los archivos ARFF del resto de eventos respiratorios que serán la salida del primer algoritmo se crea un bucle que va creando un archivo por cada uno de los eventos con sus coeficientes MFCC que caracterizaran cada una de las respiraciones. Cálculo similitud con modelos La similitud de cada uno de los eventos respiratorios con cambos modelos (sanos y asmáticos) se calcula mediante una librería de Weka pero compatible con Android a la que simplemente hay que meter los parámetros que deseas tener, los archivos de entrenamiento y 58 prueba (ambos ARFF). Después se elige el algoritmo a ejecutar y tras ejecutarse se mostrarán por pantalla todos los resultados. En el Listado 5.6 se muestra el código correspondiente al cálculo del coeficiente de similitud con el modelo de los asmáticos (malos.arff). options = new String [12]; options [0] = "−t " ; options [1] = Environment . g e t E x t e r n a l S t o r a g e D i r e c t o r y () + " / Simoa / malos . arff " ; options [2] = "−T " ; options [3] = " / data / data / com . tfg . cristian . testingdesign / files / " + strings [0]+ " _ " + i + " . arff " ; // A q u lo que se vaya a probar options [4] = "−N " ; options [5] = " 16 " ; options [6] = "−I " ; options [7] = " 100 " ; options [8] = "−M " ; options [9] = " 1.0 E−6" ; options [10] = "−S " ; options [11] = " 100 " ; result = Cl usterE valuat ion . e valuat eClust erer ( new EM () , options ) ; simMalos [i −1]= resultToFloat ( result ) ; Listado 5.6: Cálculo similitud con el modelo de los asmáticos Los resultados que devuelve son del tipo String por lo que hay que pasar a float el coeficiente que se necesita, para ello se ha implementado el método resultToFloat. Se han creado también dos vectores del tamaño de la lista de BreathEvents en los cuales se van guardando los coeficientes similitud con cada uno de los modelos. Dado que existe la posibilidad de que se detecten falsos positivos como respiraciones buenas, los coeficientes de similitud de los dos arrays que se cogeran será el que corresponda a la mediana para evitar coger valores muy altos o muy bajos que podrían ser provocados por los falsos positivos. Cálculo coeficiente Después del cálculo de la mediana de ambos vectores se tiene ya la similitud con el modelo bueno y el modelo de los asmáticos que van a ser utilizadas para definir el estado del usuario. Para ello se comprueba cual de los dos coeficientes está más cerca del 0; una vez se sabe cual de los dos es el mayor se dividen el que tenga mayor valor absoluto entre el menor. El coeficiente que esté más próximo a 0 será el que se indicará como estado del usuario (verde si se acerca más al modelo bueno y rojo si se acerca más al estado con problemas 59 respiratorios) salvo que al realizar el cociente del que se habla en el párrafo anterior éste no supere el 1.05 lo que hará que se decante como estado normal (naranja) entre el bueno y el asmático, se puede observar el código en el Listado 5.7. float sano = result . get (0) ; float malof = result . get (1) ; float coeff ; if ( sano > malof ) { coeff = Math . abs ( malof ) / Math . abs ( sano ) ; if ( coeff >1.05) { rojo . setImageDrawable ( getResources () . getDrawable ( R . drawable . verde ) ) ; } else { rojo . setImageDrawable ( getResources () . getDrawable ( R . drawable . ambar ) ) ; } } else { coeff = Math . abs ( sano ) / Math . abs ( malof ) ; if ( coeff >1.05) { rojo . setImageDrawable ( getResources () . getDrawable ( R . drawable . rojo ) ) ; } else { rojo . setImageDrawable ( getResources () . getDrawable ( R . drawable . ambar ) ) ; } } Listado 5.7: Determinar el estado de obstrucción del paciente 5.3.8 Módulo V: Diseño e implementación de la aplicación móvil En el quinto y último módulo es donde se lleva a cabo la integración de los dos algoritmos, con la captura de audio correspondiente al primer módulo y la representación de los resultados de una forma clara al usuario. Todo ello en una única aplicación Android. Se divide en cuatro partes: 1. Intrucciones: en la que se explica al usuario el procedimiento a seguir y como realizar la grabación. 2. Grabación del wav: en la que se lleva a cabo la grabación por parte del usuario. 3. Resultados detección de eventos respiratorios: tras analizar la muestra se muestran los eventos respiratorios detectados. 4. Resultados estado respiratorio: un termometro muestra su estado respiratorio con 3 estados posibles. 60 Instrucciones Es el primer Activity (Figura 5.14) que aparece al iniciar la aplicación, aquí se explica como se tiene que realizar la grabación tanto a nivel de que botones pulsar como la forma en que debe colocarse el teléfono. Al estar enfocado el trabajo a un futuro en el que esta detección se haga en segundo plano mientras tiene lugar una llamada, la posición correcta con la que grabarse es con el teléfono en la oreja al igual que si se estuviera manteniendo una conversación telefónica. Figura 5.14: Activity inicial de la aplicación e instrucciones de uso Grabación del wav Para la grabación del wav se ha diseñado una activity principal que da la bienvenida a la aplicación y solicita el ingreso de un nombre como forma de identificar los archivos que se generen a lo largo del flujo del programa con su nombre en concreto. Abajo del todo se puede observar un botón rojo para comenzar la grabación al igual que el que aparece en muchos objetos cotidianos, fácil de reconocer lo que ocurrirá en caso de pulsar dicho botón (Figura 5.15). Al pulsar el botón de grabar se inicia la grabación y una animación mediante la cual baja un micrófono desde la parte superior de la pantalla y aparece el texto de "Grabando... un botón de PARAR en la parte inferior de la pantalla cuando se quiera acabar con la grabación (Figura 5.16). 2 Cuando se pare la grabación del audio pulsando el botón PARAR, aparecerán tres nue61 Figura 5.15: Introducir nombre y comenzar grabación Figura 5.16: Aspecto de la aplicación durante la grabación vos botones en la parte inferior de la pantalla. La descripción de los nuevos botones es la siguiente: Repetir (botón izquierdo): este botón se puede pulsar en caso de que la grabación realizada no haya gustado al usuario, sea cual sea el motivo. Devolvería el flujo del programa al activity principal donde se introduce el nombre pero ya aparecería el nombre introducido con anterioridad en caso de que el usuario desee el mismo no deba volver a escribirlo. El archivo de audio que se creará en la segunda vez si mantiene el mismo nombre sobrescribirá el anterior audio generado. Reproducir (botón central): para que el usuario pueda comprobar que se ha grabado correctamente la muestra puede pulsar este botón y podrá escucharlo ademaś de ver con un puntero azul en pantalla como transcurre y el segundo en el que se encuentra escuchando (Figura 5.18). Continuar (botón derecho): si el usuario está conforme con la muestra que ha grabado pulsaría este botón para que se inicie el algoritmo de detección de respiraciones que se explica en la siguiente subsección. Resultados detección respiraciones Si se ha pulsado el botón de CONTINUAR una vez realizada la grabación, comenzará el proceso de ejecución del primer algoritmo el cual devolverá los diferentes eventos respiratorios que haya capturado. Para mostrarlos al usuario se ha optado por una tabla donde se 62 Figura 5.17: Aspecto de la aplicación tras finalizar la grabación Figura 5.18: Puntero azul y muestra del segundo que se esta reproduciendo asigna un ID a cada evento así como el segundo en que se inicia el evento y el final del mismo (Figura 5.22). Se conserva el reproductor en esta activity para que el usuario pueda comprobar que los segundos que aparezcan en la tabla corresponden o no a eventos respiratorios. Además de mostrar la tabla muestra un botón el cual debe ser pulsado para comprobar el estado en el que se encuentra el usuario que llamará al segundo algoritmo. Mientras el smartphone esta procesando los datos en busca de esos eventos respiratorios ofrece al usuario un feedback en forma de barra (spinner) que va acercandose al 100 % a medida que se va acabando la ejecución del algoritmo para que el usuario sepa en todo momento que la aplicación esta ejecutandose (Figura 5.21). Resultado estado respiratorio Por último en este Activity será donde se mostrará al usuario su estado respiratorio con tres indicadores: bueno, normal o con dificultad respiratoria. Aquí es donde se ejecuta el segundo algoritmo y se muestra el resultado que este arroje. De igual forma que en la detección de respiraciones mientras el smartphone procesa y analiza los datos que recibe muestra un spinner que va rellenandose a medida que comprueba cada uno de los eventos respiratorios. 63 Figura 5.19: Spinner que aparece durante el procesamiento Figura 5.20: Esta activiy muestra los eventos respiratorios detectados Figura 5.21: Spinner que aparece mientras se ejecuta el algoritmo Figura 5.22: Activity final en la que se muestra el estado del paciente 5.4 Diagramas UML En esta última sección del capítulo se muestran algunos de los diagramas UMLs utilizados en el desarrollo del proyecto tanto a la hora de implementar como para saber que requisitos 64 Figura 5.23: Diagrama de casos de uso SiMoA se están pidiendo y la secuencia que sigue el intercambio de información entre las diferentes entidades o clases. 5.4.1 Diagrama de casos de uso El diagrama de casos de uso desde el punto de vista del usuario en este proyecto es muy sencillo, dado que el caso de uso global es que el usuario se graba hablando con la aplicación y automáticamente después la aplicación le muestra en que instantes del tiempo se han producido sus respiraciones y determina su estado respiratorio. Se ha desglosado en algunos casos de uso más para que sea más sencillo de comprender (Figura 5.25). 5.4.2 Diagrama de clases En este apartado además de mostrar el diagrama de clases resultante se va a explicar el propósito de cada una de las clases que lo forman por si durante la explicación de los módulos no ha quedado suficientemente claro. En primer lugar de desglosa el diagrama de clases correspondiente a la funcionalidad del primer algoritmo encargado de la demarcación de eventos respiratorios. Frame: centro de todo en este proyecto, cada una de las señales con la que se trabaja antes de nada se divide en objetos de la clase Frame, ya sean superFrames o subFrames. BreathTrainingSet: es la clase que se encarga de crear el conjunto de entrenamiento en base a los archivos tipo wav que recibe para formar la plantilla con la que luego se compararán los audios. Cepstrogram: cada uno de los superFrames cuenta con un cepstrograma que es una matriz en la que cada una de sus columnas es el vector de características de cada uno de los subframes que lo componen. 65 Figura 5.24: Diagrama de clases algoritmo detección de eventos respiratorios SimilarityCoefficients: esta clase se encarga de calcular el coeficiente Cp en base a un cepstrograma de la señal de entrada que recibe y los cepstrogramas del conjunto de entrenamiento o plantilla. BreathDemarcation: en esta clase se lleva a cabo todos los procedimientos tanto del filtrado primero como del segundo, y ya por último deliminar las respiraciones de la que será la última clase, BreathEvent. BreathEvent: estos objetos están formados por un atributo y otro de fin de cada sección candidata, una sección candidata o precandidata es una sección de objetos Frames cuyos atributos breathFrames es uno y están de forma consecutiva. En la segunda parte del trabajo que implica la determinación del estado respiratorio del usuario, se concentra en una única clase donde se obtiene el coeficiente de similitud (likelyhood) de los coeficientes MFCC de cada uno de los eventos respiratorios con respecto a los modelos GMM generados tanto de sanos como con algún tipo de patología. Esta clase SimilarityModels en donde se hace la llamada a la librería de Weka para Android que permite hacer los cálculos necesarios para obtener el coeficiente de similitud mencionado anteriormente. Son necesarios los archivos ARFF (extensión propia de Weka) para pasarselos a dicha librería, los cuales han sido creado una vez se determinaron los eventos respiratorios de la entrada de voz dentro del primer Activity. 5.4.3 Diagramas de secuencia Los únicos diagramas de frecuencia que se van a incluir en la memoria van a ser los de los procedimientos más característicos del proyecto como son el de aplicación de filtros (Figura 66 Figura 5.25: Diagrama de clases algoritmo determinación del estado respiratorio Figura 5.26: Diagrama de secuencia aplicación filtro 1 5.26) y el paso de la voz del usuario a un array de floats (Figura 5.27). 67 Figura 5.27: Diagrama de secuencia wav-array float 68 Capítulo 6 Resultados E este capítulo se muestran los resultados obtenidos tras el desarrollo de la herramienta tanto en la detección de eventos respiratorios como en la evaluación del estado respiratorio a partir de éstos. Además se muestra el aspecto final de la aplicación Android con una serie de capturas de pantalla. N 6.1 Detección de respiraciones En esta sección se muestra una tabla 6.1 con los resultados correspondientes a la detección de eventos respiratorios dentro del habla continua, lo cuál es la función principal de la herramienta implementada. Dentro de la tabla, se incluye el nombre del archivo de audio generado, el número de respiraciones existentes, las respiraciones que ha detectado la herramienta correctamente, las que sólo ha detectado parcialmente y las que han sido detecciones falsas o falsos positivos. Además de la tabla, se incluye un gráfico en el que se aprecian los resultados tras tomar muestras de grabaciones con un total de 10 personas tanto sanas como con problemas respiratorios que se elevan a 23 muestras ya que algunos hicieron varias grabaciones. Se puede comprobar que los resultados de este primer algoritmo son bastante satisfactorios con la mayoría de aciertos entre el 75 y el 100 % (Figura 6.1). Figura 6.1: Porcentaje de aciertos en la detección de respiraciones 69 Nombre audio Masculino_c_23 Masculino_c1_23 Masculino_c2_23 Masculino_c3_23 Masculino_c4_23 Masculino_c5_23 Masculino_c6_23 Masculino_c7_23 Masculino_eh1_19 Masculino_eh2_19 Masculino_ep1_61 Masculino_ep2_61 Masculino_i1_48 Masculino_i2_48 Masculino_o1_44 Masculino_o2_44 Masculino_j1 Masculino_iv1 Masculino_iv2 Masculino_iv3 Masculino_iv4 Masculino_p1 Masculino_ceci1 Detecciones totales 5 1 2 4 3 9 4 6 4 5 8 7 6 10 9 11 2 4 5 4 4 2 3 Correctas 2 1 1 3 1 6 1 4 4 5 6 6 5 8 4 9 1 4 5 3 4 2 2 Erroneas 3 1 1 2 3 3 2 2 1 1 2 5 2 1 1 1 Cuadro 6.1: Resultados arrojados por el primer algoritmo Por otra parte se muestra el resultado de aplicar este primer algoritmo al audio pepe.wav en el que se detectan con total exactitud las dos respiraciones que se producen (Figura 6.2). Se pueden apreciar dos segmentos del audio sombreados con los segundos exactos de inicio y fin del evento respiratorio. Tras pasar este audio como test por el algoritmo de detección de respiraciones los resultados obtenidos son los que se muestran en la Figura 5.22 del capítulo anterior que coinciden con la representación gráfica de la locución. Los fragmentos que muestran una amplitud mayor corresponden a la voz del usuario y los que tienen una amplitud menor a las respiraciones (segmentos sombreados) corresponden a silencios o a la pulsación de los botones de la aplicación, como lo pueden ser el primer y el último segundo. 6.2 Determinación estado respiratorio Para la realización de pruebas acerca del estado respiratorio se comprobó previamente que el algoritmo empleado por Weka para crear dos modelos de distribucioens de mezclas gaussianas (GMM) que representen, por un lado, un estado respiratorio saludable y, por otro, un 70 Figura 6.2: Respiraciones detectadas en pepe.wav estado con presencia de obstrucción respiratoria u otros problemas respiratorios derivados; clasificaba de forma correcta tanto a sanos como asmáticos cada uno en su correspondiente grupo. Las primeras pruebas que se realizaron sobre este algoritmo tuvieron lugar en un pc de sobremesa ejecutando código Java para comprobar que los resultados que se obtenian eran coherentes y ya migrarla a la aplicación móvil. Una vez se obtuvo la relación entre los modelos y las muestras de los diferentes usuarios se implementó en la aplicación móvil y comenzaron las pruebas finales. Estas pruebas finales fueron realizadas sobre cinco voluntarios con una particularidad, la primera toma se hizo en total reposo y la siguiente tras haber elevado el número de pulsaciones por minuto (ppm) del corazón lo cual provoca un estado pulmonar más agitado que el inicial. Antes de realizar la primera prueba se procedió a determinar los valores pulmonares de los usuarios gracias a un espirometro convencional para corroborar su estado respiratorio. Lo que se quiere comprobar es el comportamiento de la aplicación de estimación del estado respiratorio sometiendo al usuario a cierta actividad física que altere su estado cardio respiratorio y contrastarlo con los resultados, en forma de índice obtenidos por la aplicación y su clasificación como: estado respiratorio bueno, normal o con dificultades. A continuación se muestran los resultados obtenidos dividiendo a los voluntarios en asmáticos crónicos, estacionales y sin ningún tipo de desorden respiratorio tanto en un Cuadro 6.2 , como detalladamente. 6.2.1 Usuarios que presentan asma crónica Esta prueba se realizó sobre dos pacientes con un cuadro clínico de asma crónica y se les sometió a la misma prueba: Grabación de voz continua en reposo Grabación de voz continua tras subir y bajar unas escaleras 71 Usuario Crónico_1 Crónico_2 Estacional_1 Sano_1 Sano_2 Sano_3 Estado en reposo Dificultad respiratoria Dificultad respiratoria Bueno Bueno Bueno Bueno Estado tras esfuerzo físico Dificultad respiratoria Dificultad respiratoria Dificultad respiratoria Dificultad respiratoria Normal Dificultad respiratoria Cuadro 6.2: Pruebas finales determinación estado respiratorio Los resultados arrojados por ambas pruebas para los dos pacientes fueron los mismos, el algoritmo de determinación del estado respiratorio los clasificó a los dos como personas con dificultad respiratoria. 6.2.2 Usuarios que presentan asma estacional En este grupo de usuarios sólo se contó con un voluntario, se le realizó una prueba anterior a su entrenamiento habitual de futbol sala y los valores obtenidos en la aplicación lo determinaban como un estado respiratorio normal (naranja). Una vez concluyó su entrenamiento se le volvió a pedir una muestra de audio para determinar su nuevo estado respiratorio y la aplicación lo clasificó como persona con dificultad respiratoria debido al aumento de su actividad pulmonar a lo largo del entrenamiento. 6.2.3 Usuarios que no presentan asma Por último en usuarios sin ningún tipo de enfermedad pulmonar apararente se contó con tres voluntarios que se sometieron a dos pruebas, en una se repetía la de subir y bajar escaleras después de hacer la primera prueba y en otra se compararon muestras de un día normal con una muestra obtenida tras una sesión de running durante media hora a ritmos altos. Tras realizar la primera toma de los tres voluntarios, en reposo, el algoritmo clasificó su estado respiratorio como bueno (verde) pero tras el esfuerzo físico tanto de las escaleras como después de correr clasificó a dos dentro del estado con cierta dificultad respiratoria (rojo) y a uno como un estado respiratorio normal (un leve empeoramiento de su estado tras la actividad). 72 Capítulo 7 Conclusiones y propuestas E este capítulo se exponen las conclusiones acerca de los objetivos iniciales que se han podido conseguir con el desarrollo de este proyecto y además se aportan unas ligeras ideas de cómo se podría mejorar en ciertos aspectos. N 7.1 Limitaciones encontradas A lo largo del desarrollo de este TFG se han encontrado varias limitaciones pero principalmente dos que serán desarrolladas en la siguiente enumeración: 1. Grabación iOS/Android: respecto al tema de la grabación los problemas se fueron encontrando desde el inicio del módulo IIb cuando se tenía la intención de detectar los eventos respiratorios. Como se ha indicado en el apartado donde se describen todos los elementos hardware a emplear aparece tanto un móvil Android como un móvil iOS, se detectó que la diferencia entre los audios eran muy grande entre unos y otros. Los grabados con el iPhone tenían una amplitud mucho más grande que los de Android lo que facilitaba al algoritmo detectar entre eventos respiratorios y voz, a diferencia de Android donde se mezclaban los silencios con los eventos respiratorios. Tras mucho investigar se encontró la solución al poder ampliar la señal multiplicando la matriz de floats por una constante que ampliaba 13 dB la muestra porque en un principio sólo se podía amplificar la señal llevando al software de edición de audios Audacity y ya ahí ampliarla y después devolverla al algoritmo. Para que se vea más graficamente, se adjuntan dos imágenes una del aspecto de una grabación realizada con el iPhone y otra grabación realizada con el Nexus 4. Figura 7.1: Ejemplo grabación iPhone 4S 73 Figura 7.2: Ejemplo grabación Nexus 4 2. Voz mujeres/hombres: los primeros conjuntos de entrenamiento que se tomaron correspondian solamente a hombres porque no se pensaba que existiera una diferencia tan grande entre la respiración de un hombre y la de una mujer. Después de hacer muchas pruebas con audios de hombres se decidió meterle al primer algoritmo la muestra de una mujer, resultando que no reconoció ninguna de sus respiraciones. Ahí se tomó la determinación de que podría ser una característica a mejorar en futuras versiones de la aplicación cuando se tenga la posibilidad de tomar muestras a mujeres asmáticas para extender a éstas el algoritmo. 7.2 Objetivos alcanzados DET-01 Este objetivo se ha conseguido puesto se han estudiado múltiples casos similares al que se ha desarrollado, principalmente este desarrollo se ha basado en el estudio de los cantantes [RL07]. DET-02 Este objetivo ha sido cubierto tras realizar varias grabaciones y seleccionar los mejores eventos respiratorios de cada una como bien se explica detalladamente en el Anexo Elección conjunto de entrenamiento y cálculo Bm/2. DET-03 La obtención de un vector de características de cualquier muestra de audio, en este caso sólo centrado en el conjunto de entrenamiento y de la muestra de entrada al algoritmo ha sido cubierto con el desarrollo del módulo IIb. DET-04 Tras conseguir el subobjetivo anterior (vector de características de cada subframe) ya se podía implementar el módulo necesario para que este subobjetivo fuera cubierto, el módulo con todas las funcionalidades necesarias para ello es el módulo III. Este módulo ha sido el más laborioso del desarrollo ya que conlleva tanto el cálculo de coeficientes como desarrollo de dos filtros para el procesamiento adecuado de la señal y obtener los mejores resultados posibles. 74 CLA-01 En cuanto al estudio de trabajos previos de diferenciación entre muestras sanas y con algún tipo de obstrucción se ha conseguido con dos de los artículos incluídos en el capítulo de Antecedentes [Rac] y [BP04]. CLA-02 Relacionado con el objetivo CLA-01 se ha conseguido éste, puesto que los dos artículos a los que se hacer referencia emplean los coeficientes MFCC como diferenciación entre muestras. Además de contar ya con la implementación de cómo obtener estos coeficientes en el desarrollo del primer algoritmo (Detección de eventos respiratorios). CLA-03 Con el objetivo de diferenciar los coeficientes MFCC de sanos y asmáticos, se ha elegido un algoritmo de inteligencia artificial denominado EM que indica mediante un coeficiente, la similitud que existe entre un conjunto de entrenamiento y la muestra que recibe como entrada. CLA-04 Al necesitar el algoritmo elegido en el punto anterior dos conjuntos de entrenamiento para crear los dos modelos necesarios se ha llevado a cabo una toma de muestras tanto de personas asmáticas como de personas sin ningún tipo de desorden respiratorio, como se muestra en el Anexo Recogida muestras comparativas: smartphone espirómetro. AND-01 La recogida de muestras de audio se ha recogido en formato wav ya que este no utiliza compresión para guardar los datos, por lo tanto no conlleva ninguna perdida de calidad al almacenarse. De esta forma luego el estudio es mucho más preciso que si se tratara de un formato comprimido. En un principio se empleó una resolución de 44100 muestras por segundo peros los datos a analizar eran muy grandes a la hora de ejecutar el algoritmo por lo que se decidió bajarlo a 8000 muestras/segundo. Como se ha explicado en el capítulo 5 para poder recoger las muestras en un smartphone Android y en el formato wav se ha empleado la clase AudioRecord de Android. AND-02 El desarrollo de la aplicación Android ha sido el objetivo más fácil de llevar a cabo, su totalidad se ha conseguido con el desarrollo del último de los módulos, módulo V, en el que se integran todos los módulos anteriores y se les dota de una interfaz gráfica fácil de manejar. 75 7.3 Propuestas de trabajo futuro Una vez se ha llegado a este punto siempre se quedan cosas en el tintero que habría gustado de implementar, cambiar ciertos aspectos o como no mejorar la herramienta generada. En los siguientes puntos se mostrarán algunas de las que se piensa son buenas mejoras para la éste trabajo. Vulnerabilidad al ruido externo Por el momento el algoritmo sólo es capaz de detectar los eventos respiratorios en entornos lo más silenciosos posibles, que el ruido sea el mínimo. Esta mejora afectaría directamente al cálculo del vector de características MFCC que sería reforzado de manera que consiguiera detectar estos eventos respiratorios en entornos más ruidosos. Comunicación directa con el especialista La aplicación que se ha desarrollado es una aplicación local sin ningún tipo de conexión con nada, el paciente graba su voz y obtiene un valor que le indica su estado con respecto a un valor pulmonar. A esto se le podía dar muchísimo más potencial con el desarrollo de una herramienta web que se instalaría en el equipo del especialista (neumólogo o alergólogo) y cada vez que se tomara una muestra en la aplicación Android se subiría a un servidor con el que conectaría la herramienta web y el especialista llevara el seguimiento de sus pacientes. Otros tipos de avances podrían ser la generación de gráficas con respecto a las muestras tomadas para que el especialista examinara los datos de una forma más rápida y sencilla que si sólo viera valores numéricos. Integración con llamadas en segundo plano Otra mejora interesante sería el hecho de no ser una aplicación independiente, sino integrarse con la aplicación de llamadas y grabar mientras el usuario atiende sus llamadas telefónicas. De esta manera sería una monitorización más continua, y se reduce al mínimo la interacción del usuario con la aplicación, sin tener que explícitamente coger el teléfono y dirigirse de manera voluntaria a la aplicación para obtener su valor pulmonar en ese instante. Extensión a otras plataformas Esta aplicación donde reside todo su valor es en el algoritmo que emplea para desde una señal de audio en formato wav es capaz de detectar los eventos respiratorios y además con la duración y energía de estos puede aproximar un valor pulmonar. Por tanto la exportación a otras plataformas como puede ser web, iOS, Firefox OS o cualquier otro sistema operativo móvil no llevaría consigo grandes problemas. Sólo habría que encontrar la manera de grabar sonido en cada una de estas plataformas y después pasarlo a un arreglo de números en coma 76 flotante con signo y el algoritmo haría el resto. Historial de las tomas por paciente La aplicación resultante tan sólo muestra el estado una vez se toma la muestra pero no realiza ningún tipo de registro de sus estados para mantenerlo en el teléfono, el usuario realiza la prueba y se muestra su estado que el puede registrar en papel o en algún sitio para tener constancia de su evolución. Una de las mejoras que se podrían incluir en la aplicación sería que sólo pudiera ser utilizada por un usuario (o contar con perfiles) e ir creando estadísticas y gráficas en función de los diferentes resultados que obtenga al hacerse la prueba. Inclusión de la monitorización de otros sensores Una mejora interesante sería la monitorización de otros sensores del teléfono como pueden ser el acelerómetro o el giróscopo, con los cuales se puede detectar la actividad que realiza el usuario previamente a la toma de la muestra. En otras palabras, se puede detectar si el usuario justo antes de hacer la prueba ha estado corriendo, andando, subiendo escaleras o estático, lo cual puede influir mucho en el resultado. Porque una persona sin aparentemente ningún sintoma de enfermedades respiratorias puede hacerse la pruebas después de subir varios pisos por las escaleras y encontrarse fatigado, clasificandolo la aplicación como con un importante grado de obstrucción respiratoria que nada tiene que ver con su estado habitual. Inclusión de conjunto de entrenamiento mixto Debido a la falta de voluntarias femeninas durante la fase final del proyecto no ha sido posible la recolección de muestras de respiraciones de mujeres para entrenar tanto al primer algoritmo de template matching como para crear un modelo en el segundo algoritmo correspondiente a mujeres asmáticas y otro modelo correspondiente a mujeres sanas. Como mejora futura se podrían buscar dichas voluntarias y ampliar el abanico de personas monitorizables por este sistema. Ampliación de la granularidad estados respiratorios Como última mejora se propone incluir nuevos estados respiratorios a la salida para dotar al sistema de mayor granularidad a la hora de obtener los resultados, sin limitarse sólo a tres como actualmente. 7.4 Publicaciones Como resultado de este proyecto y las líneas de investigación llevadas a cabo por el laboratorio MAmI de la Escuela Superior de Informática de Ciudad Real, se ha elaborado un artículo de investigación titulado “Towards a non-intrusive self-management system for Asthma Control using smartphones”. Este artículo ha sido aceptado para su publicación y presentación en el congreso UCAmI 2014 celebrado en Belfast. 77 7.5 Conclusión personal Con el desarrollo de este TFG he realizado mi primer trabajo de una envergadura mayor a los que vengo realizando a lo largo de la carrera, además de ser mayor lo tiene que acotar uno mismo y fijarse los hitos para ir completando todas y cada una de las partes que éste se compone. Este tipo de trabajos se salen de la normalidad dentro de la titulación, ya que normalmente las prácticas de cada una de las asignaturas se centran sólo en aspectos de dicha asignatura. En cambio este tipo de desarrollos integra muchos de los campos que se han tratado de manera independiente durante la carrera. En este caso he utilizado conocimientos de Álgebra para el manejo de matrices, Estadística para el cálculo de los descriptores que comentaba anteriormente y RStudio, de Ingeniería del Software a la hora de utilizar una metodología de trabajo, de Física el hecho de manejar una señal de audio y trabajar con frecuencias, y por supuesto la programación a todos los niveles para acabar teniendo como resultado esta aplicación. Por otra parte al tratarse de un trabajo que ha requerido bastante investigación me ha gustado bastante, nunca me había planteado dedicarme a la investigación pero el hecho de coger varios artículos y con ellos crear algo totalmente nuevo cogiendo cosas de unos y otros me ha resultado bastante atractivo. Si a eso le sumas que el resultado del trabajo va a ayudar a personas con un problema como es el asma es muy gratificante. Cuando estuve haciendo las pruebas, puerta por puerta, la gente más joven se sorprendía de que se pudiera llegar a tener algo como un espirómetro en el teléfono móvil y querían tenerla cuanto antes instalada. La gente mas mayor por su parte les parecía como si les hablaras en un idioma totalmente distinto pero también querían tener esa facilidad en el teléfono de sus hijos o nietos, y no necesitar desplazarse al hospital para hacerse estas pruebas. 78 Referencias [AF14] A. Abushakra y M. Faezipour. A Novel Lung Capacity Model to Virtually Aid in Breath Regulation. International Journal of High Speed Electronics and Systems, 23(01n02):1450011, 2014. url: http://www.worldscientific.com/ doi/abs/10.1142/S0129156414500116. [And] Android. Android website. url: http://www.android.com. [aud] Audacity website. url: http://audacity.sourceforge.net/. [BP04] M. Bahoura y C. Pelletier. Respiratory sounds classification using cepstral analysis and Gaussian mixture models. En Engineering in Medicine and Biology Society, 2004. IEMBS ’04. 26th Annual International Conference of the IEEE, volume 1, páginas 9–12, Sept 2004. [BP09] B.Holz y P.Whitten. Managing Asthma with Mobile Phones: A Feasibility Study. Nov 2009. [Bra14] J. Bravo. m-Health: Mobile Computing and Health Monitoring. J. of Computation in Biosciences and Engineering, 2014. [BW] P. Boersma y D. Weenink. Praat: doing phonetics by computer. url: http:// www.fon.hum.uva.nl/praat/. [com] comSCORE. Spain Digital Future in Focus 2013. http://www.digital-nature.com/uploads/documentos/ 2013-Spain-Digital-Future-in-Focus.pdf. url: [GBGG05] J. Gosling, B.Joy, G.Steele, y G.Bracha. Java(TM) Language Specification, The (3rd Edition) (Java (Addison-Wesley)). Addison-Wesley Professional, 2005. [gim] Gimp website. url: http://www.gimp.com. [GMA+ 12] D. Gustafson, M.Wise, A.Bhattacharya, A. Pulvermacher, K.Shanovich, B.Phillips, E.Lehman, V.Chinchilli, R.Hawkins, y JS. Kim. The Effects of Combining Web-Based eHealth With Telephone Nurse Case Management for Pediatric Asthma Control: A Randomized Controlled Trial. J Med Internet Res, 14(4):e101, Jul 2012. url: http://www.jmir.org/2012/4/e101/. 79 [GPNS11] S. Gupta, P.Chang, N.Anyigbo, y A. Sabharwal. mobileSpiro: portable openinterface spirometry for Android. En Irwin Mark Jacobs, Patrick SoonShiong, Eric Topol, y Christofer Toumazou, editors, Wireless Health, página 24. ACM, 2011. url: http://dblp.uni-trier.de/db/conf/wh/wh2011.html# GuptaCAS11. [Gun] D. Gunning. Medicamentos para el asma. url: https://www.greenhosp.org/ upload/docs/FactSheets/Spanish/pulmonary asthma.pdf. [JC08] G. Hernández JR. Calvo, R. Fernández. Métodos de extracción, selección y clasificación de rasgos acústicos para el reconocimiento del locutor. Ciudad de La Habana, Cuba, 2008. [JZZ09] J. Yu J. Zhang, W. Ser y T.T. Zhang. A Novel Wheeze Detection Method for Wearable Monitoring Systems. Intelligent Ubiquitous Computing and Education, International Symposium on, 0:331–334, 2009. [kil] Kile website. url: http://kile.sourceforge.net/. [LGB+ 12] E. Larson, M. Goel, G. Boriello, S.Heltshe, M.Rosenfeld, y S.N.Patel. SpiroSmart: Using a Microphone to Measure Lung Function on a Mobile Phone. En Proceedings of the 2012 ACM Conference on Ubiquitous Computing, UbiComp ’12, páginas 280–289, New York, NY, USA, 2012. ACM. url: http://doi.acm.org/10.1145/2370216.2370261. [lib] LibreOffice website. impress/. url: https://es.libreoffice.org/descubre/ [PL03] J. Hilario E.A. Sánchez P. Letelier, M.C. Penadés. Metodologías Ágiles en el desarrollo de Software. VIII Jornadas de Ingeniería de Software y Bases de Datos, JISBD, 2003. url: http://issi.dsic.upv.es/archives/ f-1069167248521/actas.pdf. [Rac] Vikas Rachna, D. Singh. Feature Extraction From Asthma Patient’s Voice Using Mel-Frequency Cepstral Coefficients. IJRET: International Journal of Research in Engineering and Technology. [RBH93] L. Rabiner y J. Biing-Hwang. Fundamentals of Speech Recognition. PrenticeHall, Inc., Upper Saddle River, NJ, USA, 1993. [RL07] D. Ruinskiy y Y. Lavner. An Effective Algorithm for Automatic Detection and Exact Demarcation of Breath Sounds in Speech and Song Signals. Audio, Speech, and Language Processing, IEEE Transactions on, 15(3):838–850, March 2007. 80 [RQD00] DA. Reynolds, TF. Quatieri, y RB. Dunn. Speaker verification using Adapted Gaussian mixture models. En Digital Signal Processing, página 2000, 2000. [rst] RStudio website. url: http://www.rstudio.com/. [sdk] Android SDK. url: http://developer.android.com/sdk/index.html. [stu] Android Studio. url: https://developer.android.com/sdk/installing/ studio.html. [tre] Trello website. url: http://trello.com/. [WHOa] WHO. Asthma. url: http://www.who.int/respiratory/asthma/en/. [WHOb] WHO. Scope: asthma. scope/en/. url: http://www.who.int/respiratory/asthma/ 81 ANEXOS 83 Recogida muestras comparativas: smartphone - espirómetro .1 Recogida correspondiente al trabajo en el módulo IIa En un principio la idea que se tenía era de recoger muestras tanto con la aplicación resultante del Módulo IIa como con el espirómetro convencional y con estas entradas alimentar un algoritmo que empleara lógica difusa para encontrar la similitud entre ambas señales. Como se necesitaba gran cantidad de muestras para que los resultados fueran lo más fiables posibles, en un principio se intentó realizar dicho proceso en el entorno de un hospital y contando con la colaboración de los neumólogos para facilitar la comprensión de los datos obtenidos. No se pudo llevar a cabo ya que ningún especialista mostró interés y la necesidad de pasar por el comité de ética del hospital se alargarían demasiado los plazos del proyecto. Por lo tanto esta recogida de información se hizo por cuenta propia,se buscaron personas con trastornos respiratorios o alergias que alteraran el funcionamiento respiratorio y a éstas se les realizaron las pruebas. Antes de nada a todas las personas de las cuales se tomaron muestras se les hacía entrega de una autorización que nos permitía recabar algunos de sus datos (Figura 3) y nos daban su consentimiento (Figura 4). Sobre los aspectos legales todos los datos relativos a una persona que sean obtenidos o distribuidos están sujetos a la Ley Orgánica de Protección de Datos (LOPD) y el Real Decreto 1720/2007 que se debe cumplir para garantizar el derecho a la protección de datos de carácter personal en territorio español. La LOPD distingue entre información que identifica o hace identificable a una persona e información que no identifica, en este caso la única información con la que se trabaja es un ID que no tiene información personal que sólo permite diferenciar a unas de otras, la edad de la persona, altura, peso, si es asmático, alérgico o fumador y su sexo. Son datos con los que no se es capaz de identificar a dicha persona. Se puede apreciar en la tabla que también se han tomado muestras a algunos menores, pero todo ello tras sus padres dar el consentimiento y firmar la autorización que es citada anteriormente. Por último un apéndice en la LOPD indica que la información recabada sobre los españoles debe residir en territorio español, para en cualquier momento que se solicite esa información 85 Figura 3: Datos aportados por los sujetos saber donde se encuentra. En este caso la información reside en el ordenador del autor del presente documento. .2 Recogida correspondiente al trabajo en el módulo IV Con el objetivo de probar el algoritmo desarrollado en los módulos IIb y III así como la usabilidad de la aplicación Android inicial en la que sólo se recogían audios se vuelve a hacer otra recogida de muestras. En este caso los asmáticos estacionales con relación a alergías primaverales (como puede ser el polen, gramineas, etc) ya no serían de utilidad al realizarse las pruebas en el mes de Octubre , sólo se ha centrado en enfermos crónicos de asma. En esta ocasión se ofrecieron como voluntarios cuatro hombres y dos mujeres, la mecánica que se siguió en esta recogida fue realizar dos pruebas: una prueba totalmente en 86 reposo y otra después de hacer algún tipo de actividad aunque sólo fuera andar unos metros o subir y bajar unas escaleras. Las muestras obtenidas serán empleadas en el módulo IV para caracterizar el modelo que será la referencia para comparar las muestras entrantes y a más similitud con éste más tiende a tener algún tipo de obstrucción respiratoria el paciente. 87 INFORMACIÓN AL PACIENTE Y CONSENTIMIENTO INFORMADO DEL ESTUDIO: Título del estudio: Aplicaciones espirométricas en plataforma Android. Yo,....................................................................................................................................... ............................................................................ (nombre y apellidos del paciente) Presto libremente mi conformidad para participar en el estudio. He podido hacer preguntas sobre el estudio y he recibido suficiente información. Comprendo que mi participación es voluntaria. Comprendo que puedo retirarme del estudio: 1. Cuando quiera. 2. Sin tener que dar explicaciones. 3. Sin que esto repercuta en mis cuidados. Fecha:...................................................................... Firma del participante Fecha:...................................................................... Firma del investigador Tal como se establece en el Real Decreto 1720/2007 y la Ley Orgánica de Protección de Datos de Carácter Personal 15/1999, el consentimiento para el tratamiento de sus datos personales y para su cesión es revocable. Vd. puede ejercer el derecho de acceso, rectificación y cancelación dirigiéndose al investigador, el cual lo pondrá en conocimiento del promotor. Figura 4: Autorización empleada para obtener el consentimiento de las personas que han colaborado 88 Distribución de la carga de trabajo del proyecto En este anexo se relata y se muestra con esquemas como ha sido el desarrollo de SiMoA y la justificación del tiempo empleado. Inicialmente alrededor de Octubre de 2013 comenzó todo contactando con el director del proyecto y la gente del grupo de investigación MAmI, así como la búsqueda de información tanto acerca de la espirometría individualmente como acerca de la existencia de algunos espirómetros en las diferentes plataformas móviles. No se inició el anteproyecto de manera concurrente al proyecto ya que había que ir avanzando un poco en el campo para ver si las ideas iniciales eran viables con los recursos existentes. La primera idea fue crear un espirómetro sobre la plataforma Android que obtuviera los datos pertinentes mediante la espirometría forzada del mismo. En la totalidad del mes de octubre se centro en el aprendizaje de como funciona Android y unas pinceladas de como se programan las aplicaciones, completando la totalidad del “Módulo I: Captura señal de audio” para finales del mismo mes. El Módulo IIa: Espirometría forzada se alargó durante los meses de noviembre, diciembre y enero, debido a la falta de idea y experiencia con el manejo de señales acústicas, y también a los exámenes y trabajos relativos al final del primer cuatrimestre con varias asignaturas de 3o y 4o curso. Este módulo IIa constituyó la entrega final de una de dichas asignaturas, siendo necesario algún refinamiento de él tras las correcciones del profesor de la asignatura. Las correcciones del módulo se llevaron a cabo durante los meses de febrero y marzo haciendo multitud de pruebas que probaran el buen funcionamiento del módulo. Tras hacer el refinamiento del módulo y la aplicación, tuvo lugar la recogida de muestras por parte de varias personas que se ofrecieron voluntarias como bien se explica en el Anexo 7.5. Esta recogida de muestras inicialmente iba a ser llevada a cabo dentro de un hospital con casos reales de asmáticos y empleando un espirómetro profesional, pero no se pudo llevar a cabo. Esto dio lugar a la adquisición de un espirómetro portatil y se realizó la recogida de muestras entre gente conocida del autor del documento con reconocidos transtornos respiratorios. Después de hacer toda la recogida de muestras tuvo lugar un punto de inflexión donde el proyecto cambia de rumbo dejando la espirometría forzada a un lado y centrándose en la detección de los valores respiratorios en el habla. Durante el mes de abril se vuelve a estudiar la situación y las posibilidades existentes, resultando como conclusión la creación de una aplicación que consiga grabaciones de múltiples personas para después estudiar di89 chas grabaciones y de ahí deducir los valores espirométricos. Parte del mes de abril y mayo consistieron en la implementación de dicha aplicación y además una aplicación web desarrollada en PHP para alojar los resultados. La aplicación fue publicada en el Google Play pero la inmensa mayoría de los usuarios no hicieron un uso correcto teniendo que dar otro nuevo enfoque. Este sería el enfoque definitivo, se detectarían los eventos respiratorios dentro de una muestra de audio. Se realiza el anteproyecto durante parte del mes de mayo siendo aprobado en el mes de junio. Se inicia así la implementación del Módulo IIb: obtención de los vectores de características de los Frames en este mes de junio que se alargaría durante prácticamente todo el mes lo que respecta a investigación, implementación y pruebas. En el mes de julio se implementó el módulo III: Similitud template-muestra que ha sido uno de los módulos que mas trabajo ha llevado ya que ha incluido cálculos estadísticos para fijar umbrales y la realización de múltiples grabaciones para probar tanto la voz como la respiración hasta que se ha dado con los resultados mas óptimos posibles para aumentar la robustez del algoritmo. Este módulo se finalizó totalmente en el mes de Agosto cuando se fijaron los valores de todos los umbrales y los resultados arrojados por este algoritmo de detección de eventos respiratorios eran los deseados. Durante las primeras semanas de septiembre se estudió como llevar a cabo la distinción entre respiración sana y respiración con algún tipo de obstrucción para durante la segunda quincena de septiembre hasta mediados de octubre en el desarrollo del Módulo IV. Por último la parte final del proyecto se desarrolló durante los meses de octubre y parte de noviembre creando la aplicación Android que integra los dos algoritmos y muestra el estado del usuario. Descripción Mes Días Horas Inicio Módulo I Módulo IIa Refinamiento y recogida muestras Asma-Alergia-Voz Anteproyecto Módulo IIb Módulo III Módulo IV Módulo V Memoria Octubre Octubre De Noviembre a Enero Febrero y Marzo Abril y Mayo Mayo Junio De Julio a Septiembre Septiembre y Octubre Octubre y Noviembre De Junio a Noviembre 6 10 20 15 20 10 20 40 20 10 - 18 30 60 30 60 20 80 210 80 40 - Cuadro 1: Desglose (en meses) del desarrollo del proyecto Además de mostrar en la tabla anterior las horas en bruto que ha llevado cada una de las partes del proyecto, a continuación se muestran dos gráficas en las que se divide el tiempo 90 Figura 5: División del trabajo por meses Figura 6: Divisón del trabajo por módulos invertido en este proyecto tanto por meses (Figura 5) como por módulos (Figura 6). Resultando como el módulo que mas trabajo ha llevado el III debido a la multitud de cálculos y pruebas necesarias hasta que ha quedado lo suficientemente robusto. 91 Elección conjunto de entrenamiento y cálculo Bm/2 El algoritmo que se emplea para determinar si parte de una muestra, audio en este caso, se corresponde con un evento respiratorio se ha empleado un algoritmo de template matching como se viene explicando en el presente documento. Se necesita entonces una serie de muestras que sirvan para confeccionar esa plantilla o template. En este caso para obtener los mejores resultados posibles con el algoritmo y que se pueda aplicar en diferentes dispositivos se han tomado muestras tanto en un dispositivo Android (Nexus 4) como en un dispositivo iOS(iPhone 4s). Se han tomado muestras leyendo varias lecturas con ambos dispositivos a tres voluntarios entre los que se encuentra el autor del proyecto. Después todas esas muestras se han examinado con Audacity para recortar sólo los eventos respiratorios (Figura 7), quedando finalmente un total de 19 eventos respiratorios para garantizar unos buenos resultados. Estos 19 eventos respiratorios (Figura 8) son los que decidirán en gran medida si un subframe dentro de una muestra corresponde o no a un evento respiratorio. Dado que este conjunto de entrenamiento siempre será el mismo después de haber hecho las pruebas necesarias con los archivos .wav se ha creado un objeto serializable que contiene el objeto BreathTrainingSet al que se le han añadido todos los wav. Esto supone un importante ahorro de espacio en el proyecto puesto que los 19 archivos wav ocupan 1.3 MB y el objeto .ser 102.2 KB y ahorra el construir un objeto nuevo cada vez que se ejecute el programa. A continuación se muestra el código necesario para crear el objeto serializable (Listado 1) y el código necesario para leerlo una vez se ha creado (Listado 2). Brea thTra iningS et bTrainingSet = new Br eathTr ainin gSet () ; bTrainingSet . addExample ( " ./ breaths_set / inspiration1 . wav " ) ; bTrainingSet . addExample ( " ./ breaths_set / inspiration2 . wav " ) ; Figura 7: Selección de evento respiratorio dentro de un audio 93 bTrainingSet . addExample ( " ./ breaths_set / inspiration3 . wav " ) ; bTrainingSet . addExample ( " ./ breaths_set / inspiration4 . wav " ) ; bTrainingSet . addExample ( " ./ breaths_set / inspiration5 . wav " ) ; bTrainingSet . addExample ( " ./ breaths_set / inspiration6 . wav " ) ; bTrainingSet . addExample ( " ./ breaths_set / inspiration7 . wav " ) ; bTrainingSet . addExample ( " ./ breaths_set / expiration1 . wav " ) ; bTrainingSet . addExample ( " ./ breaths_set / expiration2 . wav " ) ; bTrainingSet . addExample ( " ./ breaths_set / expiration3 . wav " ) ; bTrainingSet . addExample ( " ./ breaths_set / expiration4 . wav " ) ; bTrainingSet . addExample ( " ./ breaths_set / expiration5 . wav " ) ; bTrainingSet . addExample ( " ./ breaths_set / expiration6 . wav " ) ; bTrainingSet . addExample ( " ./ breaths_set / re sp ir ac io n1 Ip ho ne . wav " ) ; bTrainingSet . addExample ( " ./ breaths_set / re sp ir ac io n2 Ip ho ne . wav " ) ; bTrainingSet . addExample ( " ./ breaths_set / re sp ir ac io n3 Ip ho ne . wav " ) ; bTrainingSet . addExample ( " ./ breaths_set / re sp ir ac io n4 Ip ho ne . wav " ) ; bTrainingSet . addExample ( " ./ breaths_set / re sp ir ac io n5 Ip ho ne . wav " ) ; bTrainingSet . addExample ( " ./ breaths_set / re sp ir ac io n6 Ip ho ne . wav " ) ; try { FileOutputStream fs = new FileOutputStream ( " trainingSetObj . ser "); O bje ct Ou tp ut St re am os = new O bj ec tO ut pu tS tre am ( fs ) ; os . writeObject ( bTrainingSet ) ; os . close () ; } catch ( Exception e ) { System . out . println ( " Se ha producido un error " ) ; } Listado 1: Serialización de un objeto BreathTrainingSet Bre athTra iningS et bTrainingSet = null ; try { FileInputStream fs = new FileInputStream ( " trainingSetObj . ser " ) ; Obj ectInp utStre am os = new Ob jectIn putSt ream ( fs ) ; bTrainingSet =( B reathT rainin gSet ) os . readObject () ; os . close () ; } catch ( Exception e ) { System . out . println ( " Se ha producido un error " ) ; } Listado 2: Recuperación del objeto serializado Una vez ya se ha determinado el conjunto de entrenamiento a emplear se debe fijar un umbral que indique si el coeficiente Cp de un superFrame se corresponde a un evento respiratorio. El umbral se denominará Bm/2 y se obtiene mediante el siguiente procedimiento. 94 Figura 8: Conjunto de entrenamiento seleccionado Se entrena el algoritmo con las muestras ya elegidas creando un objeto BreathTrainingSet después se comparan una a una cada una de las muestras que forman el conjunto de entrenamiento con él mismo. Se descompone cada muestra en subframes y superframes y tras calcular el cepstrograma de cada superframe se calcula su coeficiente Cp con el método computeCpCoefficient de la clase SimilarityCoefficents que recibe como parámetro el cepstrograma del superFrame. Se guardan todos y cada uno de los coeficientes Cp de los superframes de las muestras y se aplica la siguiente fórmula: Bm/2 = min{Cp superF rames de cada una de las muestras} 2 95 (1) Este documento fue editado y tipografiado con LATEX empleando la clase esi-tfg que se puede encontrar en: https://bitbucket.org/arco group/esi-tfg 97