Índice:

Oxímetro de pulso com precisão muito melhorada: 6 etapas (com fotos)
Oxímetro de pulso com precisão muito melhorada: 6 etapas (com fotos)

Vídeo: Oxímetro de pulso com precisão muito melhorada: 6 etapas (com fotos)

Vídeo: Oxímetro de pulso com precisão muito melhorada: 6 etapas (com fotos)
Vídeo: O MENINO mais FRACO DESPERTOU e RECEBEU um SISTEMA que lhe dá uma NOVA HABILIDADE todos os DIAS! 2024, Julho
Anonim
Oxímetro de pulso com precisão muito melhorada
Oxímetro de pulso com precisão muito melhorada
Oxímetro de pulso com precisão muito melhorada
Oxímetro de pulso com precisão muito melhorada

Se você visitou um médico recentemente, é provável que seus sinais vitais básicos tenham sido examinados por uma enfermeira. Peso, altura, pressão arterial, bem como frequência cardíaca (FC) e saturação de oxigênio no sangue periférico (SpO2) Talvez os dois últimos tenham sido obtidos a partir de uma sonda digital de brilho vermelho que exibia números relevantes em uma tela minúscula em minutos. Essa sonda é chamada de oxímetro de pulso e você pode encontrar todas as informações básicas sobre ela aqui.

Pode-se facilmente comprar um oxímetro de pulso simples, com certeza, mas onde está a diversão nisso? Decidi construir o meu próprio, primeiro para o inferno, mas o mais importante com uma aplicação específica em mente: oximetria noturna onde HR e SpO2 os dados seriam coletados continuamente durante a noite e registrados em um cartão micro SD. Instructables já contém vários projetos desse tipo, por exemplo, dois envolvendo Arduino aqui e aqui, e um utilizando Raspberry Pi. O meu usa o sensor MAX30102 um pouco mais recente da MAXIM Integrated e o Feather M0 Adalogger da Adafruit para controle e registro de dados.

Nosso projeto, portanto, não é particularmente inovador em termos de hardware e, como tal, não valeria a pena escrever este Instructable, mas no processo de criação fiz avanços cruciais em software que me permitiram extrair dados do MAX30102 com muito maior consistência e muito menos ruído do que o software escrito pela MAXIM para este sensor. O desempenho de nosso algoritmo de processamento de sinal é ilustrado no gráfico acima, onde os dois gráficos superiores contêm a frequência cardíaca noturna e a saturação de oxigênio calculada a partir de sinais brutos por nosso método (identificados por "RF"), enquanto os dois gráficos inferiores mostram os resultados de MAXIM produzidos a partir de exatamente os mesmos sinais. Os desvios padrão para HR são 4,7 bpm e 18,1 bpm, e para SpO2 0,9% e 4,4%, para RF e MAXIM, respectivamente.

(Ambos os gráficos de RF correspondem ao limite mínimo de autocorrelação de 0,25 e nenhum limite na correlação R / IR; consulte as Etapas 4 e 5 para obter a explicação desses termos.)

Etapa 1: Hardware

Hardware
Hardware
Hardware
Hardware
Hardware
Hardware
Hardware
Hardware
  1. Oxímetro de pulso e sensor de frequência cardíaca MAX30102 placa de sistema da MAXIM Integrated, Inc.
  2. Feather M0 Adalogger da Adafruit, Inc.
  3. Bateria de íons de lítio da Adafruit, Inc.

Conexões:

  • Adalogger conecta SCL e SDA aos pinos SCL e SDA correspondentes na placa MAX30102
  • Pino Adalogger 10 para pino INT na placa MAX30102
  • Adalogger GND para MAX30102 placa GND
  • Adalogger 3V a MAX30102 VIN

Etapa 2: sinais digitais retornados por MAX30102

Sinais digitais devolvidos por MAX30102
Sinais digitais devolvidos por MAX30102
Sinais digitais retornados por MAX30102
Sinais digitais retornados por MAX30102

