• Nenhum resultado encontrado

universidade federal do abc

N/A
N/A
Protected

Academic year: 2023

Share "universidade federal do abc"

Copied!
35
0
0

Texto

(1)

GABRIELA SAYURI WATASE

DESENVOLVIMENTO DE UM SOFTWARE PARA A CLASSIFICAÇÃO DE TREMOR DE MEMBRO SUPERIOR A PARTIR DE MOVIMENTOS DE ESCRITA

São Bernardo do Campo – SP 2019

(2)

GABRIELA SAYURI WATASE

DESENVOLVIMENTO DE UM SOFTWARE PARA A CLASSIFICAÇÃO DE TREMOR DE MEMBRO SUPERIOR A PARTIR DE MOVIMENTOS DE ESCRITA

Monografia apresentada ao curso de graduação da Universidade Federal do ABC como requisito parcial para a obtenção do título de Bacharel em Engenharia Biomédica Orientador: Prof. Dr. Daniel Boari Coelho

São Bernardo do Campo - SP 2019

(3)

RESUMO

Tremor é o distúrbio do movimento com maior prevalência e é caracterizado por oscilação involuntária e rítmica de qualquer parte do corpo. O conhecimento das características do tremor é importante para o diagnóstico diferencial. Esse projeto tem por objetivo o desenvolvimento de um software para mensurar o tremor de membro superior a partir de movimento de escrita. Para isso, o participante deverá seguir a imagem de uma espiral arquimediana mostrada na tela, formando assim um desenho.

A partir das coordenadas da espiral de Arquimedes, foi realizada a estimativa da atividade do tremor. Com esse projeto, pretende-se contribuir para a classificação do tremor de membro superior.

Palavras-chave: tremor, membro superior, espiral arquimediana, classificação, software.

(4)

ABSTRACT

Tremor is the most prevalent movement disorder and it is characterized as an involuntary and rhythmic oscillation of any part of the body. The knowledge of tremor characteristics is important for differential diagnosis. This project aims to develop a software to measure upper limb tremor from the writing movement. For this, the participant should follow the image of an archimedean spiral shown on the screen, thus forming a drawing. From the coordinates of the Archimedes' spiral, an estimate of the activity of the tremor will be performed. This project intends to contribute to the classification of upper limb tremor.

Keywords: tremor, upper limb, archimedean spiral, classification, software.

(5)

SUMÁRIO

1 INTRODUÇÃO 6

3 REVISÃO BIBLIOGRÁFICA 7

4 MÉTODOS 9

4.1 AQUISIÇÃO DOS DADOS 10

4.2 ANÁLISE DOS DADOS 11

5 RESULTADOS 13

5.1 TESTES 19

6 CONCLUSÃO 20

ANEXO 23

(6)

1 INTRODUÇÃO

Um tipo comum de distúrbio do movimento é o tremor. Ele é caracterizado por oscilações involuntárias e rítmicas de qualquer parte do corpo e é gerado por músculos antagonistas (KOLLER, 1984; FIDLEY, 1988 apud BORGES, FERRAZ, 2006). Os tremores podem acometer qualquer região do corpo. Entretanto, os membros superiores e a cabeça são os locais mais comuns (BORGES, FERRAZ, 2006). Tremores podem ser classificados segundo sua etiologia, fenomenologia, frequência e localização (BORGES, FERRAZ, 2006).

No tocante à etiologia, os tremores podem ser classificados como sendo: doenças hereditárias degenerativas e idiopáticas, doenças do sistema nervoso central de várias etiologias, doenças metabólicas, doenças do sistema nervoso periférico, toxinas, drogas e outros (ELBLE et al., 1996 apud LEITE, 2010). A fenomenologia, ou seja, a circunstância em que a desordem se manifesta, é dividida em dois principais grupos: tremor de repouso e tremor de ação.

Para a investigação de tremores em exames clínicos, médicos analisam as extremidades em situação de repouso sobre uma superfície, além de movimentos realizados em atividades cotidianas (LEITE, 2010). Com o intuito de mensurar a gravidade do distúrbio, pode-se realizar um teste padrão onde o paciente precisa desenhar uma espiral arquimediana (LEGRAND et al., 2017).

A espiral arquimediana é uma espiral caracterizada por ter uma distância de separação uniforme, 2𝜋b em todas as suas voltas. Ela é dada pela seguinte expressão (Equação 1) em coordenadas polares (ALMEIDA et. al., 2010):

𝑟 = 𝑎 + 𝑏𝛩

(1) Sendo que r é o raio, 𝛩 é um ângulo, a e b são constantes.

O teste padrão realizado com a espiral arquimediana é analisado visualmente por um especialista em distúrbios do movimento. Contudo, essa análise é subjetiva e não padronizada em todos os aspectos (LEGRAND et al., 2017). Diante dessa lacuna, pesquisadores (ALMEIDA et. al. 2010; ELBLE et al., 1996; LEGRAND et al., 2017;

PULLMAN, 1998; SISTI et al., 2017) desenvolveram maneiras de analisar o tremor por meio de mesa digitalizadora e programas de computador.

(7)

2 OBJETIVOS

Este trabalho tem como objetivo o desenvolvimento de um software em Matlab capaz de classificar tremor de membro superior a partir do desenho de uma espiral arquimediana feita em uma mesa digitalizadora.

3 REVISÃO BIBLIOGRÁFICA

O teste utilizado para o auxílio no diagnóstico de tremores onde o paciente desenha uma espiral e o médico analisa o desenho é objeto de estudo de diversos pesquisadores. Os estudos buscam o desenvolvimento de um software para que o teste padrão possa ser realizado de forma independente da análise subjetiva de um médico, além de oferecer recursos mais precisos, como a análise da amplitude e frequência do tremor.

