如何实现MIT-BIH Arrhythmia数据库ECG信号幅值与时间戳映射
MIT-BIH心律失常数据库ECG信号时间-幅值映射实现方案
核心逻辑:MIT-BIH的原始存储格式不会单独存每个采样点的时间戳,时间轴完全可以通过固定采样率计算生成,不需要额外解析复杂字段,新手按下面步骤走就能出结果。
前期准备
直接用Python实现即可,对新手最友好,不用啃复杂的二进制格式解析,先安装依赖库:pip install wfdb numpy
其中wfdb是生理信号领域通用的信号读取库,不用自己手写二进制解析逻辑,numpy用来做数组计算。
具体实现步骤
- 读取ECG原始记录
先把下载好的MIT-BIH数据库文件放到指定目录,注意每条有效记录必须包含.hea头文件和.dat信号文件两个部分,缺任何一个都无法正常读取。读取代码示例:import wfdb import numpy as np # 括号内填本地存储记录的路径,不要加文件后缀 record = wfdb.rdrecord("./mitdb/100") # 提取最常用的MLII导联幅值数据,新手直接取第0列即可 ecg_amplitude = record.p_signal[:, 0] # 直接从记录元数据取采样率,MIT-BIH标准采样率是360Hz,读属性比硬编码更稳妥 sampling_rate = record.fs - 生成对应时间轴(x值)
采样率sampling_rate代表每秒采集对应数量的信号点,相邻两个点的时间间隔就是1/sampling_rate秒,直接按这个间隔生成和信号等长的时间序列即可:# 时间从0秒开始,长度和信号点数量完全一致,单位为秒 ecg_time = np.arange(len(ecg_amplitude)) / sampling_rate - 组装为目标(x,y)结构数组
把两个一维数组合并成二维数组即可,第一列为时间值,第二列为对应位置的信号幅值:# 最终输出数组形状为(信号点总数, 2),完全匹配x为时间、y为幅值的要求 ecg_time_amp_array = np.column_stack((ecg_time, ecg_amplitude))
新手避坑提示
- 不要手动硬编码采样率,不同衍生版本的MIT-BIH子集可能采样率存在差异,永远从读取的record对象里拿
fs属性最准确 - 如果你拿到的是他人转好的csv、mat格式数据,先确认信号是连续无缺失的,只要采样连续,时间轴的计算逻辑完全一致
- 需要毫秒单位时间的话,把生成的
ecg_time数组整体乘1000即可 - 正确性验证方法很简单:打印数组前5行,第一列的时间值应该按0、1/360≈0.00278、2/360≈0.00556的规律均匀递增,第二列是-5~5mV区间内的ECG幅值,就说明映射关系正确。
内容的提问来源于stack exchange,提问作者user19536133
相关产品推荐
相关产品推荐