Os princípios de operação do sensor são muito simples: dois LEDs, um vermelho (660 nm) e um infravermelho (880 nm, IR) iluminam a pele humana. A luz é parcialmente absorvida pelos tecidos subjacentes, incluindo sangue periférico. O fotodetector do sensor coleta a luz refletida em ambos os comprimentos de onda e retorna duas intensidades relativas correspondentes usando o protocolo I2C. Como os espectros de absorção para hemoglobina oxigenada e desoxigenada diferem em ambos os comprimentos de onda, a luz refletida tem um componente variável como a quantidade de sangue arterial presente sob os pulsos cutâneos a cada batimento cardíaco. Descobrir a frequência cardíaca e a saturação de oxigênio depende do software de processamento de sinal.

Exemplos de sinais brutos (apenas canal IR) são ilustrados nas imagens acima. Pode-se notar um componente periódico sobreposto em uma linha de base variável que está mudando devido a vários fatores mencionados na página da Wikipedia. Artefatos induzidos por movimento são particularmente irritantes, pois podem mascarar o sinal de HR útil e causar resultados falsos. Portanto, oxímetros comerciais avançados apresentam acelerômetros que ajudam a anular esses artefatos.

Posso adicionar um acelerômetro à próxima versão do meu oxímetro, mas para HR / SpO noturno2 gravação, quando o sensor permanece imóvel a maior parte do tempo, é suficiente para detectar e omitir sinais distorcidos.

O próprio sensor MAX30102 vem em um pequeno pacote montado na superfície, mas MAXIM graciosamente oferece uma placa breakout (System Board 6300) mais software de processamento de sinal para Arduino e mbed - tudo no pacote de design de referência MAXREFDES117 #. Felizmente comprei esperando apenas soldar alguns fios entre o sensor e o Adalogger e ter um bom oxímetro funcionando em um único dia. Adaptei a versão RD117_ARDUINO do software MAXIM para rodar no processador ARM Cortex M0 da Adalogger. Basicamente, tudo o que tive que fazer foi substituir funções incompatíveis de SofI2C em max30102.cpp pelas chamadas de biblioteca correspondentes do Wire. O código compilado bem no Arduino IDE v1.8.5 e executado no M0 sem erros. Os resultados líquidos, entretanto, foram decepcionantes. Na etapa de introdução, já mostrei uma variação muito alta de RH e SpO2. Naturalmente, pode-se afirmar que fiz algo errado e esse também foi meu pensamento original. No entanto, no vídeo de instrução do MAXIM, você também pode observar os valores de FC oscilantes descontroladamente exibidos na tela. Além disso, os comentários abaixo do vídeo confirmam que outras pessoas também notaram um fenômeno semelhante.

Para encurtar a história, após alguma experimentação, determinei que o sensor está operando bem e um método alternativo de processamento de sinal digital resulta em uma estabilidade muito melhor. Este novo método, indicado por “RF”, é descrito nos próximos passos.

Etapa 3: pré-processamento de sinal

Pré-processamento de sinal
Pré-processamento de sinal
Pré-processamento de sinal
Pré-processamento de sinal
Pré-processamento de sinal
Pré-processamento de sinal
Pré-processamento de sinal
Pré-processamento de sinal

Em nossa implementação, o sinal bruto é coletado a uma taxa de 25 Hz (igual ao MAXIM) por 4 segundos completos (o software do MAXIM coleta apenas 1 segundo), resultando em 100 pontos de tempo digitalizados por ponto de dados final. Cada sequência de 100 pontos deve ser pré-processada da seguinte maneira:

  1. Centralização média (também conhecido como "remoção do componente DC" para engenheiros elétricos). Os dados brutos provenientes do sensor são uma série temporal de números inteiros no 105 faixa. O sinal útil, porém, é apenas uma parte da luz refletida do sangue arterial, que varia na ordem de apenas 102 - primeira figura. Para um processamento de sinal significativo, é portanto desejável subtrair a média de cada ponto da série. Esta parte não é diferente do que o software MAXIM já faz. O que é diferente, entretanto, é a centralização adicional da média dos próprios índices de tempo. Em outras palavras, em vez de indexar os pontos da série por números de 0 a 99, os novos índices agora são números -49,5, -48,5,…, 49,5. Pode parecer estranho à primeira vista, mas graças a este procedimento o "centro de gravidade" da curva de sinal coincide com a origem do sistema de coordenadas (segunda figura). Esse fato se torna bastante útil na próxima etapa.
  2. Nivelamento da linha de base. Outra análise das formas de onda mostradas na Etapa 2 ilustra que a linha de base dos sinais reais de oximetria está longe de ser horizontalmente plana, mas varia em diferentes inclinações. A terceira figura mostra um sinal IV centrado na média (curva azul) e sua linha de base (linha reta azul). Nesse caso, a inclinação da linha de base é negativa. O método de processamento de sinal descrito a seguir requer que a linha de base seja horizontal. Isso pode ser alcançado simplesmente subtraindo a linha de base do sinal centrado na média. Graças ao centramento médio das coordenadas Y e X, a interceptação da linha de base é zero e sua equação de inclinação é particularmente simples, conforme mostrado na quarta figura. O sinal nivelado da linha de base é mostrado pela curva laranja na terceira figura.

