
很多时候不得不使用心电图仪在医疗机构进行心脏检查。 该单元测量心脏的生物电活动,并将结果记录在纸带上。 现代的心电图仪不在纸上而是在数字存储器中记录测量结果。 但是,纸带经常被用作记录信息的最终媒介。 从外观上看,它是一张宽度很小的长毫米纸,被扭曲成一卷。 在纸上,除毫米网格外,还绘制了全长的特定图形,该图形反映了测量值随时间变化的规律。 据我了解,测量值是导线之间的电位差。 通常,由于记录了多根引线之间的电位差,因此一次将多个图表同时显示在一根磁带上。 但是,在不讨论医学细节的情况下,将来我们将考虑最早的主要时间表之一。 除了图形外,磁带上还有其他文本信息:水平刻度(mm / s),垂直刻度(mm / mV),测得的心率(bpm)等。
有一个想法可以将此图表转换为声音格式,再现结果并聆听声音。
根据初步分析,我们可以得出结论,这种波的频率组成不是很饱和。 实际上,这些是低频,包括次声,据认为这是听不到的。 然而,将有可能看到低音扬声器锥体将如何重复类似于心脏“振动”的振动。 实际上,由于在从PC声卡到低音放大器的信号传播路径上存在电容性微分电路,因此动态磁头的振动不会完全重复心电图上显示的振动。 这就提供了切掉超低频的滤波器未安装在任何地方的情况。 此外,还会出现非线性失真,并伴有多个高频谐波。 但是,不考虑上述分析,我们提出以下问题:将纸上的图形转换为WAV格式,以便在声音编辑器中打开此文件时,波形与纸质版本匹配,而且对应于时间刻度。
首先,您需要估算量化的深度(垂直数字音频的分辨率)。 我正在考虑一种标准:8或16位。 第二个选项(16位)是65536个垂直样本,这将对应于图片的65536像素,这是心电图的扫描或照片。 这很多,没有任何意义。 如果您使用8位-这是256个样本或图片的256像素。 现在这是一个更合适的选择。 在这种情况下,音频的动态范围将为6 * 8 = 48 dB。 我不知道心电图的动态范围是多少,但我认为不再。 设备本身自然较大,但是在纸上显示心电图时,尤其是在用笔直接绘图时,不可避免会出现错误。 顺便说一下,关于后者。 我不会考虑用“径向”笔绘制的旧图案。 用于此类心电图的毫米纸带是特定的:绘制垂直弧线而不是直线。 至于水平比例-采样率-将根据心电图的比例和图像大小进行计算。 播放速度将取决于此参数,并且应与实际的“心电图速度”相对应。
心电图纸应以足够的分辨率用黑白扫描。 然后,您需要调整图像大小,以使所需的心电图适合256像素宽的条带。 我在互联网上发现了许多带有心电图的图像。 例如,考虑其中两个。

也许有人会说,第一张图片已经准备好了。 图像高度-431。宽度-1023。横跨宽度的波浪完全充满了整个图片。 但是,您需要保留256个高度,在图像的上方和下方修剪图像,以使波大约位于中心。

第二个图一次显示几个心电图。 拿第一个。 裁剪后,我们得到一张图片,尺寸为508 x 61。

在不垂直拉伸图像的情况下,我们将制作一张高度为256的图片,用空白填充创建的区域。 波浪也应位于大约中心位置。 切割时,我选择了宽度508,以便保留尽可能多的整数毫米像元,这些像元在图像中也可见。
这两个图像都需要转换为一个视图,在该视图中,白色背景上只有黑色图形可见,而没有别的。 这是基本的方法。 由于绘制的图形比毫米网格要胖得多,因此在图形编辑器中使用“亮度,对比度,饱和度”调整,即可获得所需的结果。 如果完美转换失败,则必须使用橡皮擦工具擦除图表上方多余的“垃圾”。 所有图像必须以单色BMP格式保存。 因此,图片中肯定只会保留白色和黑色。
在开始描述将图像转换为WAV的算法之前,有必要指定一些可以简化编程的细微差别。 生成的图片必须逆时针旋转90度(图片的宽度和高度会改变位置)。 为了使心电图的开头与BMP文件的开头对齐,这是必需的。 已知BMP文件中每个像素的颜色数据都是从左下角开始逐行写入文件的。 然后,您需要在“ MS Paint”编辑器(我有Windows XP)中打开图片并将其保存为8位BMP(256色)。 当然,将会有“信息的重新定义”,但是使用这种格式,图像中的每个像素对应一个字节,这在编程时非常方便。 字节“ 0”是黑色像素,字节“ 255”是白色。 结果应类似于以下内容(此处将两张图片连接并减半)。

