Sistema Holter de Aquisição e Processamento contínuo do Eletrocardiograma através de telefone celular Guilherme José Nunes Carvalho Dissertação para obtenção do Grau de Mestre em Engenharia Eletrotécnica e de Computadores Júri Presidente: Prof. Carlos Filipe Gomes Bispo Vogal: Prof. Rodrigo Martins de Matos Ventura Orientador: Prof. João Miguel Raposo Sanches Outubro de 2011 Agradecimentos Voltar a estudar duas décadas após a conclusão de um curso, é algo que se apresenta a todos nós como um enorme desafio, não só porque iremos abordar e desenvolver um conjunto de novos conceitos e conhecimentos, para os quais é imprescindível dedicarmos o devido tempo, mas também pela necessidade de conciliação horária, entre as atividades académicas e o desenvolvimento diário da nossa vida pessoal e profissional. Aos meus pais, Guilherme e Sofia Carvalho, pela força e apoio que incessantemente me dedicaram durante esta nova fase da minha vida. Este momento também vos pertence. À minha namorada, Andréa Silva, pelo amor, força e motivação que sempre me transmitiu, em todos os momentos deste meu projeto. Ao professor João Sanches, pela sua dedicação e forma contagiante com que nos envolve no dia-a-dia, que nos desperta e estimula para a conquista de novas ideias. Aos meus colegas da Mobile Team e a todos os meus amigos, pela curiosidade, interesse e força que me transmitiram. Obrigado! I Resumo Atualmente existe no mercado uma enorme variedade de equipamentos de monitorização e análise de sinais fisiológicos. Em todos estes equipamentos, são semelhantes os princípios básicos de aquisição dos sinais, contudo, a forma como os sinais são analisados, processados e a informação disponibilizada, varia muito de equipamento para equipamento, abrindo assim oportunidades de introdução de novos produtos no mercado. Associando a estas oportunidades, a difusão generalizada de telemóveis com elevada capacidade de armazenamento e de processamento, formulou-se o objetivo da presente dissertação, desenvolver e implementar um sistema de aquisição e processamento contínuo do Eletrocardiograma (Holter) para telemóvel. Neste trabalho, foram desenvolvidas duas aplicações. A primeira aplicação (mHolter), corre num telemóvel Nokia com o sistema operativo Symbian S60. Efetua a aquisição e processamento em tempo real do eletrocardiograma, identificando os artefactos e detetando possíveis cenários de arritmias, com recurso a um filtro de Kalman. A segunda aplicação (oHolter) permite visualizar o eletrocardiograma num computador pessoal, disponibilizando ao utilizador um conjunto estendido de funcionalidades de procura e de visualização dos registos efetuados pelo mHolter. A linguagem de programação utilizada no desenvolvimento de todo o projeto foi o Python (versão 1.9.7 para S60 e 2.5.4 para Windows). Palavras-chave: ECG, Eletrocardiograma, Holter, Telemóvel, Arritmia, Kalman, filtragem II Abstract There is currently available in the market, a huge variety of equipment for the monitoring and analysis of physiological signals. In all these devices, the basic principles of signal acquisition are similar, however, the way signals are analyzed, processed and information is provided, varies greatly for each equipment, thus opening opportunities for introducing new products in the market. Associating to these opportunities, the widespread diffusion of mobile phones with high storage and processing capacity, it was formulated the goal of this thesis, develop and implement a continuous ECG acquisition Holter system for mobile phones. In this project, two applications were developed. The first application (mHolter) runs on a Nokia mobile phone with Symbian S60. The application performs the acquisition and real-time processing of the electrocardiogram, identifying artifacts and detecting possible scenarios of arrhythmias, by recurring to a Kalman filter. The second application (oHolter), displays the ECG on a personal computer, providing the user an extended set of searching and viewing functionalities, based in the records provided by the mHolter application. Python programming language was used for the full project development (version 1.9.7 for S60 and 2.5.4 for Windows). Keywords: ECG, Electrocardiogram, Holter, Mobile phone, Arrhythmia, Kalman, filtering III Índice Agradecimentos ........................................................................................................ I Resumo ..................................................................................................................... II Abstract ................................................................................................................... III Índice ........................................................................................................................ 1 Índice de Figuras...................................................................................................... 3 Índice de Tabelas ..................................................................................................... 5 Abreviaturas ............................................................................................................. 6 1 Introdução .......................................................................................................... 7 1.1 Motivação e Objetivos.......................................................................................... 8 1.2 Estrutura da Dissertação ..................................................................................... 8 2 Fisiologia elétrica do Sistema Cardíaco......................................................... 10 2.1 O Coração ......................................................................................................... 10 2.2 O Eletrocardiograma (ECG) ............................................................................... 11 2.3 O Dispositivo Holter ........................................................................................... 12 3 Arquitetura e Descrição do Sistema ............................................................... 14 3.1 Arquitetura Geral do Sistema ............................................................................. 14 3.2 Cinta Cardíaca ................................................................................................... 15 3.3 Módulo de Aquisição ......................................................................................... 15 3.4 Interface de Programação (API) ........................................................................ 16 3.4.1 Estrutura Base das Mensagens ..................................................................... 16 3.4.2 Mensagens de streaming (periódicas) ........................................................... 17 3.4.3 Dimensionamento do buffer de receção (ECG) ............................................. 19 3.5 Telemóvel (plataforma base da aplicação mHolter) ........................................... 20 1 3.6 Computador Pessoal (plataforma base da aplicação oHolter) ........................... 21 4 Aplicações e Algoritmos de Processamento ................................................. 22 4.1 Aplicação mHolter .............................................................................................. 22 4.2 Interface Bluetooth ............................................................................................. 23 4.3 Interface com o Utilizador .................................................................................. 25 4.4 Gravação da Sessão ......................................................................................... 26 4.5 Deteção de Picos R do Complexo QRS ............................................................. 28 4.6 Deteção e Processamento de Artefactos ........................................................... 29 4.7 Interpolação do sinal ECG ................................................................................. 30 4.8 Filtro de Kalman................................................................................................. 32 4.9 Deteção de Arritmias ......................................................................................... 35 4.10 Geração de Alarmes ...................................................................................... 36 4.11 Aplicação oHolter .......................................................................................... 37 5 Apresentação e Análise dos Resultados ....................................................... 40 5.1 Aquisição e gravação do Eletrocardiograma ...................................................... 40 5.2 Deteção de Picos R do Complexo QRS ............................................................. 41 5.3 Deteção e Processamento de Artefactos ........................................................... 42 5.4 Interpolação do sinal ECG ................................................................................. 45 5.5 Filtro de Kalman................................................................................................. 46 5.6 Deteção de arritmias .......................................................................................... 52 6 Conclusões ...................................................................................................... 56 7 Referências ...................................................................................................... 57 2 Índice de Figuras Figura 1 - Distribuição das maiores causas de morte (fonte: Global Atlas on cardiovascular disease prevention and control) ................................................. 7 Figura 2 - O coração (fonte: Manual MERCK - Biblioteca Médica online) .............................. 10 Figura 3 - Sístole e diástole do coração (fonte: Manual MERCK - Biblioteca Médica online)................................................................................................................ 11 Figura 4 - Ondas que compõem o eletrocardiograma ............................................................. 12 Figura 5 - Exemplo de aplicação do Holter (fonte: Manual MERCK - Biblioteca Médica online) ................................................................................................... 13 Figura 6 - Arquitetura geral da solução.................................................................................... 14 Figura 7 - Cinta cardíaca Zephyr Smart Fabric ....................................................................... 15 Figura 8 - Módulo de aquisição Zephyr BioHarness BT .......................................................... 15 Figura 9 - Conjunto módulo de aquisição e cinta cardíaca ..................................................... 16 Figura 10 - Estrutura de dados base das mensagens ............................................................. 17 Figura 11 - Exemplo: streaming do tipo “General Data”. ......................................................... 18 Figura 12 - Estrutura do pacote de streaming "ECG Waveform" ............................................ 19 Figura 13 - Codificação de cada amostra ECG (a 10 bits cada) ............................................. 19 Figura 14 - Diagrama de blocos da aplicação mHolter ........................................................... 23 Figura 15 - Pedido de pacotes periódicos (ECG Waveform) .................................................. 24 Figura 16 - Interface de utilização da aplicação mHolter ........................................................ 25 Figura 17 - Diagrama de blocos do mHolter e identificação dos sinais relevantes ................ 27 Figura 18 - Formato de gravação do mHolter .......................................................................... 27 Figura 19 - Relação entre ritmos cardíacos e o tipo de atividade (fonte: primefit.com - Measuring Your Maximum Heart Rate).......................................................... 29 Figura 20 - Exemplo de sinal ECG a ser interpolado .............................................................. 31 Figura 21 - Resultado da interpolação efetuada sobre o sinal ECG ....................................... 32 Figura 22 - Etapas da filtragem de Kalman ............................................................................. 33 Figura 23 - Algoritmo de aferição da estabilidade do sinal RRV ............................................. 36 Figura 24 - Imagem da aplicação oHolter ................................................................................ 38 Figura 25 - Exemplos de sinal ECG recolhidos pelo módulo Zephyr...................................... 40 Figura 26 - Sinal ECG e saída do Detetor de Picos R ............................................................ 41 Figura 27 - Deteção de artefacto simples (por provocação de tosse) .................................... 42 Figura 28 - Deteção de artefacto provocado por tosse, com reavaliação do sinal BIN .......... 43 Figura 29 - Deteção de artefacto provocado pelo movimento da cinta cardíaca ................... 44 Figura 30 - Deteção de artefacto devido a movimento continuado da cinta cardíaca ............ 45 Figura 31- Resultado da interpolação do ECG: sinal RRV ..................................................... 46 3 Figura 32 - Simulação 1 (filtro de Kalman): Q=1E-5; R=1E-3 ................................................. 47 Figura 33 - Simulação 2 (filtro de Kalman): Q=1E-4; R=1E-3 ................................................. 48 Figura 34 - Simulação 3 (filtro de Kalman): Q=1E-3; R=1E-3 ................................................. 48 Figura 35 - Simulação 4 (filtro de Kalman): Q=1E-4; R=1E-5 ................................................. 49 Figura 36 - Simulação 5 (filtro de Kalman): Q=1E-4; R=1E-4 ................................................. 49 Figura 37 - Simulação 6 (filtro de Kalman): Q=1E-4; R=1E-2 ................................................. 50 Figura 38 - Ritmo cardíaco após filtragem (cenário moderado com poucos artefactos) ......................................................................................................... 51 Figura 39 - Ritmo cardíaco após filtragem (cenário exigente e repleto de artefactos) ........... 52 Figura 40 - Deteção de arritmia por comparação dos ritmos RRV e KLM .............................. 54 Figura 41 - Deteção de arritmia irregular por comparação dos ritmos RRV e KLM ............... 55 4 Índice de Tabelas Tabela 1 - Pacotes de streaming disponibilizados pelo módulo de aquisição ........................ 18 Tabela 2 - Lista de métodos (pedidos) disponibilizados pela classe Zephyr .......................... 24 Tabela 3 - Parâmetros registados no ficheiro de configuração ............................................... 26 Tabela 4 - Medidas para determinação das necessidades de gravação ................................ 28 Tabela 5 - Métodos disponibilizados pela classe Kalman ....................................................... 35 Tabela 6 - Lista de alarmes registados pelo mHolter .............................................................. 37 Tabela 7 - Parâmetros a simular para o filtro de Kalman ........................................................ 47 5 Abreviaturas ALM - Sinal de alarme (artefacto ou arritmia) API - Application Programming Interface BIN - Sinal binário resultante do detetor de picos R BPM - Batimentos por minuto BT - Bluetooth CSV - Comma-separated Values CRC - Cyclic Redundancy Check CVD - Cardiovascular Diseases ECG - Sinal Eletrocardiograma GUI - Graphical User Interface IR - Infrared KLM - Sinal Variação do Ritmo R-R após filtragem de Kalman mHolter - Mobile Holter oHolter - Offline Holter OMS - Organização Mundial da Saúde PC - Personal Computer RFCOMM - Radio Frequency Communication (protocol) RRV - Sinal Variação do ritmo R-R SD-CARD - Secure Digital (SD) Card SDK - Software Development Kit SMS - Short Message Service USB - Universal Serial Bus 6 1 Introdução Num estudo recentemente publicado pela Organização Mundial da Saúde, revela-se que as doenças cardiovasculares são a principal causa de morte em todo o mundo [1]. De acordo com o estudo, estima-se que 17,3 milhões de pessoas morreram em 2008, devido a doenças cardiovasculares, o que representa 31% de todas as mortes na população mundial (ver Figura 1), contribuindo para este cenário, as doenças coronárias e cerebrovasculares cerebrais, com 7,3 milhões e 6,2 milhões respetivamente. Figura 1 - Distribuição das maiores causas de morte (fonte: Global Atlas on cardiovascular disease prevention and control) Um dos aspetos mais pragmáticos do estudo é o fato de mais de 3 milhões das mortes devidas a doenças cardiovasculares ocorrerem antes dos 60 anos de idade, e puderem ter sido prevenidas, desde que atempadamente diagnosticadas e acompanhadas. Hoje em dia existe uma grande variedade de exames e procedimentos para facilitar e tornar mais preciso o diagnóstico de doenças cardiovasculares. Estes incluem registos da atividade elétrica do coração (eletrocardiograma), radiografias, ecocardiogramas, ressonância magnética, entre outros. O eletrocardiograma é contudo, o método rápido, simples e indolor, podendo ser realizado em vários cenários, nomeadamente em repouso, com prova de esforço ou em regime ambulatório contínuo, sendo precisamente este último cenário, o objeto da presente dissertação. 7 1.1 Motivação e Objetivos As soluções de monitorização e análise disponíveis hoje em dia no mercado, apresentam princípios de funcionamento muito semelhantes, no que respeita a aquisição dos sinais fisiológicos. A forma como estes sinais são processados e a informação é apresentada ao utilizador torna-se basicamente no principal fator de diferenciação, abrindo naturalmente espaço para o desenvolvimento de produtos novos e inovadores. Associando-se as estas oportunidades, a difusão generalizada dos telemóveis de elevada capacidade de processamento [2], o desenvolvimento e implementação de sistemas de aquisição, processamento e transmissão de dados biomédicos, passa a ter uma potencial nova plataforma, leve, portátil, com boa capacidade de armazenamento, apresentação gráfica, e acima de tudo, de baixo custo: o telemóvel. O objetivo da presente dissertação é desenvolver e implementar um sistema de aquisição e processamento contínuo do Eletrocardiograma através de telefone celular, doravante designado de mHolter (Mobile Holter). A função do mHolter é monitorizar continuamente a atividade elétrica cardíaca do paciente por períodos extensos, que podem ir de 24 a 48 horas. Durante o período de observação, o mHolter regista e processa o eletrocardiograma recolhido através de uma cinta cardíaca, separando artefactos e ocasionais arritmias cardíacas, que seriam difíceis de identificar num período de tempo curto, como é o caso dos exames de eletrocardiografia (ECG). Complementarmente, para maior comodidade e facilidade de utilização, foi desenvolvida uma aplicação de visualização do traçado do ECG - oHolter (Offline Holter), disponibilizando um conjunto estendido de funcionalidades de procura e visualização dos registos efetuados pelo mHolter. 1.2 Estrutura da Dissertação A presente dissertação encontra-se dividida em 6 capítulos. No Capítulo 1, é introduzido o tema da dissertação, motivação e objetivos a atingir. No Capítulo 2, é descrita a fisiologia elétrica do sistema cardíaco e sinais fisiológicos relevantes no contexto da dissertação. No Capítulo 3, é apresentada a arquitetura do sistema e respetivos componentes, que uma vez integrados, compõem a solução. No Capítulo 4, são descritas as aplicações e algoritmos desenvolvidos, sendo o Capítulo 5 dedicado à apresentação dos resultados experimentais. 8 Finalmente, no capítulo 6, são apresentadas as conclusões do trabalho realizado e algumas linhas orientadoras de possíveis evoluções do mesmo. 9 2 Fisiologia elétrica do Sistema Cardíaco 2.1 O Coração O coração é um órgão muscular situado no meio do tórax, e que possui, tanto do lado direito como do lado esquerdo, uma cavidade superior (aurícula), que recebe o sangue, e uma cavidade inferior (ventrículo), que o expulsa (ver Figura 2). Para garantir que o sangue corra num só sentido, os ventrículos dispõem de uma válvula de entrada e outra de saída. Figura 2 - O coração (fonte: Manual MERCK - Biblioteca Médica online) A função primária do coração é proporcionar o oxigénio a todo o organismo e, ao mesmo tempo, libertá-lo dos produtos de eliminação (anidrido carbónico). Esta função pressupõe recolher o sangue do organismo, pobre em oxigénio, e bombeá-lo para os pulmões, onde é oxigenado e o anidrido carbónico libertado, sendo depois este sangue, agora rico em oxigénio, enviado para todos os tecidos do organismo [3]. Em cada batimento, quando as cavidades do coração se relaxam, estas enchem-se de sangue (período chamado de diástole) e, quando se contraem, expelem-no (período chamado de sístole). A Figura 3 ilustra este processo. As duas aurículas relaxam-se e contraem-se simultaneamente, assim como os ventrículos. 10 Figura 3 - Sístole e diástole do coração (fonte: Manual MERCK - Biblioteca Médica online) A circulação sanguínea no coração faz-se da seguinte forma. Primeiro, o sangue pobre em oxigénio e sobrecarregado de anidrido carbónico proveniente de todo o organismo chega à aurícula direita, através das duas maiores veias (as veias cavas superior e inferior). Quando a aurícula direita se enche, impulsiona o sangue para o ventrículo direito; quando este se enche, bombeia o sangue através da válvula pulmonar para as artérias pulmonares, com destino aos pulmões. Nos pulmões, o sangue flui através de pequenos vasos capilares que rodeiam os sacos de ar, absorvendo o oxigénio e libertando anidrido carbónico, que é imediatamente exalado. Já rico em oxigénio, o sangue circula pelas veias pulmonares até à aurícula esquerda. Este circuito entre o lado direito do coração, os pulmões e a aurícula esquerda denomina-se de «circulação pulmonar». Quando a aurícula esquerda se enche, empurra o sangue rico em oxigénio para o interior do ventrículo esquerdo; quando este, por sua vez se enche, impulsiona o sangue através da válvula aórtica para a aorta, a maior artéria do corpo. O sangue rico em oxigénio abastece então todo o organismo. 2.2 O Eletrocardiograma (ECG) O eletrocardiograma é um método rápido, simples e indolor, no qual se captam, amplificam-se e registam-se os impulsos elétricos do coração. Estes impulsos representam a corrente elétrica que circula através do coração durante uma contração. A onda que caracteriza o ECG é dividida em várias partes, designadas alfabeticamente pelas letras P a U (ver Figura 4). 11 Figura 4 - Ondas que compõem o eletrocardiograma Como se pode observar na figura, cada batimento cardíaco começa com um impulso do pacemaker fisiológico principal do coração (nódulo sino-auricular). Este impulso ativa primeiro as cavidades superiores do coração (aurículas). A onda P representa esta ativação das aurículas. Depois, a corrente elétrica flui para baixo, na direção das câmaras inferiores do coração (ventrículos). O complexo QRS representa a ativação dos ventrículos. A onda T representa a onda de recuperação, enquanto a corrente elétrica difunde-se para trás sobre os ventrículos na direção oposta. O sinal de ECG recolhido à superfície do corpo humano é de reduzida amplitude, podendo ocasionalmente ser corrompido com ruído, gerado quer pelo deslocamento dos elétrodos, quer pela atividade muscular junto dos pontos de aquisição. 2.3 O Dispositivo Holter A deteção de problemas cardíacos, que geralmente acontecem de forma breve ou imprevisível, requer o uso de um registador portátil contínuo do ECG. O paciente transporta um pequeno aparelho, alimentado a bateria (monitor Holter), que adquire e grava permanentemente o sinal ECG durante um período que pode ir de 24 a 48 horas. A Figura 5 ilustra a colocação e aplicação do Holter e respetivos elétrodos num paciente. 12 Figura 5 - Exemplo de aplicação do Holter (fonte: Manual MERCK - Biblioteca Médica online) Os resultados da gravação são processados posteriormente, através de um computador que analisa a velocidade e frequências cardíacas, procurando alterações na atividade elétrica que possam indiciar problemas cardíacos. 13 3 Arquitetura e Descrição do Sistema 3.1 Arquitetura Geral do Sistema A Figura 6 mostra a arquitetura geral da solução, descriminando os vários elementos que a compõe, assim como as tecnologias de comunicação envolvidas: Figura 6 - Arquitetura geral da solução Da esquerda para a direita, encontramos o conjunto cinta e módulo de aquisição. Para desempenhar as funções de aquisição e transmissão por bluetooth do eletrocardiograma, foi selecionado o produto BioHarness™ BT do fabricante Zephyr [4]. De seguida, o telemóvel Nokia, modelo 5250 [5]. O telemóvel comunica com a cinta cardíaca através de uma ligação por bluetooth, correndo em cima deste suporte um protocolo específico do fabricante, designado de BioHarness Bluetooth API. Após o primeiro emparelhamento, a informação de configuração fica memorizada em ambos os dispositivos, tornando-se depois muito simples a sua utilização por parte da camada superior, a aplicação mHolter. Finalmente, no lado direito, a aplicação oHolter processa os ficheiros de registo do eletrocardiograma, criados pela aplicação mHolter, disponibilizando ao utilizador uma interface gráfica de utilização, com funções de avanço, recuo, procura e visualização do histórico de cada sessão de captura. O segundo telemóvel receberá informação de alarmes que eventualmente ocorram durante as sessões de captura e processamento do ECG. 14 3.2 Cinta Cardíaca A cinta cardíaca Zephyr Smart Fabric (ver Figura 7), incorpora sensores para aquisição dos sinais ECG e ritmo respiratório. Figura 7 - Cinta cardíaca Zephyr Smart Fabric 3.3 Módulo de Aquisição O módulo de aquisição do eletrocardiograma, BioHarness BT do fabricante Zephyr (ver Figura 8), foi selecionado por apresentar a interface bluetooth, indispensável à comunicação com o telemóvel e um kit de desenvolvimento (SDK) com uma API de programação extremamente flexível. Figura 8 - Módulo de aquisição Zephyr BioHarness BT 15 Trata-se de um equipamento leve e compacto, servindo o propósito a que se destina, ou seja, a utilização intensiva, por extensos períodos, que podem ir de 24 a 48 horas, disponibilizando um vasto conjunto de funcionalidades: Conectividade por bluetooth e USB Saídas configuráveis, consoante a necessidade de informação Ritmo cardíaco: 25 – 240 BPM (±1 BPM) Ritmo respiratório: 3 – 70 BPM (±1BPM) Sensor IR de temperatura da pele: 10 – 60 °C (±0.1°C) Posição / postura: ± 180° Sensor de aceleração a 3 eixos Registo do ECG a 250Hz (250 amostras por segundo) Capacidade de armazenamento de 570 horas Na Figura 9, podemos ver o módulo instalado na cinta cardíaca Zephyr Bioharness Strap Smart Fabric: Figura 9 - Conjunto módulo de aquisição e cinta cardíaca Após o arranque (botão power), o módulo de aquisição pode ser programado de três formas: apenas registo, registo e transmissão ou apenas transmissão. Neste projeto utiliza-se apenas o modo de transmissão. A gravação do ECG é efetuada na memória de armazenamento do telemóvel (interna ou SD-CARD). 3.4 Interface de Programação (API) 3.4.1 Estrutura Base das Mensagens A comunicação com o módulo de aquisição é ponto-a-ponto e numa base de pedido/resposta. Quando é enviado um pedido, o módulo responde basicamente numa de duas formas: se o pedido for considerado válido, a mensagem de resposta será na forma de uma 16 confirmação – ACK (acknowledge), com os dados solicitados. Se o pedido for considerado inválido, a mensagem de resposta será simplesmente NAK (not acknowledge). Existe uma exceção a esta regra: trata-se dos casos em que são transferidas mensagens periódicas (streaming). Nestes casos, o módulo de aquisição não precisa responder com as mensagens ACK / NAK. A Figura 10 ilustra a forma como se realiza a comunicação entre dispositivos (módulo de aquisição e telemóvel), bem como a estrutura de dados subjacente. Figura 10 - Estrutura de dados base das mensagens Os campos STX e MsgID são fixos e representam o início e tipo de mensagem. O campo DLC é calculado consoante o número de bytes a transferir (Data Payload), sendo obrigatório de seguida o cálculo e inserção do CRC sobre a informação útil a transferir. Finalmente, o campo ETX termina a mensagem. No caso das mensagens de resposta, este campo não é usado, sendo o mesmo substituído pela confirmação (ACK ou NAK). 3.4.2 Mensagens de streaming (periódicas) A receção do sinal ECG vai incidir maioritariamente na utilização de mensagens periódicas (streaming), as quais resultam de um pedido por parte do telemóvel, para o qual o módulo de aquisição inicia um processo de envio periódico de pacotes com a informação solicitada. Este processo é interrompido apenas quando o telemóvel solicita o cancelamento do envio. A Tabela 1 ilustra os vários tipos de mensagens periódicas suportadas pelo módulo de aquisição. Destes tipos, o foco do trabalho foi o pacote de streaming (ECG Waveform), através do qual são recebidas as amostras do sinal ECG. 17 Tabela 1 - Pacotes de streaming disponibilizados pelo módulo de aquisição A Figura 11 mostra um exemplo do protocolo de comunicação, no caso de um pedido de streaming do tipo “General Data”. O módulo de aquisição suporta vários pedidos de streaming, sendo possível programar-se o envio simultâneo de todos pacotes de streaming anteriormente mencionados. Link bluetooth Aplicação mHolter Módulo de aquisição e Cinta cardiaca Zephyr Figura 11 - Exemplo: streaming do tipo “General Data”. No caso do pacote de streaming "ECG Waveform", recebido e processado pela aplicação mHolter, este encontra-se estruturado conforme se ilustra na Figura 12: 18 Figura 12 - Estrutura do pacote de streaming "ECG Waveform" Sendo que as 63 amostras nele contidas são codificadas a 10 bits cada, de acordo com o formato da Figura 13: Figura 13 - Codificação de cada amostra ECG (a 10 bits cada) 3.4.3 Dimensionamento do buffer de receção (ECG) Dado que o pacote de streaming “ECG Waveform”, através do qual são recebidas as amostras do sinal ECG, é recebido no telemóvel a cada 252 [ms], temos: [ ] (1) Sendo o número de amostras por pacote “ECG Waveform” igual a 63, temos: [ ] (2) Então, o número de amostras por segundo a ser processado no telemóvel será: 19 [ ] (3) Sendo a duração de uma amostra igual a 4 milissegundos: [ ] [ ] (4) Foi no entanto verificado em testes isolados de receção dos pacotes de streaming ECG que, apesar de se verificar a periodicidade no envio dos mesmos, muitas vezes não são totalmente preenchidos com o máximo de amostras (63 amostras), o que resulta em variações do débito de amostras recebidas no telemóvel. Uma vez que se pretende mostrar no ecrã do telemóvel, o ECG em tempo real e com o mínimo de variações possíveis em termos da sua velocidade de arrastamento no ecrã, foi necessário criar um mecanismo que sustente estas variações de débito. Este mecanismo consiste no aumento ou diminuição da velocidade de apresentação dos sinais no display do telemóvel, na proporção da dimensão do buffer de receção. 3.5 Telemóvel (plataforma base da aplicação mHolter) Para correr a aplicação mHolter, foi selecionado um telemóvel Nokia, modelo 5250, com o sistema operativo Symbian S60. Este modelo, além de cumprir com os requisitos mínimos de desenvolvimento (sistema operativo Symbian S60), apresenta-se também no mercado por um valor muito competitivo, na ordem das dezenas de euros, cumprindo portanto com as premissas anteriormente estabelecidas de baixo custo, bom desempenho e capacidade de armazenamento, apresentando neste caso um processador ARM II a 434 MHz e 51Mb de memória interna. A linguagem de programação utilizada foi o Python (versão 1.9.7 para S60), por se tratar de uma linguagem de programação de alto nível, estruturada e orientada por objetos, apresentando as seguintes vantagens comparativamente a outras linguagens: Qualidade do código: A sintaxe do Python facilita e encoraja a legibilidade do código, o que o torna mais fácil de manter e reutilizar. Produtividade: é mais rápido desenvolver um mesmo código em Python do que noutras linguagens, como o C, C++ ou Java. O código é mais compacto, requer menos linhas, e não necessita da declaração prévia das variáveis e respetivos tipos. Não requer um ciclo de compilação, podendo o programa ser executado imediatamente. 20 Portabilidade: possibilidade do programa correr, sem qualquer alteração, em várias plataformas como o Linux e o Windows. Disponibilidade de uma vasta biblioteca de funções 3.6 Computador Pessoal (plataforma base da aplicação oHolter) Tal como no caso do mHolter, a aplicação oHolter foi igualmente desenvolvida em Python (versão 2.5.4 para Windows). No que respeita a interface gráfica com o utilizador (GUI), foi selecionado o toolkit wxPython (wrapper da biblioteca wxWidgets), que disponibiliza uma interface rica de elementos gráficos, garantindo em simultâneo a portabilidade entre plataformas (Windows, Linux, Mac OS, entre outras). 21 4 Aplicações e Algoritmos de Processamento 4.1 Aplicação mHolter A aplicação mHolter efetua a aquisição e processamento em tempo real do eletrocardiograma, sua visualização e respetiva gravação, identificando artefactos e detetando possíveis arritmias no ritmo cardíaco do paciente. A deteção de arritmias é conseguida por interpolação do sinal ECG, seguida de filtragem, através de um filtro de Kalman, e depois por comparação entre o sinal interpolado e o sinal filtrado. As principais funcionalidades do mHolter são: Interface com o utilizador e com o módulo de aquisição do ECG Adquirir, processar e gravar localmente (no telemóvel) o sinal ECG Produzir e gravar localmente os sinais de variação do ritmo R-R (sinal RRV), detetor de picos R (sinal BIN), resultado da filtragem de Kalman: sinal KLM (RRV filtrado) Mostrar em tempo real e no modo browse (a partir de uma sessão gravada), o sinal ECG e sinais associados Deteção, registo e identificação visual de artefactos e arritmias detetadas Envio programado de alarmes por SMS Registo das sessões gravadas, com possibilidade de browse Visualização da evolução do ritmo R-R durante toda da sessão de aquisição: sinais RRV e KLM (RRV após a filtragem de Kalman) Gravação dos sinais e alarmes em ficheiro no formato CSV Registo permanente dos principais parâmetros da aplicação Apresenta-se de seguida, na Figura 14, o diagrama de blocos da aplicação, bem como a relação entre os vários módulos que a compõem. 22 Figura 14 - Diagrama de blocos da aplicação mHolter 4.2 Interface Bluetooth As funcionalidades associadas à interface bluetooth encontram-se definidas na classe Zephyr. Para que se possa iniciar a comunicação entre o módulo de aquisição e o telemóvel (pedidos / respostas ou streaming de dados), é necessário em primeiro lugar estabelecermos uma porta de comunicação série (RFCOMM) entre os dois dispositivos. Para o efeito, o Python disponibiliza na sua livraria os stream sockets, que implementam esta ligação. O endereço do dispositivo de aquisição Zephyr é atualizado pelo método discover(), sempre que for associado um novo dispositivo, sendo o estabelecimento da ligação efetuado através do método connect(). Uma vez estabelecida a ligação, o módulo de aquisição fica pronto a receber comandos, sendo o utilizador informado deste facto pelo círculo de cor verde no canto superior direito do display, que de outra forma se apresentará de cor amarela, significando neste caso que ainda está a efetuar a ligação. A Tabela 2 lista os principais métodos de acesso e controlo do módulo de aquisição, disponibilizados pela classe Zephyr à aplicação mHolter: 23 Método Descrição get_rtc_time() Devolve um tuple com a hora, minutos e segundos get_rtc_date() Devolve um tuple com o dia, mês e ano set_rtc_date_time() Acerta a data e hora do módulo de aquisição set_packet_state() Activa ou desativa o envio de pacotes periódicos (streaming) set_BT_config() Anula o controlo de timeout e lifesign por parte do módulo de aquisição get_BT_config() Obtêm o estado atual do timeout e lifesign get_rt_data() Devolve o buffer de amostras recolhidas pelo módulo de aquisição reboot_request() Reboot do módulo de aquisição Tabela 2 - Lista de métodos (pedidos) disponibilizados pela classe Zephyr Com a ativação do envio de pacotes periódicos, o método set_packet_state() inicia um thread, com vista ao tratamento independente (em paralelo) do stream de pacotes que irá passar a receber por parte do módulo de aquisição. A utilização de threading permite evitar situações de bloqueio, quando por exemplo não existem dados no socket. A Figura 15 ilustra um pedido de pacotes periódicos (ECG Waveform) por parte da aplicação mHolter e as ações que este pedido desencadeia do lado do módulo Zephyr. Podemos ver igualmente o lançamento da thread update(), responsável pela receção dos pacotes periódicos. Zephyr mHolter Main() set_packet_state() update() Thread para receção do ECG recvf() RFCOMM socket get_rt_data() Buffer de receção do ECG (Zephyr) Buffer de receção do ECG (mHolter) Figura 15 - Pedido de pacotes periódicos (ECG Waveform) 24 4.3 Interface com o Utilizador A aplicação mHolter disponibiliza uma interface do tipo touch screen, para a interação do utilizador com as várias funcionalidades disponibilizadas. A Figura 16 mostra a hierarquia desta interface, resumindo as funções associadas a cada opção. Abrir Registo Abertura de ficheiro ECG para visualização (browse) no display do telemóvel Registos Apagar Registo Real Time: ON/OFF Visualizar Menu Principal Configurar Inicia / Pára a aquisição do ECG Inicio / fim da sessão. O utilizador define o nome do ficheiro ECG a gravar ECG: Sim/Não Visualização em tempo real do sinal ECG no display do telemóvel RRV: Sim/Não Visualização em tempo real do sinal RRV no display do telemóvel RRV (Kalman):Sim/Não Visualização em tempo real do sinal RRV , filtrado pelo filtro de Kalman BIN: Sim/Não Opção de visualização do sinal BIN, resultado do detector de picos Linha de Threshold: Sim/Não Visualização da linha de threshold no display do telemóvel Offsets/Escalas Offset e escala dos sinais ECG, RRV, RRV (Kalman) e BIN a visualizar no display do telemóvel Browse step Alteração do passo das funções de avanço e recuo, na visualização dos sinais Telemóvel p/alarme Acertar Data/Hora Reboot Relatórios Apagar ficheiro ECG guardado (delete) RRV e RRV (Kalman) Definição do número de telemóvel para a comunicação de alarmes. Acerto da data e hora no dispositivo de aquisição Reinicialização do dispositivo de aquisição Gráfico mostrando a evolução dos sinais RRV e RRV (Kalman) para toda a sessão Figura 16 - Interface de utilização da aplicação mHolter 25 À medida que o utilizador efetua alterações nos principais parâmetros da aplicação, estes são registados no ficheiro de configuração mHolter.CFG. Desta forma, não é necessário repetir as alterações quando a aplicação é reinicializada. A Tabela 3 mostra os parâmetros que são registados. Parâmetro Valor Descrição OFFS_ECG 60 Offset de translação vertical do sinal ECG no display OFFS_RRV 90 Offset de translação vertical do sinal RRV no display BROWSE_STEP 100 Passo das funções de avanço e recuo (modo browse) service 1 Serviço RFCOMM (=1 por defeito) SCA_RRV 100 Escala de visualização do sinal RRV no display SCA_ECG 40 Escala de visualização do sinal ECG no display OFFS_BIN 5 Offset de translação vertical do sinal BIN no display SCA_BIN 5 Escala de visualização do sinal BIN no display address <addr> Endereço do dispositivo de aquisição Zephyr THRESHOLD 550 Linha de threshold (definida pelo detetor de pico) TLM_ALARME <tlm> Número de telefone para reporte de alarmes (por SMS) SCA_KLM 100 Escala de visualização do sinal RRV filtrado OFFS_KLM 90 Offset de translação vertical do sinal RRV filtrado Tabela 3 - Parâmetros registados no ficheiro de configuração 4.4 Gravação da Sessão O sinal ECG, sinais associados BIN, RRV, RRV filtrado (KLM), artefactos e alarmes (ALM), são gravados em ficheiros no formato CSV, sendo por isso possível a posterior edição em folhas de cálculo (exemplo: Microsoft Excel), de modo a facilitar outro tipo de análise que se pretenda fazer no futuro. A Figura 17 mostra em detalhe, o diagrama de blocos da aplicação mHolter com a identificação dos pontos de extração destes sinais. 26 Figura 17 - Diagrama de blocos do mHolter e identificação dos sinais relevantes Na Figura 18 é mostrado o formato de gravação que foi definido para a aplicação. As primeiras duas colunas indicam a data e hora de aquisição. As restantes cinco colunas registam o valor das amostras associadas a cada um dos sinais. Figura 18 - Formato de gravação do mHolter 27 Dado que a aplicação mHolter irá funcionar por períodos extensos, tipicamente de 24 a 48 horas, há que acautelar as suas necessidades em termos de espaço na memória não volátil do telemóvel (interna ou SD-CARD). Nesse sentido, foram efetuadas as medidas que constam da Tabela 4, com o objetivo de se determinar o número de bytes necessário por linha de gravação. Número de linhas Bytes ocupados Rácio (bytes/linha) 10 328 32,80 100 3298 32,98 1.000 34.408 34,41 10.000 350.470 35,05 Tabela 4 - Medidas para determinação das necessidades de gravação Sendo o número de amostras por segundo igual a 250 (equação 3) e sabendo que a cada amostra corresponderá uma linha, então podemos calcular velocidade de gravação, considerando o rácio bytes/linha mais exigente: [ ] (5) Com base nesta velocidade, as necessidades de gravação para 24 e 48 horas serão respetivamente: [ ] [ (6) ] (7) Ou seja, são atingidas facilmente dimensões próximas do gigabyte, pelo que é imprescindível o telemóvel dispor de uma SD-CARD (ou memória interna) com o mínimo de 2Gb. 4.5 Deteção de Picos R do Complexo QRS A detecção de picos R no complexo QRS é efetuada por observação das amostras cujos valores se situem acima de um determinado nível (threshold). Esta observação é realizada pelo método find_RR_points(), que é evocado periodicamente pelo método get_rt_data(), sempre que existam novas amostras a processar. Dado que o sinal ECG recebido do módulo de aquisição se apresenta sem variações da linha de base e sem componentes de alta frequência, não se verificou a necessidade de se efetuar qualquer pré-filtragem. 28 Sempre que um pico R é detectado, previamente ao seu registo no array addBIN[], é efetuada uma verificação de que o mesmo não é artefacto. Esta verificação é de extrema importância, evitando que falsos picos R influenciem incorretamente o comportamento do filtro de Kalman. A influência do detector de pico nos resultados da filtragem de Kalman é desenvolvida mais adiante, e deve-se basicamente ao fato do sinal BIN constituir uma entrada do filtro de Kalman, que decide sobre se a saída do filtro terá como base a estimativa à priori (caso do sinal BIN ser zero) ou a estimativa à priori calculada conjuntamente com o valor da amostra e respectivo ganho de Kalman. 4.6 Deteção e Processamento de Artefactos Os artefactos podem ter as mais diversas origens, sendo as mais comuns a interferência resultante de ruídos internos e externos ao sistema de aquisição, como são exemplos o ruído produzido pelos movimentos musculares ou resultantes da deslocação da cinta cardíaca. A deteção de artefactos implementada baseia-se no princípio de que dois máximos acima da linha de threshold, devem respeitar um intervalo mínimo de separação entre eles, para que possam ser considerados efetivamente parte de um intervalo R-R. Para se encontrar este intervalo mínimo, recorreu-se a várias tabelas que relacionam o número de batimentos por minuto e percentagem de esforço consoante o tipo de exercício e idade do paciente. A Figura 19 mostra uma destas tabelas típicas. Figura 19 - Relação entre ritmos cardíacos e o tipo de atividade (fonte: primefit.com - Measuring Your Maximum Heart Rate) 29 Assumindo como pressuposto que o mHolter vai adquirir o eletrocardiograma com o paciente a desenvolver a sua atividade quotidiana, portanto na zona moderada, temos que o número máximo de batimentos por minuto não excederá, na maioria dos casos os 120 BPM (60% de esforço): [BPM] (8) Neste pressuposto, tendo como base o número de amostras por segundo recebidas no telemóvel (equação 3), podemos calcular o número de amostras mínimo que se deve verificar entre dois máximos, para que os mesmos possam ser considerados um intervalo R-R: [ ] (9) A este valor corresponde a constante RR_ARTEFACT, definida na aplicação mHolter e usada pelo método artefact(), para decisão sobre estamos perante um intervalo R-R ou um artefacto. Caso tenha sido encontrado um artefacto, é efetuado um procedimento adicional de limpeza do último ponto R detetado, pelo fato do artefacto ora detetado estar normalmente associado a uma perturbação prévia. Esta função é executada pelo método clean_last_RR() e efetua o varrimento até ao máximo de RR_ARTEFACT amostras no passado. Todos os artefactos detetados são registados no ficheiro de gravação com a constante ALM_Artefact. Desta forma, os mesmos podem ser visualizados no display do telemóvel (em tempo real), à posteriori, no modo de browse, ou mais tarde através aplicação oHolter. 4.7 Interpolação do sinal ECG Na análise de sinais fisiológicos, para além do estudo morfológico do sinal, é muito comum o estudo de outros parâmetros do sinal e como estes se comportam no tempo. As doenças do coração que afetam o nódulo sino-auricular (pacemaker fisiológico principal do coração), podem alterar o ritmo normal do coração, resultando numa variação anormal dos intervalos R-R. Aplicando técnicas de interpolação, podemos criar a partir do ECG um novo sinal, que represente no tempo, a variação dos intervalos R-R, e que nos permita observar facilmente o objeto de interesse, a variação dos intervalos R-R (RRV). Passando a exemplificar, a Figura 20 mostra um sinal ECG a ser interpolado. 30 Figura 20 - Exemplo de sinal ECG a ser interpolado Sendo a duração de cada intervalo R-R: ( ) ( ) [ ] (10) [ ] (11) A frequência associada a cada intervalo será respetivamente: [ [ ] ] (12) (13) A Figura 21 mostra o sinal RRV, obtido através de interpolação do sinal ECG. 31 Figura 21 - Resultado da interpolação efetuada sobre o sinal ECG Podemos verificar que o sinal interpolado (RRV) apresenta-se como o inverso de cada intervalo R-R em toda a duração deste intervalo, resultando numa medida instantânea da frequência cardíaca, em batimentos por segundo. No processo de interpolação, a frequência cardíaca é multiplicada por 60 segundos, para se obter o seu valor numa unidade mais comum, em batimentos por minuto (BPM). 4.8 Filtro de Kalman A introdução da filtragem de Kalman [6] aplicada ao sinal RRV cumpre essencialmente dois objetivos: primeiro, estimar o ritmo cardíaco, filtrando amostras do sinal RRV que possam eventualmente estar relacionadas com artefactos que não foram detectados na fase de detecção e processamento de artefactos, segundo, estabelecer um patamar de comparação entre a saída do filtro e o sinal RRV à sua entrada, por forma a permitir detectar variações que se enquadrem em cenários de arritmia. Como veremos mais adiante, a detecção destas variações é efetuada apenas quando o resultado da filtragem se mantêm estável por um período de tempo predefinido, assegurando-se assim um maior grau de confiança sobre o procedimento de detecção de arritmias. A filtragem de Kalman é realizada em duas etapas [7]: "time update" e "measurement update". A Figura 22 ilustra este processo. 32 Figura 22 - Etapas da filtragem de Kalman A etapa de predição (time update) projeta para a o futuro, a estimativa atual do estado do processo, enquanto que a etapa de correção (measurement update) atualiza a estimativa projetada, com base numa medição real efetuada no momento. Caracterizando agora o filtro implementado no âmbito do presente projeto, temos as seguintes equações, para cada uma das etapas acima mencionadas: Etapa de predição: ̂ ̂ (14) (15) Etapa de correção: (16) ( ̂ ̂ { ( ̂ ) ̂ ( ( ) ) ) (17) (18) No que respeita a etapa de predição, na equação 14 calcula-se a estimativa à priori ̂ com base na estimativa anterior ̂ . A estimativa à priori é a melhor estimativa do estado do processo, até ao momento em que se realiza uma nova medição. A equação 15 efetua o cálculo da estimativa à priori da covariância do erro . Em suma, esta etapa prepara as estimativas à priori a serem utilizadas na próxima etapa (correção). A etapa de correção incorpora a nova medição nas duas estimativas à priori anteriormente calculadas, ̂ e , com o objetivo de se obter uma melhor estimativa à posteriori ̂ , mais próxima do que será o estado real do processo. Nesta etapa, o primeiro passo consiste no cálculo do ganho de Kalman , de acordo com equação 16. De realçar nesta equação que, quando a covariância do erro de medição (R) ou a 33 estimativa à priori da covariância do erro tenderem para zero, o ganho de Kalman tende para 1 ou 0 respetivamente: (19) (20) O ganho de Kalman influencia o cálculo da estimativa à posteriori (equação 17), conferindo maior ou menor peso ao termo ̂ , denominado de resíduo (ou inovação). Do ponto de vista prático, este resíduo reflete a discrepância entre o valor medido e a estimativa à priori. Um valor residual de zero significa que ambos estão em acordo (estimativa à priori e medida efetuada). Por outro lado, olhando somente para efeito do ganho de Kalman na equação 17, e explorando os casos limite expressos pelas equações 19 e 20, podemos concluir que: Uma covariância do erro de medição tendendo para zero, impõe como estimativa à posteriori o próprio valor medido (a estimativa à priori ̂ é cancelada). Uma estimativa à priori da covariância do erro tendendo para zero, impõe como estimativa à posteriori a própria estimativa à priori (o valor medido é cancelado) É importante realçar que nesta implementação, o cálculo da estimativa à posteriori ̂ depende da existência de um valor medido , ou seja, só se calcula a estimativa a posteriori quando se fazem novas leituras. Nos restantes instantes de amostragem utiliza-se a estimativa à priori: ̂ ̂ . No método kalman_filter(), esta condição é garantida por verificação da saída do detetor de picos R (sinal BIN). Como passo final, na equação 18, a estimativa à posteriori da covariância do erro é também atualizada em função do ganho de Kalman. Apesar de puderem variar no tempo, as covariâncias do ruído (Q) e do erro de medição (R) são consideradas constantes na implementação desta versão do filtro. Como veremos mais adiante, estes parâmetros são usados na afinação do algoritmo, de forma a controlar o grau de suavidade da resposta. Em termos da aplicação mHolter, o filtro de Kalman apresenta-se como uma classe independente, disponibilizando o seguinte conjunto de métodos de controlo e iteração (ver Tabela 5): 34 Método Descrição kalman_reset() Reset ao filtro, com reinicialização dos parâmetros Q, R, , , ̂ ,̂ e para os seus valores por defeito e reinicialização do estabilizador kalman_set_Q() Programar a covariância do ruído kalman_set_R() Programar a covariância do erro de medição kalman_get_Q() Obter a covariância atual do ruído kalman_get_R() Obter a covariância atual do erro de medição kalman_stable() Verificar a estabilidade da saída do filtro (True ou False) kalman_filter(): Filtro de Kalman, implementando as etapas predição e correção Tabela 5 - Métodos disponibilizados pela classe Kalman 4.9 Deteção de Arritmias Através da análise do ECG, podem ser detetadas inúmeras anormalidades no sistema cardiovascular, sendo possível prevenir muitas das doenças que causam estas anormalidades, desde que sejam previamente diagnosticadas e acompanhadas. O sistema mHolter desenvolvido permite detetar e registar distúrbios do ritmo cardíaco que ocorram no decorrer de uma sessão de monitorização em regime ambulatório contínuo. Estes distúrbios podem ser posteriormente visualizados na aplicação oHolter, facilitando a confirmação e o diagnóstico provável de uma causa arrítmica. A deteção variações do ritmo cardíaco é efetuada pela comparação de amplitudes entre o sinal à saída do filtro de Kalman (KLM) e o sinal RRV resultante da interpolação do ECG. Esta comparação é efetuada somente quando a saída do filtro se mantêm estável, ou seja: Apresenta variações na sua amplitude contidas num determinado um intervalo de valores pré-definido Estas variações são mantidas por um período de tempo mínimo, também prédefinido Desta forma, assegura-se um maior grau de confiança sobre o procedimento de deteção de arritmias. Uma variação do sinal KLM após um período em que este permanece estável, é então classificada consoante a diferença encontrada. A estabilidade do sinal KLM pode ser obtida a qualquer momento pela aplicação mHolter, por invocação do método kalman_stable(), sendo esta determinada de acordo com o algoritmo representado na Figura 23. 35 Figura 23 - Algoritmo de aferição da estabilidade do sinal RRV O algoritmo é executado sempre que for solicitado o cálculo de uma nova estimativa no filtro de Kalman. A variável KScount contabiliza o número de vezes consecutivas que a diferença entre a estimativa atual e anterior está contida dentro do intervalo MAX_DELTA. Caso se verifique durante a contagem uma diferença superior a MAX_DELTA, então o contador é reinicializado a zero, pois pretende-se um histórico de várias amostras consecutivas dentro daquele intervalo. No final, caso se verifique uma contagem superior a MAX_COUNT, então pode-se concluir que a resposta do filtro encontra-se estabilizada. 4.10 Geração de Alarmes Consoante o tipo de alarme, o mHolter pode enviar um SMS de notificação para outro telemóvel (definido no ficheiro de configuração). Por defeito, a aplicação envia um SMS apenas no caso em que foi detetada uma grande irregularidade no ritmo cardíaco (ALM_Irregular). A Tabela 6 mostra os vários tipos de alarmes possíveis. Os critérios que levam à constituição de um alarme são descritos no Capítulo 5 - Apresentação e Análise dos Resultados. 36 Alarme Valor Descrição ALM_NoAlarm 0 Nada a assinalar (não existem alarmes) ALM_Artefact 50 Detetado artefacto ALM_Arritmia 100 Detetada arritmia, conforme os parâmetros de caracterização estabelecidos ALM_Irregular 150 Detetada uma grande irregularidade (exemplo: falta de complexo QRS), conforme os parâmetros de caracterização estabelecidos Tabela 6 - Lista de alarmes registados pelo mHolter 4.11 Aplicação oHolter A aplicação oHolter (offline Holter), permite visualizar o eletrocardiograma num computador pessoal correndo o sistema operativo Windows 7, disponibilizando ao utilizador um conjunto estendido de funcionalidades de procura e visualização dos registos previamente efetuados pelo mHolter. A Figura 24 mostra a interface da aplicação oHolter. 37 Figura 24 - Imagem da aplicação oHolter No canto superior direito do ecrã, é mostrada a data e hora correspondente à parte visível do eletrocardiograma, enquanto no eixo horizontal, é apresentada a escala em segundos. Para um acesso fácil e rápido às principais funções da aplicação, é disponibilizada uma toolbar com os seguintes botões (da esquerda para a direita): Abertura de uma nova sessão (ficheiro gerado pelo mHolter) Início, retrocesso, avanço e fim da sessão Seleção dos sinais a visualizar no ecrã (ECG, RRV, KLM e BIN) Visualização do threshold Visualização do histórico de evolução dos sinais RRV e KLM, ao longo da sessão Função de procura por hora / minuto A aplicação disponibiliza igualmente as seguintes possibilidades de configuração: Offsets de translação vertical dos sinais ECG, RRV, KLM e BIN Escalas dos sinais ECG, RRV, KLM e BIN 38 Passo (step) usado nas funções de avanço e retrocesso Gravação das configurações efetuadas. 39 5 Apresentação e Análise dos Resultados As aplicações mHolter e oHolter apresentam na sua interface de utilização, o fundo negro. Esta escolha foi feita com o objetivo de se aproximarem tanto quanto possível das demais aplicações e instrumentos que normalmente se encontram nas clinicas e hospitais. No entanto, para o efeito de impressão da presente dissertação, o fundo foi alterado propositadamente para branco, com o objetivo único de se poupar no toner. 5.1 Aquisição e gravação do Eletrocardiograma A aplicação mHolter foi testada com dados reais, recebidos do módulo de aquisição Zephyr BioHarness. Foram efetuadas cerca de 120 sessões com diferentes durações, num universo restrito a 4 pessoas. No final de cada sessão procedeu-se à cópia dos registos para o computador, para posterior análise na aplicação oHolter. O sinal ECG recolhido apresenta-se geralmente como ilustrado na Figura 25: Figura 25 - Exemplos de sinal ECG recolhidos pelo módulo Zephyr 40 Como se pode constatar, o ECG apresenta-se bastante limpo e estável, sem variações da linha de base e sem componentes de alta frequência. Por esta razão, e uma vez que não foi necessário proceder-se a qualquer tipo de filtragem, a etapas seguintes contemplaram imediatamente o processamento do ECG e sinais associados. 5.2 Deteção de Picos R do Complexo QRS A Figura 26 mostra um sinal ECG e o resultado do detetor de picos. A linha de cor verde representa o nível de threshold a partir do qual o algoritmo de detecção entra em funcionamento. Figura 26 - Sinal ECG e saída do Detetor de Picos R O mHolter permite ajustar no início ou no decorrer de uma sessão, o nível de threshold, por forma a garantir o bom desempenho da aplicação mHolter, independentemente do módulo de aquisição e das características elétricas do sinal recebido através dos sensores da cinta cardíaca, que pode apresentar diferentes níveis de amplitude, de equipamento para equipamento. 41 O resultado da deteção de picos R é de extrema importância para os módulos seguintes (interpolação e filtragem). Por este motivo, além de uma operação de simples deteção com base no threshold, o detetor de pico funciona conjuntamente com a deteção de artefactos, por forma a evitar: Na fase de interpolação, onde se calculam os ritmos cardíacos, entre um falso pico R, que iria original uma falsa variação do ritmo cardíaco (RRV). Na fase de filtragem, entre uma medição (resultante do falso pico R) no filtro de Kalman, originado uma falsa variação do ritmo cardíaco (KLM). 5.3 Deteção e Processamento de Artefactos Os resultados da deteção de artefactos são apresentados ao utilizador através de um retângulo azul, delimitando a zona de perturbação (artefacto). A Figura 27 ilustra a deteção de um artefacto durante uma sessão de aquisição. Este artefacto foi provocado deliberadamente ao tossir. Figura 27 - Deteção de artefacto simples (por provocação de tosse) 42 Podemos observar que o detetor de picos não considera o pico delimitado pelo retângulo (artefacto). Este é um primeiro exemplo do funcionamento conjunto do detetor de picos e de artefactos, evitar prováveis falsos picos R. Na Figura 28 podemos ver outro artefacto, produzido também por tosse, sendo neste caso o processamento ligeiramente diferente: R1 R2 R3 R4 A1 A2 Figura 28 - Deteção de artefacto provocado por tosse, com reavaliação do sinal BIN Neste caso, o artefacto A1 é detetado imediatamente a seguir ao pico R2, estabelecendo-se o critério de evocação do método clean_last_RR(), conforme referido no capítulo 4.6. Este método coloca a zero 125 (RR_ARTEFACT) amostras passadas do detetor de picos, a contar do artefacto A1, que neste caso abrange o pico R2, eliminando-o (circulo a tracejado). Este é outro exemplo do funcionamento conjunto do detetor de picos e de artefactos. No caso do artefacto A2 o critério anterior não é verificado, ou seja, a distância entre o pico R3 e A2 é superior a RR_ARTEFACT, considerando-se por isso R3 como um ponto R válido. 43 Mostra-se de seguida o comportamento do mHolter na deteção de outro tipo de artefactos, provocados pelo movimento da cinta cardíaca. No caso da Figura 29, temos um movimento pontual da cinta, enquanto que no caso da Figura 30, o movimento é contínuo. Em qualquer dos casos podemos observar a boa imunidade da aplicação ao ruído provocado por fatores externos. R1 R2 Figura 29 - Deteção de artefacto provocado pelo movimento da cinta cardíaca Como se pode verificar, existe um pico R1 no meio da zona de perturbação. Contudo, o algoritmo não o considera, dada a proximidade de outros picos R igualmente prováveis, ou seja, o sinal BIN permanece a zero (circulo tracejado). 44 R1 R2 Figura 30 - Deteção de artefacto devido a movimento continuado da cinta cardíaca Neste caso, a aplicação não considera o pico R2 por este se encontrar demasiado próximo da zona de influência do artefacto. Durante a sessão, todos os alarmes são gravados, sendo os artefactos assinalados com a constante ALM_Artefact (ver Tabela 6) 5.4 Interpolação do sinal ECG A Figura 31 apresenta o resultado da interpolação de um sinal ECG adquirido pelo mHolter. O sinal interpolado designa-se RRV (variação dos intervalos R-R) e mostra a evolução no tempo do valor instantâneo do ritmo cardíaco, na unidade BMP (batimentos por minuto). 45 Figura 31- Resultado da interpolação do ECG: sinal RRV Dado que os intervalos apresentam normalmente pequenas variações, é comum efetuarse o cálculo do valor médio do ritmo cardíaco, por exemplo num intervalo de 6 períodos R-R. No caso do mHolter, é imprescindível o registo do valor instantâneo do ritmo cardíaco (sinal RRV) associado a cada intervalo R-R, na medida em que este é injetado no filtro de Kalman e comparado de seguida com a saída do filtro, com o objetivo de se detetar eventuais arritmias. 5.5 Filtro de Kalman Como foi referido anteriormente, a introdução do filtro de Kalman cumpre basicamente dois objetivos: filtrar eventuais variações resultantes do cálculo do ritmo cardíaco, associadas a artefactos que não foram detetados no módulo de deteção e detetar variações do ritmo cardíaco, que se considerem relevantes pela sua dimensão. 46 Para se cumprir com estes dois objetivos, a parametrização do filtro deve implementar uma filtragem tipo passa-baixo, eliminando assimetrias associadas a possíveis artefactos, e simultaneamente acompanhar a evolução do sinal RRV à sua entrada. Com vista à afinação do filtro, foram efetuadas várias simulações com diferentes valores para as covariâncias do ruído (Q) e do erro de medição (R). O valor escolhido para a estimativa inicial foi 60 BPM, por ser um valor típico do ritmo cardíaco em repouso. A Tabela 7 mostra os valores usados para os parâmetros Q e R nas simulações efetuadas. Simulação n.º Q R Resultados (ver figura) 1 1,00E-05 1,00E-03 Figura 32 2 1,00E-04 1,00E-03 Figura 33 3 1,00E-03 1,00E-03 Figura 34 4 1,00E-04 1,00E-05 Figura 35 5 1,00E-04 1,00E-04 Figura 36 6 1,00E-04 1,00E-02 Figura 37 Tabela 7 - Parâmetros a simular para o filtro de Kalman Os resultados das simulações são apresentados de seguida: Figura 32 - Simulação 1 (filtro de Kalman): Q=1E-5; R=1E-3 47 Figura 33 - Simulação 2 (filtro de Kalman): Q=1E-4; R=1E-3 Figura 34 - Simulação 3 (filtro de Kalman): Q=1E-3; R=1E-3 48 Figura 35 - Simulação 4 (filtro de Kalman): Q=1E-4; R=1E-5 Figura 36 - Simulação 5 (filtro de Kalman): Q=1E-4; R=1E-4 49 Figura 37 - Simulação 6 (filtro de Kalman): Q=1E-4; R=1E-2 Conclui-se que mantendo R e aumentando Q, a saída do filtro - sinal KLM (linha a vermelho nos gráficos acima) acompanha cada vez mais a entrada. Afastamo-nos por isso do objetivo, pois não poderemos detectar variações do ritmo cardíaco. Neste caso o melhor valor foi Q=1,00E-4. Por outro lado, mantendo-se Q=1,00E-4 e aumentando-se sucessivamente R, verifica-se que com R=1,00E-3, é atingido o melhor compromisso face ao objetivo proposto, sendo estes os valores programados no módulo Kalman.py da aplicação mHolter. 50 Observando agora o resultado desta parametrização na aplicação, podemos ver na Figura 38, a suavização obtida pela filtragem de Kalman (KLM) face ao sinal original (RRV), num cenário de repouso seguido de esforço moderado e novo repouso, com a simulação de alguns artefactos (movimentos da cinta durante o exercício). Figura 38 - Ritmo cardíaco após filtragem (cenário moderado com poucos artefactos) A Figura 39 mostra a resposta do filtro de Kalman num cenário mais exigente, de repouso seguido de andamento, corrida e novo repouso, sempre com a simulação de artefactos (movimentos da cinta durante o exercício). 51 Figura 39 - Ritmo cardíaco após filtragem (cenário exigente e repleto de artefactos) Neste exemplo, podemos verificar várias irregularidades devidas aos artefactos causados propositadamente. Apesar disso, o resultado da filtragem de Kalman permanece bem mais suave, reduzindo consideravelmente o efeito dos artefactos. 5.6 Deteção de arritmias Por definição, arritmia significa irregularidade nos batimentos cardíacos ou na pulsação. Para que se possa detetar arritmias é necessário primeiro caracterizá-las, através de um modelo (ou conjunto de regras), para seguidamente o aplicarmos ao sinal que pretendemos analisar. O modelo proposto consiste na comparação permanente (em tempo real) do valor instantâneo do ritmo cardíaco (sinal RRV) com a saída do filtro de Kalman (sinal KLM), aplicando-se de seguida os seguintes critérios: 52 Critério 1: A variação instantânea do ritmo cardíaco (sinal KLM) não deve ultrapassar 9 BPM (MAX_DELTA). O objetivo é concluir-se sobre a estabilidade do sinal KLM. Considera-se estável se forem verificados 5 (MAX_COUNT) intervalos R-R consecutivos com variações do ritmo cardíaco contidas no intervalo MAX_DELTA Variações contidas no intervalo MAX_DELTA não são consideradas arritmias Alarme registado no momento de gravação: ALM_NoAlarm (ver Tabela 6) Critério 2: A variação instantânea do ritmo cardíaco (sinal KLM) situa-se entre 9 BPM (MAX_DELTA) e 15 BMP (MAX_ARRITMIA) A conclusão sobre se estamos perante uma arritmia pressupõe a validação das seguintes duas condições: o Antes desta variação, o sinal KLM apresentava-se estável, de acordo com o critério 1 o A variação não está associada a um artefacto, verificando-se que um mínimo de 5 intervalos R-R (DIST_ARTEFACT) a antecede Alarme registado no momento de gravação: ALM_Arritmia (ver Tabela 6) Critério 3: A variação instantânea do ritmo cardíaco (sinal KLM) situa-se acima de 15 BMP (MAX_ARRITMIA) A conclusão sobre se estamos perante uma arritmia pressupõe a validação das duas condições mencionadas no critério 2 Alarme registado no momento de gravação: ALM_FaltaQRS (ver Tabela 6) Mostram-se de seguida exemplos destes critérios, aplicados as sinais recolhidos em duas sessões diferentes. É importante salientar que para uma aplicação real do mHolter, os parâmetros associados aos critérios acima definidos deverão ser testados em vários cenários e sujeitos a afinações de modo a se evitar, tanto quanto possível, situações de falso alarme. Na Figura 40, podemos ver identificada uma arritmia, detetada no intervalo representado pelo retângulo vermelho. 53 Figura 40 - Deteção de arritmia por comparação dos ritmos RRV e KLM Esta arritmia cumpre o critério 2 anteriormente definido, que resulta da verificação de estabilidade, distância mínima do último artefacto e variação do ritmo cardíaco superior ou igual a 9 (MAX_DELTA) batimentos por minuto: (21) Na Figura 41, podemos ver um outro exemplo de deteção, sendo desta vez detetada uma arritmia irregular. 54 Complexo QRS eliminado Figura 41 - Deteção de arritmia irregular por comparação dos ritmos RRV e KLM A arritmia cumpre o critério 3 anteriormente definido, que resulta da verificação de estabilidade, distância mínima do último artefacto e variação superior ou igual a 15 BMP (MAX_ARRITMIA): (22) Neste exemplo, a deteção de arritmia irregular foi verificada por alteração do sinal original, no qual se eliminou propositadamente um complexo QRS, através de uma opção disponibilizada pela aplicação mHolter para este efeito (simulação). 55 6 Conclusões O objetivo estabelecido para a presente dissertação foi desenvolver e implementar um sistema de aquisição e processamento contínuo do Eletrocardiograma (Holter) para telemóvel. Desenvolvido para um telemóvel Nokia com o sistema operativo Symbian S60 e linguagem de programação Python, o mHolter adquire, processa em tempo real e regista o eletrocardiograma, identificando artefactos e detetando possíveis cenários de arritmias, através de um filtro de Kalman. A aplicação de visualização oHolter, igualmente desenvolvida em Python (para ambiente Windows), disponibiliza um conjunto estendido de funcionalidades de procura e visualização posterior dos registos criados. Aliado ao facto de se encontrar presente na vida de todos nós, o telemóvel disponibiliza cada vez mais uma maior capacidade de processamento, transformando-se numa potencial plataforma de desenvolvimento de aplicações ligadas à monitorização de pacientes com necessidade de vigilância contínua, contribuindo assim para o diagnóstico e prevenção de doenças, e consequentemente para a melhoria da qualidade de vida destes pacientes. Os algoritmos propostos para a deteção de artefactos mostraram-se na prática bastante eficazes, contribuindo fortemente para uma maior isenção de ruído nos sinais a serem processados pelos estágios seguintes: interpolação, filtragem e deteção de arritmias. A seleção de uma parametrização adequada do filtro de Kalman permitiu cumprir o objetivo proposto de deteção de arritmias. Contudo, e com vista a uma eventual versão comercial do produto, a parametrização deve ser ajustada com base em testes reais sobre a uma população representativa, que inclua pacientes com problemas de arritmia, confrontados posteriormente os resultados com a opinião final do médico cardiologista. A arquitetura modular do sistema mHolter e restantes funcionalidades disponibilizadas pelo módulo de aquisição da Zephyr, tais como a obtenção da temperatura, respiração, posição (horizontal/vertical), sensor de aceleração, permitem não só o desenvolvimento de outros algoritmos de deteção de anomalias, como também de novas funcionalidades que tirem partido desta informação, ficando o desafio para futuros projetos de desenvolvimento. Uma nota final sobre a linguagem de programação Python, que apesar de se apresentar bastante flexível e ótima para o desenvolvimento rápido de protótipos, trata-se contudo de uma linguagem de script (não compilada), pelo que podem ser consideradas outras alternativas, como por exemplo o C++ ou Java, caso se pretenda desenvolver versões comerciais do produto. 56 7 Referências [1] Cardiovascular diseases. World Health Organization (WHO). Fact sheet N°317, September 2011. Disponível em: http://www.who.int/mediacentre/factsheets/fs317/en/index.html [2] Biomedical signal acquisition, processing and transmission using smartphone. Department of Electronics / Biomedical Engineering, Universidad de Valparaíso, Universidad Técnica Federico Santa María, Casilla 110-V, Valparaíso, Chile [3] Biologia cardiovascular. Manual MERCK (biblioteca online). Disponível em: http://www.manualmerck.net/?id=40 [4] Zephyr - BioHarness Bluetooth Developer Kit, disponível em: http://www.zephyr-technology.com/store/btdeveloperkit.html [5] Especificações do Nokia 5250. Obtido em Março de 2011, de Nokia Portugal: http://www.nokia.pt/produtos/todos-os-modelos/nokia-5250/especificacoes [6] Kalman, R. E. 1960. “A New Approach to Linear Filtering and Prediction Problems,” Transaction of the ASME—Journal of Basic Engineering, pp. 35-45 (March 1960). [7] Greg Welch and Gary Bishop. An Introduction to the Kalman Filter, July 2006. [8] Biomedical Signal Analysis - A case study approach, Rangaraj M. Rangayyan, University of Calgary [9] Bruno Pereira, I. S. (2008). Sistema de aquisição de sinais biomédicos baseado num telefone celular - Aplicação na estimação da temperatura central para determinação do ciclo circadiano do sono. [10] Python. (s.d.). Python Programming Language. Obtido Março de 2011, de Official Website: http://www.python.org/ [11] S., J., & T., V. (2007). Mobile Python - Rapid Prototyping of Applications on the Mobile Platform. Chichester: Wiley. [12] André Batista, (2009). Monitorização contínua e detecção automática de anomalias cardíacas por telemóvel. [13] Guimarães, J.I. Sociedade Brasileira de Cardiologia. Diretriz de interpretação de eletrocardiograma de repouso. [14] Introdução ao Python para S60. Disponível em: http://www.developer.nokia.com/Community/Wiki/Introdu%C3%A7%C3%A3o_ao_Python_para_S60 [15] ECG Diagnostics - Pocket Guide, Edward K. Chung, M.D, Black well Science [16] Introduction to Biomedical Engineering, Second Edition, John D. Enderle, Susan M. Blanchard & Joseph D. Bronzino, Elsevier Academic Press [17] Biomedical Engineering and Design Handbook, Second Edition, Myer Kutz, McGraw Hill [18] Measuring Your Maximum Heart Rate (HRmax) - Exercise zones. Disponível em: http://www.prime-fit.com/c_hrmax.htm 57