Assim, o sinal pré-processado está pronto para a próxima etapa.

Etapa 4: O burro de carga: função de autocorrelação

O burro de carga: função de autocorrelação
O burro de carga: função de autocorrelação
O burro de carga: função de autocorrelação
O burro de carga: função de autocorrelação
O burro de carga: função de autocorrelação
O burro de carga: função de autocorrelação

Voltando à indexação usual de 1, …, n, a primeira figura mostra a definição da função de autocorrelação rm - uma quantidade considerada muito útil na detecção da periodicidade e da qualidade do sinal. É simplesmente um produto escalar normalizado da série temporal do sinal com ele próprio deslocado pelo lag m. Em nosso aplicativo, no entanto, é conveniente dimensionar cada valor de autocorrelação em relação ao seu valor em lag = 0, ou seja, usar autocorrelação relativa definida por rm / r0.

O gráfico da autocorrelação relativa de um sinal infravermelho de boa qualidade típico é mostrado na segunda figura. Como esperado, seu valor em lag = 0 está em seu máximo global igual a 1. O próximo máximo (local) ocorre em lag = 23 e é igual a 0,79. A presença de mínimos e máximos locais no gráfico de autocorrelação é fácil de entender: conforme o sinal se desloca para a direita, seus picos interferem destrutivamente uns com os outros no início, mas em certo ponto a interferência se torna construtiva e atinge o máximo no atraso igual à média período do sinal.

A última frase é crucial: para determinar o período de tempo médio entre os picos, a partir do qual se pode calcular a frequência do sinal (ou seja, a frequência cardíaca), é suficiente encontrar o primeiro máximo local da função de autocorrelação! Por padrão, MAX30102 faz a amostragem da entrada analógica a uma taxa de 25 pontos por segundo, portanto, em determinado m, o período em segundos é igual a m / 25. Isso leva à frequência cardíaca expressa em batimentos por minuto (bpm) por:

HR = 60 * 25 / m = 1500 / m

Claro, não é necessário fazer cálculos caros de rm em todos os valores de atraso. Nosso algoritmo faz a primeira estimativa de frequência cardíaca = 60 bpm, que corresponde a m = 25. A função de autocorrelação é avaliada naquele ponto e comparada ao valor em seu vizinho esquerdo, m = 24. Se o valor dos vizinhos for maior, então o marcha continua para a esquerda até rm-1 <rm. Assim determinado m final é então retornado como a defasagem no máximo. A próxima iteração começa a partir desse valor em vez de 25 e todo o processo se repete. Se o primeiro vizinho à esquerda for inferior, a rotina acima marcha pontos de atraso para a direita de maneira semelhante. Na maioria das vezes, o atraso máximo requer apenas algumas avaliações da função de autocorrelação. Além disso, as defasagens máximas e mínimas aceitáveis (correspondendo à freqüência cardíaca mínima e máxima, respectivamente) são usadas como valores limites.

O procedimento acima funciona muito bem para sinais de boa qualidade, mas o mundo real está longe do ideal. Alguns sinais saem distorcidos, principalmente devido a artefatos de movimento. Esse sinal é mostrado na terceira figura. A baixa periodicidade é refletida na forma de sua função de autocorrelação, bem como no valor baixo, 0,28, do primeiro máximo local em m = 11. Compare-o com o valor máximo de 0,79 determinado para o sinal de boa qualidade. Junto com os valores limite de atraso, portanto, o valor de rm / r0 no máximo é um bom indicador da qualidade do sinal e um requisito para que ele exceda certo limite pode ser usado para filtrar artefatos de movimento. Os gráficos de "RF" apresentados nas introduções resultaram desse limite igual a 0,25.

