Cómo suena el latido del corazón: convertir el cardiograma de papel al formato WAV


Muchas veces tuvo que lidiar con un examen del corazón en instituciones médicas utilizando un cardiógrafo. Esta unidad mide la actividad bioeléctrica del corazón, registrando el resultado en una cinta de papel. Los cardiógrafos modernos registran el resultado de la medición no en papel, sino en memoria digital. Sin embargo, la cinta de papel se usa a menudo como el medio final de información grabada. Visualmente, es un papel largo milimétrico de pequeño ancho, que se enrolla en un rollo. En el papel, además de la cuadrícula milimétrica, se dibuja cierto gráfico de longitud completa, que refleja la ley del valor medido que cambia con el tiempo. El valor medido, según tengo entendido, es la diferencia potencial entre los cables. Muy a menudo, se presentan varios gráficos en una cinta a la vez, ya que se registran las posibles diferencias entre múltiples pistas. Sin embargo, sin entrar en los detalles de la medicina, en el futuro consideraremos uno de los primeros horarios principales. Además de los gráficos, hay información textual adicional en la cinta: escala horizontal (mm / s), vertical (mm / mV), frecuencia cardíaca medida (lpm) y más.

Hubo una idea de convertir este gráfico en un formato de sonido, reproducir el resultado y escuchar cómo suena.

Según el análisis preliminar, podemos concluir que la composición de frecuencia de dicha onda no está muy saturada. De hecho, estas son frecuencias bajas, incluido el infrasonido, que se considera inaudible. Sin embargo, será posible ver cómo el cono del woofer repetirá vibraciones similares a las "vibraciones" del corazón. De hecho, debido a la presencia de circuitos de diferenciación capacitiva en la ruta de propagación de la señal desde la tarjeta de sonido de la PC al amplificador de graves, las vibraciones del cabezal dinámico no repetirán exactamente las vibraciones presentadas en el cardiograma. Y esto se proporciona para que los filtros que cortan frecuencias ultrabajas no se instalen en ninguna parte. Además, habrá distorsiones no lineales, acompañadas de múltiples armónicos de alta frecuencia. Sin embargo, sin tener en cuenta el análisis anterior, planteamos el problema de la siguiente manera: convierta el gráfico en papel al formato WAV para que cuando abra este archivo en un editor de sonido, la forma de onda coincida con la versión en papel y, además, corresponda a la escala de tiempo.

Primero necesita estimar la profundidad de cuantización (la resolución del audio digital verticalmente). Estoy considerando uno de los estándares: 8 o 16 bits. La segunda opción (16 bits) es 65536 muestras verticales, que corresponderán a 65536 píxeles de la imagen, que es un escaneo o una foto de un cardiograma. Esto es mucho y no tiene sentido. Si toma 8 bits, esto es 256 muestras, o 256 píxeles de la imagen. Ahora esta es una opción más adecuada. En este caso, el rango dinámico del audio será 6 * 8 = 48 dB. No sé qué rango dinámico tiene el cardiograma, pero no creo más. El dispositivo en sí es naturalmente más grande, pero un error es inevitable cuando se muestra un cardiograma en papel, especialmente cuando se trata de dibujar directamente con un bolígrafo. Por cierto, sobre esto último. No tendré en cuenta los patrones antiguos que se dibujan con un lápiz "radial". La cinta de papel milimétrica para tales cardiogramas es específica: se dibujan arcos verticales en lugar de líneas rectas. En cuanto a la escala horizontal, la frecuencia de muestreo, se calculará en función de la escala del cardiograma y el tamaño de la imagen. La velocidad de reproducción dependerá de este parámetro, y debe corresponder a la "velocidad del cardiograma" real.

El papel cardiograma debe escanearse en blanco y negro con sombras de gris en resolución suficiente. Luego, debe cambiar el tamaño de la imagen para que el cardiograma deseado encaje en una tira de 256 píxeles de ancho. Encontré muchas imágenes con cardiogramas en Internet. Como ejemplo, considere dos de ellos.



La primera imagen, se podría decir, está casi lista. Altura de la imagen: 431. Ancho: 1023. Una ola en todo el ancho llena por completo toda la imagen. Pero debe dejar 256 de altura, recortando la imagen arriba y abajo para que la ola se encuentre aproximadamente en el centro.



La segunda figura muestra varios cardiogramas a la vez. Toma el primero. Después de recortar, obtuvimos una imagen que mide 508 por 61.



Sin estirar la imagen verticalmente, haremos una imagen con una altura de 256, llenando el área creada con un vacío blanco. La ola también debe ubicarse aproximadamente en el centro. Al cortar, seleccioné el ancho 508 para dejar tantas celdas enteras de milímetros como sea posible, que también son visibles en la imagen.

Ambas imágenes deben convertirse a una vista en la que solo se verá un gráfico negro sobre un fondo blanco y nada más. Esto se hace de manera elemental. Debido al hecho de que el gráfico se dibuja mucho más grueso que la cuadrícula milimétrica, en el editor de gráficos utilizando los ajustes "brillo, contraste, saturación", puede lograr el resultado deseado. Si la conversión perfecta falla, el exceso de "basura" restante sobre el gráfico debe borrarse con la herramienta de borrador. Todas las imágenes deben guardarse en formato monocromático BMP. Por lo tanto, solo los colores blanco y negro definitivamente permanecerán en la imagen.

