MIT-BIH 心电数据库读取与解析系统
项目简介
本项目是一个基于 MATLAB 环境开发的生物医学工程工具,专用于读取、解析和可视化国际通用的 MIT-BIH 心电数据库(MIT-BIH Arrhythmia Database)。该系统旨在解决非标准二进制心电数据的底层解码难题,能够独立完成从头文件配置读取、二进制信号解压到注释文件解析的全流程,并将原始 AD 转换数值转换为具有临床意义的物理电压信号(mV)。
核心功能特性
- 自动化数据完整性检查:系统启动时自动检测目标记录文件是否存在,若未检测到本地数据,具备自动生成符合 MIT-BIH 格式(Format 212)模拟数据的能力,确保程序即刻可运行。
- PhysioNet 头文件解析:能够读取
.hea 文本文件,解析采样率(Fs)、信号通道数、样本总数、数据格式、增益(Gain)、基线(Baseline)以及 ADC 零点信息。 - Format 212 二进制压缩解码:内置专用的解压算法,能够处理 MIT-BIH 数据库特有的 Format 212 存储格式(即每 3 个字节存储 2 个 12 位样本),并正确处理符号位。
- 物理量转换:依据头文件中的增益和 ADC 零点参数,自动将原始整数信号转换为毫伏(mV)单位。
- 注释文件解析:能够读取
.atr 二进制文件,提取心拍位置(时间点)和心拍类型(如正常心拍 N、左束支阻滞 L、室性早搏 V 等)。 - 数据可视化:提供多通道波形绘制功能,支持并列显示心电信号波形。
系统要求
- MATLAB R2016b 或更高版本
- 无需额外的工具箱(Toolbox),纯底层代码实现
使用方法
- 确保项目文件在 MATLAB 的当前工作路径中。
- 直接运行主程序脚本。
- 程序将按以下流程执行:
* 环境清理。
* 检测并加载(或生成)
mitdb_demo_100 数据集。
* 在控制台输出解析到的头文件信息(采样率、通道数等)。
* 在控制台输出信号解码进度及矩阵大小。
* 在控制台输出读取到的注释点数量。
* 自动弹出窗口绘制前 10 秒的心电波形。
技术实现与算法详解
本项目完全基于 MATLAB 基础函数编写,未依赖外部库。以下是各模块的底层实现逻辑:
1. 头文件解析逻辑
程序通过文本流操作逐行读取
.hea 文件:
- 基础信息提取:第一行通过字符串分割获取信号数和采样率。针对特殊的采样率格式(如
360/360),程序包含专门的分割逻辑以提取有效的频率数值。 - 通道参数提取:逐行解析每个通道的配置。对于增益参数,程序能够处理
200(1024) 这种包含基线的格式,将其分离为增益值和基线值。同时,程序尝试解析 ADC 零点值,若未显式指定分辨率字段,则提供默认的安全处理逻辑。
2. Format 212 信号解码算法
这是本项目的核心模块,用于处理
.dat 文件中的二进制流。由于 Format 212 是一种非字节对齐的压缩格式,解析逻辑如下:
- 块读取:将二进制数据流按字节(uint8)读取,并以 3 个字节为一个处理单元(Block)。
- 位操作重组:
*
样本 1:由第 1 个字节(低 8 位)和第 2 个字节的低 4 位组成。
*
样本 2:由第 3 个字节(低 8 位)和第 2 个字节的高 4 位组成。
- 12-bit 有符号数处理:由于重建后的数值是 12 位无符号形式,程序通过检测数值范围(大于 2047 则判定为负数)并减去 4096($2^{12}$),实现了正确的补码还原。
- 物理量计算:应用公式
(原始值 - ADC零点) / 增益,完成从数字量化值到物理电压值的映射。
3. 注释文件(ATR)解析机制
解析器读取
.atr 文件中的 16 位整数(Word),并执行以下位掩码操作:
- 指令分解:通过右移 10 位提取高 6 位的
Code(注释类型),通过与操作提取低 10 位的 Data(通常为时间增量)。 - 时间累积:MIT-BIH 格式使用差分时间存储。程序维护一个全局时间计数器,逐个累加读取到的时间增量。
- 特殊代码处理:
*
SKIP (Code 59):检测到长跳跃指令时,自动读取后续两个 Word 组合成 32 为长整数作为时间偏移。
*
AUX (Code 60-63):检测到辅助字符串信息时,根据长度字段跳过相应的字节,避免解析错误。
- 类型映射:利用哈希表(Map)将数字编码(如 1, 5)映射为字符标识(如 'N', 'V'),用于后续展示。
4. 模拟数据生成机制
为了保证程序的独立运行能力,代码中包含了一个防御性逻辑:当检测到本地缺失
.hea 文件时,会调用内部生成器构建一套符合 Format 212 规范的模拟数据。这使得用户在下载真实数据库之前即可测试代码逻辑。