Como o batimento cardíaco soa: convertendo o cardiograma de papel para o formato WAV


Muitas vezes teve que lidar com um exame cardíaco em instituições médicas usando um cardiógrafo. Esta unidade mede a atividade bioelétrica do coração, registrando o resultado em uma fita de papel. Os cardiógrafos modernos registram o resultado da medição não no papel, mas na memória digital. No entanto, a fita de papel é frequentemente usada como o meio final das informações gravadas. Visualmente, é um papel milimétrico longo, de pequena largura, que é torcido em um rolo. No papel, além da grade milimétrica, um determinado gráfico é desenhado em todo o comprimento, o que reflete a lei da alteração do valor medido ao longo do tempo. O valor medido, como eu o entendo, é a diferença de potencial entre os leads. Na maioria das vezes, vários gráficos são apresentados em uma fita de uma vez, pois são registradas diferenças de potencial entre vários leads. No entanto, sem entrar em detalhes da medicina, no futuro consideraremos um dos primeiros horários principais. Além dos gráficos, há informações adicionais em texto na fita: escala horizontal (mm / s), vertical (mm / mV), frequência cardíaca medida (bpm) e muito mais.

Houve uma ideia de converter esse gráfico em um formato de som, reproduzir o resultado e ouvir como ele soa.

De acordo com a análise preliminar, podemos concluir que a composição de frequência de uma onda desse tipo não é muito saturada. De fato, essas são frequências baixas, incluindo o infra-som, que se acredita ser inaudível. No entanto, será possível ver como o cone do woofer repetirá vibrações semelhantes às "vibrações" do coração. De fato, devido à presença de circuitos de diferenciação capacitiva no caminho de propagação do sinal da placa de som do PC para o amplificador de graves, as vibrações da cabeça dinâmica não repetem exatamente as vibrações apresentadas no cardiograma. E isso é fornecido desde que os filtros que cortam frequências ultra baixas não sejam instalados em nenhum lugar. Além disso, distorções não lineares estarão presentes, acompanhadas por vários harmônicos de alta frequência. No entanto, sem levar em consideração a análise acima, colocamos o problema da seguinte forma: converta o gráfico em papel no formato WAV para que, quando você abrir esse arquivo em um editor de som, a forma de onda corresponda à versão em papel e, além disso, corresponda à escala de tempo.

Primeiro, você precisa estimar a profundidade da quantização (a resolução do áudio digital verticalmente). Estou considerando um dos padrões: 8 ou 16 bits. A segunda opção (16 bits) são 65536 amostras verticais, que corresponderão a 65536 pixels da imagem, que é uma digitalização ou foto de um cardiograma. Isso é muito, e não faz sentido. Se você tirar 8 bits - são 256 amostras ou 256 pixels da imagem. Agora esta é uma opção mais adequada. Nesse caso, a faixa dinâmica do áudio será 6 * 8 = 48 dB. Não sei qual o alcance dinâmico do cardiograma, mas acho que não mais. O dispositivo em si é naturalmente maior, mas é inevitável um erro ao exibir um cardiograma no papel, especialmente quando se trata de desenhar diretamente com uma caneta. By the way, sobre o último. Não levarei em conta padrões antigos desenhados com uma caneta "radial". A fita milimétrica de papel para tais cardiogramas é específica: arcos verticais em vez de linhas retas são desenhados. Quanto à escala horizontal - a taxa de amostragem - será calculada com base na escala do cardiograma e tamanho da imagem. A velocidade de reprodução dependerá desse parâmetro e deve corresponder à real "velocidade do cardiograma".

O papel do cardiograma deve ser digitalizado em preto e branco com tons de cinza em resolução suficiente. É necessário redimensionar a imagem para que o cardiograma desejado caiba em uma faixa de 256 pixels de largura. Encontrei muitas imagens com cardiogramas na Internet. Como exemplo, considere dois deles.



A primeira imagem, pode-se dizer, está quase pronta. Altura da imagem - 431. Largura - 1023. Uma onda através da largura preenche completamente a imagem. Mas você precisa deixar 256 de altura, cortando a imagem acima e abaixo, para que a onda esteja localizada aproximadamente no centro.



A segunda figura mostra vários cardiogramas de uma só vez. Pegue o primeiro. Após o corte, obtivemos uma imagem medindo 508 por 61.



Sem esticar a imagem verticalmente, faremos uma imagem com 256 pixels de altura, preenchendo a área criada com um vazio branco. A onda também deve estar localizada aproximadamente no centro. Ao cortar, selecionei a largura 508 para deixar o maior número possível de células milimétricas possíveis, que também são visíveis na imagem.

Ambas as imagens precisam ser convertidas em uma visualização na qual apenas um gráfico preto será visível em um fundo branco e nada mais. Isso é feito de maneira elementar. Devido ao fato de o gráfico ser desenhado muito mais gordo que a grade milimétrica, no editor de gráficos usando os ajustes “brilho, contraste, saturação”, você pode obter o resultado desejado. Se a conversão perfeita falhar, o excesso de "lixo" restante acima do gráfico deve ser apagado com a ferramenta borracha. Todas as imagens devem ser salvas no formato BMP monocromático. Assim, apenas as cores branca e preta permanecerão definitivamente na imagem.