Antes de comenzar a describir el algoritmo para convertir imágenes a WAV, vale la pena especificar algunos de los matices que simplifican la programación. Las imágenes resultantes deben girarse 90 grados en sentido antihorario (el ancho y la altura de la imagen cambiarán de lugar). Esto es necesario para orientar el comienzo del cardiograma con el comienzo del archivo BMP. Se sabe que los datos de color de cada píxel en un archivo BMP se escriben en el archivo línea por línea, comenzando desde la esquina inferior izquierda. Luego debe abrir las imágenes en el editor "MS Paint" (tengo Windows XP) y guardarlas en BMP de 8 bits (256 colores). Por supuesto, habrá una "redefinición de la información", pero con este formato, cada píxel en la imagen corresponde a un byte, lo cual es muy conveniente cuando se programa. El byte "0" es un píxel negro y el byte "255" es blanco. El resultado debería ser similar al siguiente (aquí hay dos imágenes conectadas y divididas a la mitad).



En cuanto al formato de salida, lo enviaremos no a un archivo WAV estándar, sino a un archivo de datos RAW (PCM). También simplifica la programación, porque cuando se envía a WAV, aún debe ocuparse del encabezado de 44 bytes. En el editor de audio común Adobe Audition 1.5, el archivo PCM se abre sin problemas. Además, incluso puede generar números decimales de datos PCM en una columna en un archivo de texto, habiendo formado previamente un encabezado de texto específico. Por extraño que parezca, pero tales archivos Adobe Audition también se abre.

Describimos el algoritmo de transformación. Y el algoritmo es muy simple: debe analizar cada línea del archivo BMP de abajo hacia arriba. El análisis consistirá en contar píxeles blancos de izquierda a derecha en una fila hasta que se encuentre negro. Los valores enteros no negativos obtenidos deben escribirse en el archivo PCM de salida en forma binaria. El tamaño del archivo de salida coincidirá exactamente con la altura de la imagen procesada. La profundidad de cuantificación de 8 bits del formato de datos de audio PCM implica la codificación de muestras de acuerdo con el mismo principio. El valor "0" es el valor negativo máximo de la muestra de audio, el valor "255" es el máximo positivo y "128" es el valor cero (en el medio). Por ejemplo, un archivo PCM de datos de audio de silencio contendrá los mismos bytes con un valor de "128". Vale la pena mencionar que una fila puede contener varios píxeles negros consecutivos, dependiendo del grosor de la línea del cardiograma. Pero el algoritmo descrito "atrapa" el sobre superior, que será suficiente. Además, los picos agudos del cardiograma dirigido hacia arriba se comprenderán mejor de esta manera.

Ahora puede comenzar a escribir el texto del programa. El programa escrito en C es muy simple y no necesita comentarios detallados.

#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; //  ; } 


Después de que el programa se ejecute en el archivo "1.bmp", el archivo "1.pcm" se creará en el mismo directorio con el programa. Cuando intenta abrir un archivo en Adobe Audition, debe aparecer la siguiente ventana.



Debe seleccionar "Mono", "8 bits" e imprimir la frecuencia de muestreo en el campo de entrada según el cálculo: f = h / (s / v), donde h es la altura de la imagen (también es el número de muestras en el audio), s - la longitud del cardiograma en milímetros, v es la escala del cardiograma en mm / s. El último parámetro está escrito en el cardiograma. En el primer cardiograma no se escribe nada, pero la escala, por regla general, suele ser de 25 mm / seg. El cálculo de las frecuencias de muestreo en Excel para nuestros ejemplos se muestra en la figura a continuación.



Como se mencionó anteriormente, ingresamos los valores necesarios de las frecuencias de muestreo para cada uno de los ejemplos en el campo correspondiente. Incluso puede ingresar decimales, de todos modos habrá un redondeo automático al entero más cercano.



Al hacer clic en "Aceptar", aceptamos que estamos trabajando con muestras de "8 bits sin signo" (habrá otra ventana), después de lo cual la forma de onda de nuestro archivo se expandirá en el campo principal del editor de sonido. Tenga en cuenta que esta vista se presentará "al revés", y para cumplir plenamente con la versión en papel, debe invertir la onda en el menú correspondiente. Como resultado, se verá así.



El segundo cardiograma parece "más silencioso", ya que originalmente no era muy grande en tamaño.



Desafortunadamente, no todas las tarjetas de sonido le permiten reproducir audio a una frecuencia de muestreo arbitraria, más precisamente, la gran mayoría no sabe cómo. Para reproducir correctamente el archivo, debe realizar la función "Convertir tipo de muestra". Convertiremos al valor estándar más cercano de 8000 Hz, al mismo tiempo aumentaremos la resolución en amplitud a 16 bits. Esto último es necesario para la precisión en la etapa de interpolación durante el muestreo ascendente. Si deja 8 bits, la región restante del espectro se llenará con ruido de cuantización. Por cierto, este procedimiento podría realizarse mediante programación en la etapa de conversión BMP-PCM, incluso utilizando la interpolación. Pero uno de los objetivos era la simplicidad del código del programa.

Después de la operación de muestreo superior, puede escuchar y disfrutar el resultado. Puede guardar el resultado en un archivo wav o mp3 estándar. Suena exactamente igual a lo que originalmente esperaba.

Este enlace le permite descargar el archivo rar, que contiene dos archivos WAV con el resultado.

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


All Articles