Elble et al. (1996) foram um dos primeiros pesquisadores a desenvolver um método mais automatizado e objetivo para a análise de tremores. Em seu estudo, os autores analisaram 87 pessoas com tremor essencial. Os pacientes eram instruídos a escreverem as letras “e” e “l” de forma cursiva com uma caneta em um papel pautado fixado em cima de uma mesa digitalizadora. Além das letras, 40 pacientes desenharam também uma espiral arquimediana. Os pesquisadores utilizaram uma mesa digitalizadora e acelerômetros triaxiais para coletarem dados da amplitude e frequência dos tremores na escrita e durante o desenho. Observou-se que a mesa digitalizadora era suficiente para a medição de tremores visíveis. Entretanto, para tremores muito severos, a mesa não era uma boa opção, posto que o paciente não conseguia manter a caneta dentro do espaço de leitura do aparelho. O acelerômetro, que foi utilizado para mensurar tremores do pulso, se mostrou inferior à mesa. A mesa ofereceu medidas mais acuradas da amplitude e frequência do tremor em tarefas de escrita e desenho. Além disso, a utilização da mesa foi mais barata que a utilização do acelerômetro, visto que era necessário um conjunto de acelerômetros e acessórios (amplificadores e conversor analógico-digital) para obtenção de medidas satisfatórias.

Já em 1998, Pullman desenvolve um método computacional para quantificação de tremores por meio da utilização de uma mesa digitalizadora conectada a um microcomputador. O método descrito também se baseia no teste neurológico clínico padrão de desenho de uma espiral com uma caneta. O pesquisador descreve o método como sendo rápido, barato, seguro, não invasivo, portátil e sem precisar

(8)

utilizar fios e acessórios, sendo possível utilizá-lo em uma vasta gama de pessoas. A partir do desenho da espiral feito pelo paciente, colhem-se dados nos eixos X e Y, além da pressão do movimento. Os dados do desenho da espiral feito pelo paciente são comparados com uma espiral feita pelo computador. O autor considera inadequado comparar o desenho do ser humano com uma espiral perfeita feita pelo computador. Por isso, Pullman treina a configuração do computador para ficar semelhante à maneira que os médicos classificam, por meio da Escala de Avaliação da doença de Parkinson. Logo, a máquina foi treinada a partir das melhores avaliações realizadas por médicos diante de espirais desenhadas por pacientes normais e com diferentes tipos de tremores. Posteriormente, o pesquisador extraiu uma série de variáveis, como a “suavidade”, “pressão” e cruzamento com o zero”. Ademais, uma descoberta interessante desta pesquisa é que a parte da espiral desenhada com menos pressão correspondeu ao lado mais afetado pela doença de Parkinson. Os dados obtidos com esse método mostrariam anormalidades sutis que poderia indicar problemas em estágio inicial. Essa pesquisa pode ser útil como marcador inicial de envolvimento clínico ou como medida objetiva para quantificar a mudança após intervenção terapêutica.

Outra pesquisa na área é a de Almeida et al. (2010). No experimento realizado estudou-se características da atividade do tremor determinadas a partir de desenhos de espiral feitos por um grupo experimental composto por 6 pessoas, 3 com tremor fisiológico normal e 3 com tremor fisiológico exacerbado. Para o desenho utilizou-se uma mesa digitalizadora com uma caneta. O estudo foi realizado nas seguintes etapas: linearização da espiral, estimativa da atividade do tremor e extração das características da atividade do tremor. As características da atividade do tremor que foram analisadas são o valor RMS do sinal do tremor, a amplitude máxima pico-a- pico, a análise da flutuação retificada (DFA - detrented fluctuation analysis), a análise em frequência e a análise estatística. Em relação aos resultados, os pesquisadores verificaram que os valores da análise RMS e da amplitude pico-a-pico tiveram valores bem distintos do grupo normal em comparação ao grupo com tremor exacerbado.

Diante dessa descoberta, foi concluído que é interessante a utilização desses parâmetros para quantificação de tremores. Outra conclusão destacada pelos autores é o fato de os pacientes com tremor exacerbado possuírem um espectro de potência mais concentrado nas baixas frequências que o grupo normal.

(9)

Na pesquisa realizada por Legrand et al. (2017) houve a proposição de diferentes abordagens baseadas em uma análise matemática do sinal gerado pelo desenho de uma espiral com o intuito de eliminar a dependência do avaliador, ou seja, propôs-se um método numérico e o comparou com a avaliação visual para a verificação da reprodutibilidade. Para isso, uma série de desenhos de espiral feitos por pacientes com tremor essencial foram visualmente classificados por uma banca de especialistas. Em contrapartida, aplicou-se três métodos numéricos nos desenhos - linearização estática e dinâmica e decomposição em modo empírico. Então, verificou- se estatisticamente a reprodutibilidade das avaliações numéricas e visuais. A análise estatística dos métodos demonstrou que houve grande concordância entre as classificações numéricas. Ademais, os métodos numéricos são mais reprodutíveis do que as avaliações realizadas por especialistas, além deles estarem em concordância com a classificação média.

Ainda no ano de 2017, Sisti et al publicaram um método que utiliza um iPad da Apple para análise do desenho de uma espiral fornecendo informações sobre a dinâmica do movimento. O método desenvolvido foi baseado no estudo feito pelo Pullman (1998), que utilizou uma mesa digitalizadora. O estudo foi realizado com 31 pacientes com disfunção motora do membro superior (tremor essencial, doença de Parkinson, distonia e distúrbios relacionados). Coletou-se o desenho da espiral dos pacientes no iPad e na mesa digitalizadora e calculou-se todos os parâmetros importantes (grau de gravidade, velocidade, presença de tremor, amplitude do tremor, frequência, variabilidade da pressão e tensão). O método que utiliza o iPad mostrou-se uma opção precisa, móvel e fácil para as análises, sendo acessível em clínicas e até em casa. De acordo com Sisti et al. o método estudado é limitado pela tecnologia atual da tela do iPad, porém os resultados foram coerentes com o estudo de Pullman (1998). Os pontos negativos citados são: o fato do desenho no iPad ter sido realizado com o dedo, sendo que esta é uma tarefa motora diferente do desenho com uma caneta;