Etapa 5: Determinar a saturação de oxigênio

Determinando a saturação de oxigênio
Determinando a saturação de oxigênio
Determinando a saturação de oxigênio
Determinando a saturação de oxigênio
Determinando a saturação de oxigênio
Determinando a saturação de oxigênio
Determinando a saturação de oxigênio
Determinando a saturação de oxigênio

A etapa anterior foi suficiente para determinar a freqüência cardíaca. O SpO2 requer mais trabalho. Primeiro, o sinal até agora negligenciado no canal vermelho (R) deve ser levado em consideração. A seguir, é calculada a razão entre os sinais vermelho e infravermelho, Z = R / IR, ambos refletidos no sangue arterial. A parte do "sangue arterial" é crucial, uma vez que a maior parte da luz é, na verdade, refletida nos tecidos e no sangue venoso. Como escolher a porção do sinal correspondente ao sangue arterial? Bem, este é o componente pulsátil que varia com cada batimento cardíaco. Nas palavras dos engenheiros elétricos, é a "parte AC", enquanto a luz refletida restante é a "parte DC". Uma vez que as intensidades absolutas da luz R e IR não são proporcionais, a razão Z é calculada a partir das intensidades relativas, como mostrado na primeira figura. Em termos de quantidades realmente calculadas, eu uso a raiz quadrada média (RMS) do sinal nivelado de linha de base centrado na média, y, para a média já conhecida do sinal bruto, <Y>; veja a segunda figura. A proporção Z é apenas metade do trabalho, no entanto. A resposta do sensor não linear requer uma calibração empírica entre Z e o SpO final2 valores. Peguei a equação de calibração do código MAXIM:

SpO2 = (-45,06 * Z + 30,354) * Z + 94,845

Lembre-se de que esta equação é válida apenas para a placa de design MAX30102 adquirida em 2017! É provável que MAXIM possa recalibrar seus sensores em uma data posterior.

O procedimento acima ainda produz muito SpO falso2 leituras. O canal vermelho sofre de muitos artefatos, assim como o IR. É razoável supor que ambos os sinais devem ser fortemente correlacionados. Na verdade, sinais de boa qualidade, como o exemplo na terceira figura, se correlacionam muito bem. O coeficiente de correlação de Pearson é, neste caso, tão alto quanto 0,99. Nem sempre é o caso, conforme ilustrado na quarta figura. Embora o sinal IR passasse pelo filtro de qualidade da frequência cardíaca com seu rm / r0 = 0,76, o sinal R distorcido resulta em um coeficiente de correlação pobre entre os dois igual a apenas 0,42. Esta observação oferece o segundo filtro de qualidade: ter o coeficiente de correlação entre os canais maior do que determinado limite.

As duas últimas figuras exemplificam o efeito líquido dessa filtragem de qualidade. Primeiro, a saturação de oxigênio medida é plotada com limiar de qualidade de FC de 0,25, mas sem o SpO2 filtro. O próximo gráfico resulta da filtragem de RH e SpO ruins2 resultados em 0,5 rm / r0 e 0,8 limiares de coeficiente de correlação. No geral, os pontos de dados ruins, que chegam a 12% do total, foram filtrados pelo regime mais rígido.

Em nosso código, o coeficiente de correlação, cc, é calculado de acordo com a fórmula na quinta figura, onde y representa o sinal centrado na média e nivelado na linha de base, enquanto r0 foi definido na etapa anterior.

Etapa 6: o código-fonte

O código-fonte C para este projeto, formatado para o Arduino IDE, está disponível em nossa conta Github no seguinte link:

github.com/aromring/MAX30102_by_RF

Sua página Leiame descreve componentes individuais.

Gostaria de elogiar a Adafruit por fazer um produto tão excelente como o Adalogger baseado em M0. Seu rápido processador ARM Cortex M0 de 48 MHz, com muita RAM, certamente ajudou a tornar este projeto viável, enquanto o leitor de cartão SD conectado diretamente (mais a biblioteca SD da Adafruit) remove todas as dores do aquarista associadas ao armazenamento em tempo real de grandes quantidades de dados.

Recomendado: