
De nombreuses fois ont dû faire face à un examen cardiaque dans des institutions médicales à l'aide d'un cardiographe. Cette unité mesure l'activité bioélectrique du cœur, enregistrant le résultat sur une bande de papier. Les cardiographes modernes enregistrent le résultat de la mesure non pas sur papier, mais dans la mémoire numérique. Cependant, la bande de papier est souvent utilisée comme support final des informations enregistrées. Visuellement, c'est un papier long millimètre de petite largeur, qui est tordu en rouleau. Sur le papier, en plus de la grille millimétrique, un certain graphique est dessiné sur toute la longueur, ce qui reflète la loi de la valeur mesurée évoluant dans le temps. La valeur mesurée, si je comprends bien, est la différence de potentiel entre les fils. Le plus souvent, plusieurs graphiques sont présentés sur une bande à la fois, car les différences potentielles entre plusieurs pistes sont enregistrées. Cependant, sans entrer dans les détails de la médecine, nous considérerons à l'avenir l'un des premiers calendriers principaux. En plus des graphiques, il existe des informations textuelles supplémentaires sur la bande: échelle horizontale (mm / s), verticale (mm / mV), fréquence cardiaque mesurée (bpm) et plus encore.
Il y avait une idée pour convertir ce graphique en un format sonore, reproduire le résultat et écouter comment ça sonne.
Selon une analyse préliminaire, nous pouvons conclure que la composition en fréquence d'une telle onde n'est pas très saturée. En fait, ce sont des basses fréquences, y compris les infrasons, qui sont censés être inaudibles. Cependant, il sera possible de voir comment le cône du woofer répétera les vibrations similaires aux «vibrations» du cœur. En effet, du fait de la présence de circuits de différenciation capacitifs sur le chemin de propagation du signal de la carte son PC vers l'amplificateur de basse, les vibrations de la tête dynamique ne reproduiront pas exactement les vibrations présentées sur le cardiogramme. Et cela à condition que les filtres qui coupent les ultra-basses fréquences ne soient installés nulle part. De plus, des distorsions non linéaires seront présentes, accompagnées de multiples harmoniques haute fréquence. Néanmoins, sans tenir compte de l'analyse ci-dessus, nous posons le problème comme suit: convertir le graphique sur papier au format WAV afin que lorsque vous ouvrez ce fichier dans un éditeur de sons, la forme d'onde corresponde à la version papier et, de plus, correspond à l'échelle de temps.
Vous devez d'abord estimer la profondeur de quantification (la résolution de l'audio numérique verticalement). Je considère l'un des standards: 8 ou 16 bits. La deuxième option (16 bits) est 65536 échantillons verticaux, ce qui correspondra à 65536 pixels de l'image, qui est un scan ou une photo d'un cardiogramme. C'est beaucoup et cela n'a aucun sens. Si vous prenez 8 bits - cela représente 256 échantillons, ou 256 pixels de l'image. Maintenant, c'est une option plus appropriée. Dans ce cas, la plage dynamique de l'audio sera de 6 * 8 = 48 dB. Je ne sais pas quelle est la plage dynamique du cardiogramme, mais je ne pense plus. L'appareil lui-même est naturellement plus grand, mais une erreur est inévitable lors de l'affichage d'un cardiogramme sur papier, en particulier lorsqu'il s'agit de dessiner directement avec un stylo. Par ailleurs, à propos de ce dernier. Je ne prendrai pas en compte les anciens motifs dessinés avec un stylo "radial". Le ruban de papier millimétrique pour ces cardiogrammes est spécifique: des arcs verticaux au lieu de lignes droites sont dessinés. Quant à l'échelle horizontale - la fréquence d'échantillonnage - sera calculée en fonction de l'échelle du cardiogramme et de la taille de l'image. La vitesse de lecture dépendra de ce paramètre, et elle devrait correspondre à la «vitesse du cardiogramme» réelle.
Le papier cardiogramme doit être numérisé en noir et blanc avec des nuances de gris avec une résolution suffisante. Ensuite, vous devez redimensionner l'image afin que le cardiogramme souhaité s'insère dans une bande de 256 pixels de large. J'ai trouvé de nombreuses images avec des cardiogrammes sur Internet. Par exemple, considérons deux d'entre eux.

On pourrait dire que la première image est presque prête. Hauteur d'image - 431. Largeur - 1023. Une onde sur toute la largeur remplit complètement l'image entière. Mais vous devez laisser 256 de hauteur, recadrer l'image au-dessus et en dessous pour que l'onde soit située approximativement au centre.

La deuxième figure montre plusieurs cardiogrammes à la fois. Prenez le tout premier. Après le recadrage, nous avons obtenu une image mesurant 508 par 61.

Sans étirer l'image verticalement, nous ferons une image d'une hauteur de 256, remplissant la zone créée de vide blanc. L'onde doit également être située approximativement au centre. Lors de la découpe, j'ai sélectionné la largeur 508 de manière à laisser autant de cellules millimétriques entières que possible, qui sont également visibles sur l'image.
Les deux images doivent être converties en une vue dans laquelle seul un graphique noir sera visible sur fond blanc et rien d'autre. Cela se fait de manière élémentaire. Étant donné que le graphique est dessiné beaucoup plus gros que la grille millimétrique, dans l'éditeur graphique en utilisant les réglages "luminosité, contraste, saturation", vous pouvez obtenir le résultat souhaité. Si la conversion parfaite échoue, l'excédent de «déchets» au-dessus du graphique doit être effacé avec l'outil Gomme. Toutes les images doivent être enregistrées au format BMP monochrome. Ainsi, seules les couleurs blanches et noires resteront définitivement dans l'image.
Avant de commencer à décrire l'algorithme de conversion d'images en WAV, il convient de spécifier certaines des nuances qui simplifient la programmation. Les images résultantes doivent être pivotées de 90 degrés dans le sens antihoraire (la largeur et la hauteur de l'image changeront de place). Ceci est nécessaire pour orienter le début du cardiogramme avec le début du fichier BMP. Il est connu que les données de couleur de chaque pixel d'un fichier BMP sont écrites ligne par ligne dans le fichier, en partant du coin inférieur gauche. Ensuite, vous devez ouvrir les images dans l'éditeur "MS Paint" (j'ai Windows XP) et enregistrer en BMP 8 bits (256 couleurs). Bien sûr, il y aura une "redéfinition des informations", mais avec ce format, chaque pixel de l'image correspond à un octet, ce qui est très pratique lors de la programmation. L'octet «0» est un pixel noir et l'octet «255» est blanc. Le résultat devrait ressembler à ce qui suit (ici, deux images sont connectées et coupées en deux).

Quant au format de sortie, nous le sortirons non pas dans un fichier WAV standard, mais dans un fichier de données RAW (PCM). Il simplifie également la programmation, car lors de la sortie vers WAV, vous devez toujours prendre soin de l'en-tête de 44 octets. Dans l'éditeur audio commun Adobe Audition 1.5, le fichier PCM s'ouvre sans problème. De plus, vous pouvez même sortir des nombres décimaux de données PCM dans une colonne d'un fichier texte, après avoir préalablement formé un en-tête de texte spécifique. Curieusement, mais ces fichiers Adobe Audition s'ouvre également.
Nous décrivons l'algorithme de transformation. Et l'algorithme est très simple: vous devez analyser chaque ligne du fichier BMP de bas en haut. L'analyse consistera à compter les pixels blancs de gauche à droite dans une rangée jusqu'à ce que du noir soit rencontré. Les valeurs entières non négatives obtenues doivent être écrites dans le fichier PCM de sortie sous forme binaire. La taille du fichier de sortie correspondra exactement à la hauteur de l'image traitée. La profondeur de quantification de 8 bits du format de données audio PCM implique le codage des échantillons selon le même principe. La valeur «0» est la valeur négative maximale de l'échantillon audio, la valeur «255» est la valeur positive maximale et «128» est la valeur zéro (au milieu). Par exemple, un fichier PCM de données audio de silence contiendra les mêmes octets avec une valeur de "128". Il convient de mentionner qu'une ligne peut contenir plusieurs pixels noirs consécutifs, en fonction de l'épaisseur de la ligne du cardiogramme. Mais l'algorithme décrit «attrape» l'enveloppe supérieure, ce qui sera suffisant. De plus, les pics nets du cardiogramme dirigés vers le haut seront ainsi mieux compris.
Vous pouvez maintenant commencer à écrire le texte du programme. Le programme écrit en C est très simple et ne nécessite pas de commentaires détaillés.
#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; // ; }
Une fois le programme exécuté sur le fichier «1.bmp», le fichier «1.pcm» sera créé dans le même répertoire que le programme. Lorsque vous essayez d'ouvrir un fichier dans Adobe Audition, la fenêtre suivante devrait apparaître.

Vous devez sélectionner "Mono", "8 bits" et imprimer la fréquence d'échantillonnage dans le champ de saisie en fonction du calcul: f = h / (s / v), où h est la hauteur de l'image (c'est aussi le nombre d'échantillons dans l'audio), s - la longueur du cardiogramme en millimètres, v est l'échelle du cardiogramme en mm / s. Le dernier paramètre est inscrit sur le cardiogramme. Sur le premier cardiogramme, rien n'est écrit, mais l'échelle est généralement de 25 mm / sec. Le calcul des taux d'échantillonnage dans Excel pour nos exemples est illustré dans la figure ci-dessous.

Comme mentionné ci-dessus, nous entrons les valeurs nécessaires des fréquences d'échantillonnage pour chacun des exemples dans le champ correspondant. Vous pouvez même entrer des décimales, de toute façon, il y aura un arrondi automatique à l'entier le plus proche.

En cliquant sur «OK», nous convenons que nous travaillons avec des échantillons «non signés 8 bits» (il y aura une autre fenêtre), après quoi la forme d'onde de notre fichier se développera dans le champ principal de l'éditeur de sons. Notez que cette vue sera présentée «à l'envers», et pour une parfaite conformité avec la version papier, vous devez inverser la vague dans le menu correspondant. En conséquence, cela ressemblera à ceci.

Le deuxième cardiogramme semble "plus silencieux", car il n'était pas très gros à l'origine.

Malheureusement, toutes les cartes son ne vous permettent pas de lire l'audio à une fréquence d'échantillonnage arbitraire, plus précisément, la grande majorité ne sait pas comment. Pour lire correctement le fichier, vous devez exécuter la fonction "Convertir le type d'échantillon". Nous allons convertir à la valeur standard la plus proche de 8000 Hz, en même temps augmenter la résolution en amplitude à 16 bits. Cette dernière est nécessaire pour la précision au stade de l'interpolation lors du suréchantillonnage. Si vous laissez 8 bits, la région restante du spectre sera remplie de bruit de quantification. Soit dit en passant, cette procédure pourrait être effectuée par programme à l'étape de conversion BMP-PCM, même en utilisant l'interpolation. Mais l'un des objectifs était la simplicité du code du programme.
Après l'opération de suréchantillonnage, vous pouvez écouter et apprécier le résultat. Vous pouvez enregistrer le résultat dans un fichier wav ou mp3 standard. Cela ressemble exactement à ce que j'attendais à l'origine.
Ce lien vous permet de télécharger l'archive rar, qui contient deux fichiers WAV avec le résultat.