美文网首页
MIT-BIH数据库的212数据格式完全解析

MIT-BIH数据库的212数据格式完全解析

作者: 巴之丛林 | 来源:发表于2021-06-26 14:03 被阅读0次

        在生理信号处理领域,有一个大家都比较熟悉的开源数据库,它就是PhysioNet Databases,里面包含了大家熟知的MIT-BIH心电数据库、脑电和多导睡眠数据等。而在MIT-BIH的数据包中一般包含了原始数据文件和相应的打标信息文件,打标信息包含了跟信号相关的内容,比如ECG波形的R波位置,PSG(多导睡眠记录仪)波形中的睡眠分期标记等。这里我们要说的是数据包里面的原始数据文件,这个文件的数据大部分情况下都是以“212”格式存储。

字节分布

        MIT-BIH的“212”格式的意思是每3个字节包含了2个数字,且每个数字占12位(bits),字节的位数分布具体如上图所示,这里要注意的是每个采样点的数字的12位是二进制的补码形式保存的。3个字节存储2个采样点的数据,这样的设计也充分利用了3个字节的空间而避免了浪费。为了讲解如何解析“212”数据格式方便,这里先贴上一个大家都参考的Matlab解析文件rddata.m的相关代码:

        signald = fullfile(PATH, DATAFILE);            % data in format 212

        fid2 = fopen(signald, 'r');

        A  = fread(fid2, [3, SAMPLES2READ], 'uint8')'; 

        fclose(fid2);

        M2H = bitshift(A(:,2), -4);

        M1H = bitand(A(:,2), 15);

        PRL = bitshift(bitand(A(:,2), 8), 9);    % sign-bit

        PRR = bitshift(bitand(A(:,2), 128), 5);  % sign-bit

        M( : , 1) = bitshift(M1H,8) + A(:,1) - PRL;

        M( : , 2) = bitshift(M2H,8) + A(:,3) - PRR;

        上面代码中,我们要解析的两个通道的数据分别保存在变量M的两行数据内。代码的其余部分都很好理解,关键的是关于符号位的处理方式,即变量PRLPRR。因为这里涉及到二进制的反码和补码,既然它们是二进制的补码形式保存的,那么就要把补码还原为原码的形式即可。

        我们知道正数的补码等同于原码,而负数的补码是其对应原码中的非符号位取反后再加上1得到。当然这里的取反既是得到反码,再把反码加1。举个例子,比如一个4位大小的区间,如果只用来保存正数可以保存的数字区间为:0000 ~ 1111(即[0, 15]大小范围),如果又要保存负数呢,那么首先我们需要把最高位设置为符号位,而且为了简便起见,把正数的所有原码(包括最高的符号位0,实际可用的数据区为3位)直接取反即可得到相应的负数的反码了比如:(原码~反码)0000~1111, 0001~1110,...... ,0111~1000。这样就利用了反码来支持了负数的表示,反码的表示范围为[-7, 7],但是这样就用了0000和1111同时表示0而导致浪费了,所以考虑1111+1来得到溢出刚好得到0000来达到0的唯一表示,而加1后的表示码就称为补码,这样同时也扩大了负数的表示范围从[-1, -7]扩展到了[-1, -8],从而补码的表示范围是[-8, 7]。

补码解析

        了解完了补码的设计原理后,现在来解析补码表示的“212”数据格式,因为在MATLAB读取数据的时候是把所有的数据按照正数来处理,而为了把补码表示的负数看作正数来运算,从上表可以发现补码正数转换为实际的补码负数是用该补码正数减去它的高1位的二进制值,即二进制10000(即十进制为16),如补码正数15对应的补码负数为:15 - 16 = -1,跟它对应的补码负数相符合,如上述代码的粗体部分的操作,当实际存储的数据位负数时,PRLPRR表示了符号位1多进一位的目的(得到类似前面的减数16),并且后续也减去了它们从而得到了实际的存储数据。而当实际数据为正数时,因为对应的符号位为0,后续减去的也就是0,从而没有影响。

相关文章

网友评论

      本文标题:MIT-BIH数据库的212数据格式完全解析

      本文链接:https://www.haomeiwen.com/subject/rftzyltx.html