至于输出格式,我们不会将其输出到标准WAV文件,而是将其输出到RAW数据文件(PCM)。 它还可以简化编程,因为在输出到WAV时,您仍然需要注意44字节的标头。 在通用音频编辑器Adobe Audition 1.5中,PCM文件打开没有问题。 此外,您甚至可以将十进制数的PCM数据输出到先前已形成特定文本标题的文本文件中的一列。 奇怪的是,但是Adobe Audition这样的文件也会打开。
我们描述了变换算法。 而且该算法非常简单:您需要从下至上分析BMP文件的每一行。 分析将包括从左到右连续计数白色像素,直到遇到黑色为止。 获得的整数非负值必须以二进制形式写入输出PCM文件。 输出文件的大小将完全匹配已处理图像的高度。 PCM音频数据格式的8位量化深度表示根据相同原理对样本进行编码。 值“ 0”是音频样本的最大负值,值“ 255”是最大正值,“ 128”是零值(中间)。 例如,静音音频数据的PCM文件将包含相同的字节,其值为“ 128”。 值得一提的是,取决于心电图线的粗细,一行可能包含几个连续的黑色像素。 但是所描述的算法“抓住”了上限,这就足够了。 而且,以这种方式可以更好地把握指向心电图的尖锐峰。
现在,您可以开始编写程序的文本了。 用C语言编写的程序非常简单,不需要详细的注释。
#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; // ; }
在“ 1.bmp”文件上执行程序后,将在与程序相同的目录中创建“ 1.pcm”文件。 当您尝试在Adobe Audition中打开文件时,将弹出以下窗口。

您需要选择“单声道”,“ 8位”,并根据以下计算在输入字段中打印采样频率:f = h /(s / v),其中h是图片的高度(也是音频中的采样数),s-心电图的长度(以毫米为单位),v是心电图的刻度,以mm / s为单位。 最后一个参数写在心电图上。 在第一个心电图上没有任何内容,但通常标尺通常为25毫米/秒。 下图显示了我们示例中Excel中采样率的计算。

如上所述,我们在相应的字段中为每个示例输入必要的采样频率值。 您甚至可以输入小数,无论如何,都会自动舍入到最接近的整数。

通过单击“确定”,我们同意我们正在使用“无符号8位”样本(会有另一个窗口),此后,文件的波形将在声音编辑器的主字段中扩展。 请注意,此视图将“上下颠倒”显示,并且为了完全符合纸张版本,您应该在相应的菜单中反转波形。 结果,它将看起来像这样。

第二个心电图看起来“更安静”,因为它原本不是很大。

不幸的是,并非所有的声卡都允许您以任意采样频率播放音频,更确切地说,绝大多数都不知道如何。 为了正确播放文件,您必须执行“转换样品类型”功能。 我们将转换为最接近的8000 Hz标准值,同时将幅度分辨率提高到16位。 后者对于在上采样期间内插阶段的精度是必需的。 如果保留8位,则频谱的其余区域将充满量化噪声。 顺便说一下,即使使用插值,也可以在BMP-PCM转换阶段以编程方式执行此过程。 但目标之一是程序代码的简单性。
完成升采样操作后,您可以聆听并欣赏结果。 您可以将结果保存在标准的wav或mp3文件中。 听起来和我最初预期的完全一样。
该链接允许您下载rar档案,其中包含两个WAV文件以及结果。