Antes de começar a descrever o algoritmo para converter imagens em WAV, vale a pena especificar algumas das nuances que simplificam a programação. As fotos resultantes devem ser giradas 90 graus no sentido anti-horário (a largura e a altura da imagem mudam de lugar). Isso é necessário para orientar o início do cardiograma com o início do arquivo BMP. Sabe-se que os dados de cores de cada pixel em um arquivo BMP são gravados no arquivo linha por linha, começando no canto inferior esquerdo. Então você precisa abrir as imagens no editor “MS Paint” (eu tenho o Windows XP) e salvar em BMP de 8 bits (256 cores). Obviamente, haverá uma "redefinição de informação", mas com esse formato, cada pixel na imagem corresponde a um byte, o que é muito conveniente na programação. O byte "0" é um pixel preto e o byte "255" é branco. O resultado deve ser algo como o seguinte (aqui duas fotos são conectadas e cortadas pela metade).



Quanto ao formato de saída, nós o enviaremos não para um arquivo WAV padrão, mas para um arquivo de dados RAW (PCM). Isso também simplifica a programação, pois ao enviar para WAV, você ainda precisa cuidar do cabeçalho de 44 bytes. No editor de áudio comum Adobe Audition 1.5, o arquivo PCM é aberto sem problemas. Além disso, você pode até gerar números decimais de dados PCM para uma coluna em um arquivo de texto, tendo formado anteriormente um cabeçalho de texto específico. Estranhamente, mas esses arquivos também são abertos pelo Adobe Audition.

Nós descrevemos o algoritmo de transformação. E o algoritmo é muito simples: você precisa analisar cada linha do arquivo BMP de baixo para cima. A análise consistirá na contagem de pixels brancos da esquerda para a direita em uma linha até que o preto seja encontrado. Os valores inteiros não negativos obtidos devem ser gravados no arquivo PCM de saída em formato binário. O tamanho do arquivo de saída corresponderá exatamente à altura da imagem processada. A profundidade de quantização de 8 bits do formato de dados de áudio PCM implica a codificação de amostras de acordo com o mesmo princípio. O valor "0" é o valor máximo negativo da amostra de áudio, o valor "255" é o máximo positivo e "128" é o valor zero (no meio). Por exemplo, um arquivo PCM de dados de áudio silenciosos conterá os mesmos bytes com o valor "128". Vale ressaltar que uma linha pode conter vários pixels pretos consecutivos, dependendo da espessura da linha do cardiograma. Mas o algoritmo descrito "pega" o envelope superior, o que será suficiente. Além disso, os altos picos do cardiograma direcionados para cima serão mais bem compreendidos dessa maneira.

Agora você pode começar a escrever o texto do programa. O programa escrito em C é muito simples e não precisa de comentários detalhados.

#include <stdio.h> // ,  ; int main(){ //  ; FILE *in,*out; //   ; unsigned long int h,i; //    ; unsigned char px,s; //     ; in=fopen("1.bmp","rb"); //   ; out=fopen("1.pcm","wb"); //   ; fseek(in,22,SEEK_SET); //    ,     fread(&h,4,1,in); //   (4 ); for(i=0;i<h;i++){ // -   ; fseek(in,0x436+i*256,SEEK_SET); //   i-  s=0; //  ( ); do{ //  ; fread(&px,1,1,in); //  ; s+=1; //   ; }while(px); // ,     ; fwrite(&s,1,1,out); //     ; } fclose(in); //  ; fclose(out); //  ; return 0; //  ; } 


Após a execução do programa no arquivo “1.bmp”, o arquivo “1.pcm” será criado no mesmo diretório do programa. Quando você tenta abrir um arquivo no Adobe Audition, a seguinte janela deve aparecer.



Você precisa selecionar "Mono", "8 bits" e imprimir a frequência de amostragem no campo de entrada com base no cálculo: f = h / (s / v), em que h é a altura da imagem (também é o número de amostras no áudio), s - o comprimento do cardiograma em milímetros, v é a escala do cardiograma em mm / s. O último parâmetro está escrito no cardiograma. No primeiro cardiograma, nada é escrito, mas a escala, em regra, costuma ser de 25 mm / s. O cálculo das taxas de amostra no Excel para nossos exemplos é mostrado na figura abaixo.



Como mencionado acima, inserimos os valores necessários de frequências de amostragem para cada um dos exemplos no campo correspondente. Você pode até digitar decimais, de qualquer maneira, haverá um arredondamento automático para o todo mais próximo.



Ao clicar em "OK", concordamos que estamos trabalhando com amostras de "8 bits não assinados" (haverá outra janela), após a qual a forma de onda do nosso arquivo será expandida no campo principal do editor de som. Observe que essa exibição será apresentada “de cabeça para baixo” e, para total conformidade com a versão em papel, você deve inverter a onda no menu correspondente. Como resultado, ficará assim.



O segundo cardiograma parece "mais silencioso", uma vez que originalmente não era muito grande em tamanho.



Infelizmente, nem todas as placas de som permitem reproduzir áudio em uma frequência de amostragem arbitrária; mais precisamente, a grande maioria não sabe como. Para reproduzir corretamente o arquivo, você deve executar a função "Converter tipo de amostra". Converteremos para o valor padrão mais próximo de 8000 Hz e, ao mesmo tempo, aumentaremos a resolução em amplitude para 16 bits. Este último é necessário para a precisão no estágio de interpolação durante a amostragem. Se você deixar 8 bits, a região restante do espectro será preenchida com ruído de quantização. A propósito, esse procedimento pode ser realizado de forma programática no estágio de conversão BMP-PCM, mesmo usando interpolação. Mas um dos objetivos era a simplicidade do código do programa.

Após a operação de upsampling, você pode ouvir e apreciar o resultado. Você pode salvar o resultado em um arquivo wav ou mp3 padrão. Parece exatamente o mesmo que eu esperava inicialmente.

Este link permite baixar o arquivo rar, que contém dois arquivos WAV com o resultado.

Source: https://habr.com/ru/post/pt419527/


All Articles