muitos participantes não estarem habituados à tecnologia touchscreen; e, por fim, a superfície de contato do dedo com a tela é maior do que com uma caneta, podendo gerar dados menos precisos e o atrito poder resultar em tremores.

4 MÉTODOS

(10)

4.1 AQUISIÇÃO DOS DADOS

O software foi programado em Matlab. Para sua utilização é indicado o uso de um tablet ou uma mesa digitalizadora, mas é possível utilizar o mouse do computador também. Na tela do tablet / computador / mesa digitalizadora será apresentada uma espiral que o paciente deverá acompanhar com o dedo ou uma caneta formando-se, então, um desenho. Serão adquiridas as coordenadas X e Y do desenho para posterior análise. Há a possibilidade também de dados prontos serem analisados pelo software.

A interface gráfica do software foi construída no GUI (graphical users interface) do próprio Matlab. Esta interface gráfica entre o usuário e a máquina é realizada por meio de itens como botões, janelas, menu e outros, tornando o programa mais intuitivo e amigável ao usuário. A interface do programa apresenta duas funcionalidades:

(1) abrir dados previamente coletados e analisá-los: utilizado quando já se tem os dados das coordenadas X e Y e deseja-se fazer apenas a análise dos dados. Neste caso, a pessoa clica no botão “Baixar arquivo .xls” e seleciona o arquivo em formato .xls (Excel). O arquivo deve seguir um modelo. Na primeira linha, a primeira coluna precisa ter o número de voltas que o desenho possui e na segunda, é necessário constar a espessura da espiral. Na segunda linha, a primeira coluna é para colocar o tempo que se levou para fazer o desenho em questão e na segunda é o valor RMS do desenho. Essas especificações são para plotar uma espiral modelo para a comparação. Já nas demais linhas, as coordenadas X devem estar na primeira coluna e as coordenadas Y na segunda. Então, os dados são plotados na tela para sua posterior análise.

(2) capturar um desenho e analisá-los: utilizado quando deseja-se coletar novos dados. Para isso, é preciso que o usuário clique no botão “Capturar desenho”. Então um cursor aparece na tela para auxiliar o usuário durante o início da tarefa. Quando a pessoa desenha começar a desenhar ela deve dar um clique na tela e quando ela terminar a pessoa pode apertar o botão direito ou dar dois cliques seguidos. Então, para que os dados sejam salvos em uma planilha de Excel, é necessário clicar no botão “Salvar”.

O código utilizado pode ser encontrado no anexo do projeto.

(11)

Após o código ser finalizado, foi criado um arquivo executável (.exe) para que o usuário não necessite de ter o Matlab em seu computador. Para isso, utilizou-se a ferramenta “deploytool” disponível no próprio Matlab.

4.2 ANÁLISE DOS DADOS

Para a análise dos dados, as coordenadas X e Y obtidas serão linearizadas para que fiquem em função do raio (r) e do ângulo (θ):

x = r.sen(𝛩) (2)

y = r.cos (𝛩) (3)

r = √𝑥2 + 𝑦2 (4)

A linearização dos dados gerará uma reta dada pela Equação 5:

r = m𝛩 (5)

O cálculo da linearização deve ser realizado tanto para a espiral desenhada, quanto para a espiral ideal. Serão determinadas as diferenças, ponto a ponto, entre a espiral desenhada e a ideal, resultando no tremor da pessoa na coordenada r (𝑡𝑟𝑒𝑚𝑜𝑟𝑟(𝑖)). É necessário o cálculo do tremor correspondente na coordenada x (𝑡𝑟𝑒𝑚𝑜𝑟𝑥(𝑖)) e y (𝑡𝑟𝑒𝑚𝑜𝑟𝑦(𝑖)):

𝑡𝑟𝑒𝑚𝑜𝑟

𝑥(𝑖)

= (1 −

𝑡𝑟𝑒𝑚𝑜𝑟𝑟(𝑖)

√𝑥(𝑖)2 + 𝑦(𝑖)2

) 𝑥(𝑖)

(6)

𝑡𝑟𝑒𝑚𝑜𝑟

𝑦(𝑖)

= (1 −

𝑡𝑟𝑒𝑚𝑜𝑟𝑟(𝑖)

√𝑥(𝑖)2 + 𝑦(𝑖)2

) 𝑦(𝑖)

(7)

Os parâmetros analisados serão: o Root-Mean-Square (RMS); amplitude máxima pico-a-pico (AM); Detrended Fluctuation Analysis (DFA); análise em frequência (AF) e a análise estatística.

● O Root-Mean-Square (RMS) (variabilidade) é calculado pela Equação 8.

Quanto menor o RMS, mais perto do ideal a espiral estará.

𝑅𝑀𝑆

𝑟

= √

𝑛𝑖=1 (𝑡𝑟𝑒𝑚𝑜𝑟𝑟(𝑖))2

𝑁 (8)

O N representa o número de amostras.

(12)

● A amplitude máxima pico-a-pico (AM) é dada pela Equação 9. Quanto maior o AM maior será o desvio do sinal em relação à espiral ideal.

𝐴𝑀𝑟 = 𝑚𝑎𝑥(𝑡𝑟𝑒𝑚𝑜𝑟𝑟) − 𝑚𝑖𝑛(𝑡𝑟𝑒𝑚𝑜𝑟𝑟) (9)

● O Detrended Fluctuation Analysis (DFA) é um parâmetro que fornecerá um expoente 𝛼. Dada uma série temporal x(t) ( 0𝑡 ≤ 𝑁𝑥𝑇, sendo T o período de amostragem, N o número de amostras e o sinal dividido em intervalos de 𝜏amostras), a média do sinal (𝑥𝑁) (Equação 10), a função y(n) (Equação 11) e a regressão linear z(n) (Equação 12) são calculados da seguinte maneira:

𝑥𝑁 = 1

𝑁𝑁𝑖=1𝑥(𝑖) (10)

𝑦(𝑛) = ∑𝑛𝑖=1(𝑥(𝑖) − 𝑥𝑁) (11)

𝑧(𝑛) = 𝑎𝑛 + 𝑏 (12)

As letras “a” e “b” são coeficientes da regressão linear.

A função flutuação F(𝜏) para cada intervalo é:

𝐹(𝜏) = √1

𝑇𝑘𝜏𝑛 = (𝑘−1)𝜏+1 | 𝑦(𝑛) − 𝑧(𝑛)|2 (13) Segundo Almeida et al (2010), espera-se que F(𝜏) ~𝜏𝛼. O exponente 𝛼 é estimado pelo coeficiente angular da reta no gráfico log(F(𝜏)) x log(𝜏) e é caracterizado como:

- 𝛼 < 0,5: sinal anti-persistente (altamente rugoso). A tendência de uma futura amostra está diretamente relacionada com a tendência anterior. Caso a amostra aumente em comparação com a sua anterior, uma amostra nova tenderá diminuir;

- 𝛼 = 0,5: ruído branco. Possui espectro uniforme (frequência tem intensidade uma intensidade I constante de energia);

- 𝛼 > 0,5: sinal persistente (sinal pouco rugoso e com memória). Se última amostra apresentar um aumento em comparação à anterior, uma amostra nova tenderá a aumentar;

- 𝛼 = 1,0: ruído rosa (1/f). Este ruído possui um espectro com intensidades inversamente proporcionais às suas frequências (I ~ 1/f);

- 𝛼 =1,5: ruído browniano (1/𝑓2). Seu espectro tem intensidade inversamente proporcionais ao quadrado das frequências (I~1/𝑓2).

● A análise de frequência será dividida em 3 intervalos:

- 𝐵𝑎𝑛𝑑𝑎1: 0 - 5 Hz;

- 𝐵𝑎𝑛𝑑𝑎2: 5 - 10 Hz;

(13)

- 𝐵𝑎𝑛𝑑𝑎3: 10 - 30 Hz;

Sendo que as bandas foram obtidas a partir da Transformada de Fourier (FT) do sinal de tremor. O sinal de tremor forneceu a porcentagem de cada banda de energia em relação à energia total do sinal (I):

𝐼 = ∑𝑓𝑓=0𝑠 |𝐹𝐹𝑇(𝑓)| (14)

%𝐵𝑎𝑛𝑑𝑎1 = 1

𝐼5𝑓=0|𝐹𝐹𝑇(𝑓)| (15)

%𝐵𝑎𝑛𝑑𝑎2 = 1

𝐼10𝑓=5|𝐹𝐹𝑇(𝑓)| (16)

%𝐵𝑎𝑛𝑑𝑎3 = 1

𝐼30𝑓=10|𝐹𝐹𝑇(𝑓)| (17)

5 RESULTADOS

A montagem do layout do programa, com os botões e gráfico, no GUI do Matlab pode ser visto na Figura 1.

Figura 1: Interface gráfica do programa desenvolvido no GUI do Matlab.

Fonte: autor.

Para que o usuário tenha acesso ao software, é necessário que ele tenha o arquivo

“Analise_Espiral.exe”.

(14)

Figura 2: Arquivo “Analise_Espiral.exe”.

Fonte: autor.

A tela que o usuário terá acesso é mostrada na Figura 3.

Figura 3: Tela apresentada para o usuário do software.

Fonte: autor.

Na Figura 3 é possível verificar a existência de duas opções a de baixar o arquivo ou capturar um desenho. Caso o usuário selecione a opção “Baixar arquivo” uma janela para seleção do arquivo desejado é aberta (Figura 4).

Figura 4: Na opção “Baixar arquivo” uma janela para seleção do arquivo desejado é aberta.

(15)

Fonte: autor.

Neste caso é importante que o arquivo em Excel esteja no formato apropriado, como mostra a Figura 5.

Figura 5: A primeira linha contém o número de voltas e a espessura da espiral, a segunda linha é o tempo e o valor de RMS, já as demais linhas são os valores nos eixos X e Y.

(16)

Fonte: autor.

Na caixa “Características da espiral” pode-se alterar o número de voltas e a espessura. Para ilustrar esta ferramenta tem-se a Figura 6.

Figura 6: Neste caso, a espira foi configurada para ter 5 voltas e uma espessura tamanho 4.

(17)

Fonte: autor.

Após configurar as características da espiral da maneira desejada, é possível iniciar o desenho da espiral por meio do software. Para isto, é necessário selecionar a opção

“Capturar desenho”. Então, uma cruz aparece na tela para auxiliar no início da atividade (Figura 7).

Figura 7: Seleção da opção “Capturar desenho”.

(18)

Fonte: autor.

Para começar o desenho é preciso posicionar a cruz no centro da espiral e dar um clique na imagem. Para a finalização do desenho pode-se dar um clique com o botão direito ou dar dois cliques na figura. Após a finalização os dados de processamento aparecem automaticamente na tela (Figura 8).

Figura 8: Exemplo de desenho de uma espiral com os dados do processamento calculados pelo software.

(19)

Fonte: autor.

Pode-se ver uma determinada coordenada na figura apenas passando o cursor em cima da espiral, sendo que os valores aparecerão logo acima do gráfico.

Por fim, caso deseje-se salvar os dados, o usuário precisa apenas clicar no botão

“Salvar”. Uma janela é aberta para que a pessoa possa escolher o nome e o local onde os dados em formato Excel (.xls) serão salvos.

5.1 TESTES

Ao se testar o programa, pode-se observar que houveram problemas na análise em frequência (Figura 8), visto que não é mostrado uma porcentagem, apenas “Inf” e

“NaN”. Um possível motivo para que o erro esteja ocorrendo é o fato de que, dependendo da coordenada inicial do desenho, os cálculos são divididos por zero, resultando em erros.

Outro teste realizado, foi a comparação de um tremor fisiológico (Figura 8) e a simulação de um tremor exacerbado (Figura 9).

Figura 9: Simulação para tremor exacerbado

(20)

Fonte: Autor.

Tabela 1: Comparação entre os parâmetros do tremor fisiológico e tremor exacerbado simulado.

Tremor fisiológico Tremor exacerbado simulado

RMS 0,14351 2,82660

Amplitude 0,82723 4,95770

DFA 0,11438 0,37249

Fonte: Autor.

Como observa-se na Tabela 1, os parâmetros relacionados ao tremor exacerbado simulado são superiores que o tremor fisiológico, tal como esperado. O valor RMS é maior no tremor exacerbado, visto que está mais distante do espiral padrão. A amplitude também é superior no tremor exacerbado, posto que o desvio é superior. O DFA resultou nas mesmas faixas de sinais, sendo ambos menores que 0,5 e, portanto, sinais altamente rugosos.

6 CONCLUSÃO

(21)

O software desenvolvido em linguagem Matlab foi pensado para ser usado com mesas digitalizadoras a fim de oferecer uma ferramenta capaz de auxiliar profissionais da saúde no diagnóstico de tremor de membro superior por meio do tempo da atividade, o valor RMS, a amplitude máxima do sinal, o valor da DFA e a análise da frequência do sinal. Além de auxiliar no diagnóstico, o software pode ser usado para acompanhar o desenvolvimento do quadro clínico do paciente ao longo do tempo.

No futuro, o software poderá ser aprimorado a fim de oferecer mais características e mais configurações para o usuário modificar a espiral de forma a obter o melhor dado para cada paciente. Outro ponto interessante a ser pensado é a possibilidade de se scanner o desenho feito em um papel para os casos nos quais os pacientes não se adequem à mesa digitalizadora.

Ademais, é de suma importância que o software seja validado, observando-se, por exemplo, a sua acurácia, através de experimentos com diferentes sujeitos para verificar se o programa está de acordo com a literatura. Por fim, é interessante que o software seja avaliado por especialistas na área para verificar-se inconsistências, dificuldades na utilização da ferramenta e sugestões para melhorias.

REFERÊNCIAS BIBLIOGRÁFICAS

ALMEIDA, M.F.S. et. al. Estudo do tremor cinético através da análise de desenhos manuais. VIII CEEL. Universidade Federal de Uberlândia, out 2010.

BORGES, V.; FERRAZ, H. B. Tremores. Revista Neurociências. V14 N1, p.043-047;

jan/mar 2006 .

ELBLE, R.J. et al. Quantification of essential tremor in writing and drawing. Mov Disord, vol.11, p. 70-78, 1996.

FINDLEY, L.J. Tremors. Differential diagnosis and pharmacology. In: Jankovic J, Tolosa E (eds). Parkinson’s disease and Movement Disorders. Baltimore, Urban e Schwarzenberg, p.243-261, 1988.

KOLLER, W.C. Diagnosis and treatment of tremors. Neurol Clin 1984; 2:499-514.

LEGRAND, A. P. et al. New insight in spiral drawing analysis methods - Application to action tremor quantification. Clinical Neurophysiology 128, p.1823-1834, 2017.

LEITE, M. A. A. Tremor essencial. Revista Hospital Universitário Pedro Ernesto. UERJ, ano 9, jan/jul, 2010.

(22)

PULLMAN, S. L. Spiral Analysis: A New Technique for Measuring Tremor With a Digitizing Tablet. Movement Disorders. Vol. 13, p. 85-89, 1998.

(23)

ANEXO

function varargout = espiral(varargin)

% ESPIRAL MATLAB code for espiral.fig

% ESPIRAL, by itself, creates a new ESPIRAL or raises the existing

% singleton*.

%

% H = ESPIRAL returns the handle to a new ESPIRAL or the handle to

% the existing singleton*.

%

% ESPIRAL('CALLBACK',hObject,eventData,handles,...) calls the local

% function named CALLBACK in ESPIRAL.M with the given input arguments.

%

% ESPIRAL('Property','Value',...) creates a new ESPIRAL or raises the

% existing singleton*. Starting from the left, property value pairs are

% applied to the GUI before espiral_OpeningFcn gets called. An

% unrecognized property name or invalid value makes property application

% stop. All inputs are passed to espiral_OpeningFcn via varargin.

%

% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one

% instance to run (singleton)".

%

% See also: GUIDE, GUIDATA, GUIHANDLES

% Edit the above text to modify the response to help espiral

% Last Modified by GUIDE v2.5 24-Jul-2019 10:51:35

% Begin initialization code - DO NOT EDIT gui_Singleton = 1;

gui_State = struct('gui_Name', mfilename, ...

'gui_Singleton', gui_Singleton, ...

'gui_OpeningFcn', @espiral_OpeningFcn, ...

'gui_OutputFcn', @espiral_OutputFcn, ...

'gui_LayoutFcn', [] , ...

'gui_Callback', []);

if nargin && ischar(varargin{1})

gui_State.gui_Callback = str2func(varargin{1});

end

(24)

if nargout

[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});

else

gui_mainfcn(gui_State, varargin{:});

end clear, clc

% End initialization code - DO NOT EDIT

% --- Executes just before espiral is made visible.

function espiral_OpeningFcn(hObject, eventdata, handles, varargin)

% This function has no output args, see OutputFcn.

% hObject handle to figure

% eventdata reserved - to be defined in a future version of MATLAB

% handles structure with handles and user data (see GUIDATA)

% varargin command line arguments to espiral (see VARARGIN)

% Choose default command line output for espiral handles.output = hObject;

% Update handles structure guidata(hObject, handles);

% UIWAIT makes espiral wait for user response (see UIRESUME)

% uiwait(handles.figure1);

posi = [0 0 ; % startpoint 8 0 ] ; % endpoint

nturns = 3 ; % number of turns (integer value)

% engine

dp = diff(posi,1,1) ; R = hypot(dp(1), dp(2)) ; phi0 = atan2(dp(2), dp(1)) ;

phi = linspace(0, nturns*2*pi, 10000) ; % 10000 = resolution r = linspace(0, R, numel(phi)) ;

x = posi(1,1) + r .* cos(phi + phi0) ; y = posi(1,2) + r .* sin(phi + phi0) ;

plot(x,y,'linewidth', 2) ;% nturns crossings, including end point axis('equal')

(25)

axis ([-8 9 -8 7])

% --- Outputs from this function are returned to the command line.

function varargout = espiral_OutputFcn(hObject, eventdata, handles)

% varargout cell array for returning output args (see VARARGOUT);

% hObject handle to figure

% eventdata reserved - to be defined in a future version of MATLAB

% handles structure with handles and user data (see GUIDATA)

% Get default command line output from handles structure varargout{1} = handles.output;

% --- Executes on button press in baixar_arquivo.

function baixar_arquivo_Callback(hObject, eventdata, handles)

% hObject handle to baixar_arquivo (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB

% handles structure with handles and user data (see GUIDATA) cla(handles.axes1)

handles.fileName = uigetfile('.*xls');

pos = xlsread (handles.fileName);

nturns = pos(1,1);

espe = pos(1,2);

set(handles.tempo,'String',num2str(pos(2,1)));

posi = [0 0 ; % startpoint 8 0 ] ; % endpoint

% engine

dp = diff(posi,1,1) ; R = hypot(dp(1), dp(2)) ; phi0 = atan2(dp(2), dp(1)) ;

phi = linspace(0, nturns*2*pi, 10000) ; % 10000 = resolution r = linspace(0, R, numel(phi)) ;

x = posi(1,1) + r .* cos(phi + phi0) ; y = posi(1,2) + r .* sin(phi + phi0) ;

plot(x,y,'linewidth',espe);% nturns crossings, including end point axis('equal')

(26)

axis ([-8 9 -8 7])

hold on, plot(pos(3:end,1),pos(3:end,2),'k') axis('equal')

[tremor_r_rms,tremor_r_amp,alpha_r,f_r,area_1,area_2,area_3] = espiral_analise(pos);

set(handles.RMS_r,'String',num2str(tremor_r_rms));

set(handles.Amplitude_r,'String',num2str(tremor_r_amp));

set(handles.valor_DFA,'String',num2str(alpha_r));

set(handles.b1,'String',num2str(area_1));

set(handles.b2,'String',num2str(area_2));

set(handles.b3,'String',num2str(area_3));

% --- Executes on button press in capturar_desenho.

function capturar_desenho_Callback(hObject, eventdata, handles)

% hObject handle to capturar_desenho (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB

% handles structure with handles and user data (see GUIDATA) set (gcf, 'WindowButtonMotionFcn', @mouseMove);

start_Callback(hObject, eventdata, handles)

% --- Executes on button press in start.

function start_Callback(hObject, eventdata, handles)

% hObject handle to start (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB

% handles structure with handles and user data (see GUIDATA)

% desenho = imfreehand;

% pos = desenho.getPosition();

% esp = str2double(get(handles.espessura,'String'));

% voltas = str2double(get(handles.voltas,'String'));

% pos_ref = handles.var;

% pos = [voltas esp(2); pos];

% % [filename,filepath] = uiputfile('*.xls');

% % xlswrite([filepath filename],pos)

[myobj,xs,ys,elapsed] = freehanddraw(gca,'color','k','linewidth',1);

esp = str2double(get(handles.espessura,'String'));

(27)

voltas = str2double(get(handles.voltas,'String'));

pos = [voltas esp(2); elapsed length(xs)/elapsed; xs ys];

% [filename,filepath] = uiputfile('*.xls');

% xlswrite([filepath filename],pos) handles.var = pos;

guidata(hObject,handles)

set(handles.tempo,'String',num2str(elapsed));

[tremor_r_rms,tremor_r_amp,alpha_r,f_r,area_1,area_2,area_3] = espiral_analise(pos);

set(handles.RMS_r,'String',num2str(tremor_r_rms));

set(handles.Amplitude_r,'String',num2str(tremor_r_amp));

set(handles.valor_DFA,'String',num2str(alpha_r));

set(handles.b1,'String',num2str(area_1));

set(handles.b2,'String',num2str(area_2));

set(handles.b3,'String',num2str(area_3));

% --- Executes on button press in salvar.

function salvar_Callback(hObject, eventdata, handles)

% hObject handle to salvar (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB

% handles structure with handles and user data (see GUIDATA) pos = handles.var;

[filename,filepath] = uiputfile('*.xls');

xlswrite([filepath filename],pos)

function voltas_Callback(hObject, eventdata, handles)

% hObject handle to voltas (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB

% handles structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of voltas as text

% str2double(get(hObject,'String')) returns contents of voltas as a double

volt = str2double(get(handles.voltas,'String'));

espe = str2double(get(handles.espessura,'String'));

espe = espe(2);

posi = [0 0 ; % startpoint

(28)

8 0 ] ; % endpoint

nturns = volt ; % number of turns (integer value)

% engine

dp = diff(posi,1,1) ; R = hypot(dp(1), dp(2)) ; phi0 = atan2(dp(2), dp(1)) ;

phi = linspace(0, nturns*2*pi, 10000) ; % 10000 = resolution r = linspace(0, R, numel(phi)) ;

x = posi(1,1) + r .* cos(phi + phi0) ; y = posi(1,2) + r .* sin(phi + phi0) ;

plot(x,y,'linewidth',espe) ;% nturns crossings, including end point axis('equal')

axis ([-8 9 -8 7])

guidata(hObject,handles)

% --- Executes during object creation, after setting all properties.

function voltas_CreateFcn(hObject, eventdata, handles)

% hObject handle to voltas (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB

% handles empty - handles not created until after all CreateFcns called

% Hint: edit controls usually have a white background on Windows.

% See ISPC and COMPUTER.

if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white');

end

function espessura_Callback(hObject, eventdata, handles)

% hObject handle to espessura (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB

% handles structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of espessura as text

% str2double(get(hObject,'String')) returns contents of espessura as a double

volt = str2double(get(handles.voltas,'String'));

espe = str2double(get(handles.espessura,'String'));

(29)

espe = espe(2);

posi = [0 0 ; % startpoint 8 0 ] ; % endpoint

nturns = volt ; % number of turns (integer value)

% engine

dp = diff(posi,1,1) ; R = hypot(dp(1), dp(2)) ; phi0 = atan2(dp(2), dp(1)) ;

phi = linspace(0, nturns*2*pi, 10000) ; % 10000 = resolution r = linspace(0, R, numel(phi)) ;

x = posi(1,1) + r .* cos(phi + phi0) ; y = posi(1,2) + r .* sin(phi + phi0) ;

plot(x,y,'linewidth',espe) ;% nturns crossings, including end point axis('equal')

axis ([-8 9 -8 7])

guidata(hObject,handles)

% --- Executes during object creation, after setting all properties.

function espessura_CreateFcn(hObject, eventdata, handles)

% hObject handle to espessura (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB

% handles empty - handles not created until after all CreateFcns called

% Hint: edit controls usually have a white background on Windows.

% See ISPC and COMPUTER.

if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white');

end

function [lineobj,xs,ys,elapsed] = freehanddraw(varargin)

% [LINEOBJ,XS,YS] = FREEHANDDRAW(ax_handle,line_options)

%

% Draw a smooth freehand line object on the current axis (default),

% or on the axis specified by handle in the first input argument.

% Left-click to begin drawing, right-click to terminate, or double-click

% to close contour and terminate.

%

%

% INPUT ARGUMENTS: First: axis handle (optional)

(30)

% Additional: valid line property/value pairs

%

% OUTPUT ARGUMENTS: 1) Handle to line object

% 2) x-data

% 3) y-data

% (Note that output args 2 and 3 can also be extracted from the first output

% argument.)

%

% Ex: [myobj,xs,ys] = freehanddraw(gca,'color','r','linewidth',3);

% freehanddraw('linestyle','--');

%

% Written by Brett Shoelson, PhD

% shoelson@helix.nih.gov

% 3/29/05

% Modified:

% 10/05/05: Now allows double-click closing of contour

axdef = 0;

if nargin ~= 0 & ishandle(varargin{1}) try

axes(varargin{1});

axdef = 1;

catch

error('If the initial input argument is a handle, it must be to a valid axis.');

end end

%Get current figure and axis parameters oldvals = get(gcf);

oldhold = ishold(gca);

hold on;

set(gcf,'Pointer','crosshair','doublebuffer','on');

%Get the initial point [xs,ys,zs] = ginput(1);

tic

(31)

%Create and store line object if axdef

lineobj = line(xs,ys,'tag','tmpregsel',varargin{2:end});

else

lineobj = line(xs,ys,'tag','tmpregsel',varargin{:});

end

setappdata(gcf,'lineobj',lineobj);

%Modify wbmf of current figure to update lineobject on mouse motion set(gcf,'windowbuttonmotionfcn',@wbmfcn);

set(gcf,'windowbuttondownfcn',@wbdfcn);

%Wait for right-click or double-click

while ~strcmp(get(gcf,'SelectionType'),'alt') & ~strcmp(get(gcf,'SelectionType'),'open') drawnow;

end

elapsed = toc;

% fprintf('Elapsed time: %.2f sec\n', elapsed);

%Extract xyz data from line object for return in output variables

%(Also retrievable from first output argument) if nargout > 1

xs = get(getappdata(gcf,'lineobj'),'xdata')';

end

if nargout > 2

ys = get(getappdata(gcf,'lineobj'),'ydata')';

end

%Clear temporary variables from base workspace evalin('caller','clear tmpx tmpy tmpz done gca lineobj');

%Reset figure parameters set(gcf,'Pointer',oldvals.Pointer,...

'windowbuttonmotionfcn',oldvals.WindowButtonMotionFcn,...

'windowbuttondownfcn',oldvals.WindowButtonDownFcn);

%Reset hold value of the axis if ~oldhold, hold off; end

function wbmfcn(varargin) lineobj = getappdata(gcf,'lineobj');

(32)

if strcmp(get(gcf,'selectiontype'),'normal');

tmpx = get(lineobj,'xdata');

tmpy = get(lineobj,'ydata');

a=get(gca,'currentpoint');

set(lineobj,'xdata',[tmpx,a(1,1)],'ydata',[tmpy,a(1,2)]);

drawnow;

else

setappdata(gcf,'lineobj',lineobj);

end

function wbdfcn(varargin)

lineobj = getappdata(gcf,'lineobj');

if strcmp(get(gcf,'selectiontype'),'open') tmpx = get(lineobj,'xdata');

tmpy = get(lineobj,'ydata');

a=get(gca,'currentpoint');

% set(lineobj,'xdata',[tmpx,tmpx(1)],'ydata',[tmpy,tmpy(1)]);

setappdata(gcf,'lineobj',lineobj);

drawnow;

end return

function mouseMove (object, eventdata)

%https://www.mathworks.com/matlabcentral/answers/97563-how-do-i-continuously-read-the-mouse- position-as-the-mouse-is-moving-without-a-click-event

C = get (gca, 'CurrentPoint');

title(gca, ['(X,Y) = (', num2str(C(1,1)), ', ',num2str(C(1,2)), ')']);

function [A,F] = DFA_fun(data,pts,order)

% ---

% DESCRIPTION:

% Function for the DFA analysis.

% INPUTS:

% data: a one-dimensional data vector.

% pts: sizes of the windows/bins at which to evaluate the fluctuation

% order: (optional) order of the polynomial for the local trend correction.

% if not specified, order == 1;

(33)

% OUTPUTS:

% A: a 2x1 vector. A(1) is the scaling coefficient "alpha",

% A(2) the intercept of the log-log regression, useful for plotting (see examples).

% F: A vector of size Nx1 containing the fluctuations corresponding to the

% windows specified in entries in pts.

% ---

% Checking the inputs if nargin == 2

order = 1;

end

sz = size(data);

if sz(1)< sz(2) data = data';

end exit = 0;

if min(pts) == order+1

disp(['WARNING: The smallest window size is ' num2str(min(pts)) '. DFA order is ' num2str(order) '.'])

disp('This severly affects the estimate of the scaling coefficient') disp('(If order == [] (so 1), the corresponding fluctuation is zero.)') elseif min(pts) < (order+1)

disp(['ERROR: The smallest window size is ' num2str(min(pts)) '. DFA order is ' num2str(order) ':'])

disp(['Aborting. The smallest window size should be of ' num2str(order+1) ' points at least.']) exit = 1;

end if exit == 1 return end

% DFA

npts = numel(pts);

F = zeros(npts,1);

N = length(data);

for h = 1:npts w = pts(h);

n = floor(N/w);

Nfloor = n*pts(h);

D = data(1:Nfloor);

(34)

y = cumsum(D-mean(D));

bin = 0:w:(Nfloor-1);

vec = 1:w;

coeff = arrayfun(@(j) polyfit(vec',y(bin(j) + vec),order),1:n,'uni',0);

y_hat = cell2mat(cellfun(@(y) polyval(y,vec),coeff,'uni',0));

F(h) = mean((y - y_hat').^2)^0.5;

end

A = polyfit(log(pts),log(F)',1);

function [tremor_r_rms,tremor_r_amp,alpha_r,f_r,area_1,area_2,area_3] = espiral_analise(pos)

clear pos_ref theta t theta_ref r_ref

clear posi dp R phi0 phi r2 pos_ref theta_ref r_ref

clear tremor_r alpha_r f_r area_total area_1 area_2 area_3

% pos = xlsread('teste.xls');

nturns = pos(1,1);

espe = pos(1,2);

freq = pos(2,2);

pos = pos(3:end,:);

[theta,r] = cart2pol(pos(:,1),pos(:,2));

theta = unwrap(theta);

r = r(theta>0); theta = theta(theta>0);

pos = [pos(end-length(r)+1:end,1) pos(end-length(r)+1:end,2)];

posi = [0 0 ; % startpoint 8 0 ] ; % endpoint dp = diff(posi,1,1) ; R = hypot(dp(1), dp(2)) ; phi0 = atan2(dp(2), dp(1)) ;

phi = linspace(0, nturns*2*pi, length(pos)) ; % 10000 = resolution r2 = linspace(0, R, numel(phi)) ;

pos_ref(:,1) = posi(1,1) + r2 .* cos(phi + phi0) ; pos_ref(:,2) = posi(1,2) + r2 .* sin(phi + phi0) ;

% figure, plot(pos_ref(:,1),pos_ref(:,2),'linewidth',espe), hold on, plot(pos(:,1),pos(:,2),'k'), axis('equal'), axis ([-8 9 -8 7])

(35)

[theta_ref,r_ref] = cart2pol(pos_ref(:,1),pos_ref(:,2));

theta_ref = unwrap(theta_ref);

% figure, plot(theta_ref,r_ref,'b'), hold on, plot(theta,r,'k') for i = 1:length(r)-1

ind = find(theta_ref >= theta(i),1,'first');

if theta(i) >= theta_ref ind = length(r)-1;

end

tremor_r(i) = r(i) - r_ref(ind);

end

% figure, plot(tremor_r,'k')

tremor_r_rms = rms(tremor_r);

tremor_r_amp = max(tremor_r) - min(tremor_r);

% Detrended Fluctuation Analysis (DFA)

[alpha_r,f_r] = DFA_fun(tremor_r,round(length(tremor_r)/10));

% Análise no Domínio da Frequência nfft = round(length(tremor_r)/2);

[p,f] = psd(tremor_r,nfft,freq,[],[],'mean');

% figure, plot(f,p) [m,peak] = max(p);

ind_f5 = find(f>=5);

ind_f10 = find(f>=10);

ind_f30 = find(f>=30);

area_total = trapz(f(1:ind_f30),p(1:ind_f30));

area_1 = trapz(f(1:ind_f5),p(1:ind_f5)) / area_total;

area_2 = trapz(f(ind_f5:ind_f10),p(ind_f5:ind_f10)) / area_total;

area_3 = trapz(f(ind_f10:ind_f30),p(ind_f10:ind_f30)) / area_total;

Imagem

Figura 1: Interface gráfica do programa desenvolvido no GUI do Matlab.
Figura 3: Tela apresentada para o usuário do software.
Figura 2: Arquivo “Analise_Espiral.exe”.
Figura 5: A primeira linha contém o número de voltas e a espessura da espiral, a segunda linha é o  tempo e o valor de RMS, já as demais linhas são os valores nos eixos X e Y
+6

Referências

Documentos relacionados

Os objetivos deste trabalho incluem a instrumentação do primeiro protótipo de prótese transfemural atuada apenas no joelho, o desenvolvimento de um software inicial, capaz de realizar