这里补充一下使用注意事项:
观察发现,下面所讲的内置函数输入全要求list型,实际使用的时候不用管,因为函数都是封装好的,好像还有个检查type的函数。我输入ecg信号是一维的numpy array,输入采样率是int型一个数,就可以正常运行。
实际使用的时候输出的分数的顺序是这样的:
sqi_scores = [[q_sqi_score, c_sqi_score, s_sqi_score,
k_sqi_score, p_sqi_score, bas_sqi_score]]
整个包对于用户来说其实大概就两个函数有用,一个是从心电信号计算分数的compute_sqi_scores函数,一个是从分数判断质量好不好的predict_quality函数。另一个get_signal_quality就是把前两个函数拼起来而已。
整体逻辑为:输入信号和采样率、按前面那6个指标得到6个参数、输入现成的机器学习模型(四选一),得到一个质量好或不好的结果。
以下具体讲解六个sqi都是啥。
一、频率分布sqi
①偏斜 ssqi
偏度是对分布在其平均值周围的不对称性的度量。它可以是负的、空的或正的。为了描述偏斜度,我们计算皮尔逊矩系数,对应于第三个标准化矩。
https://en.wikipedia.org/wiki/Skewness#Pearson’s_moment_coefficient_of_skewness
ecg_qc.sqi_computing.sqi_frequency_distribution.ssqi(ecg_signal: list)→ float
用来计算偏度sqi(ssqi)。偏度表示分布的不对称程度。
输入:list型,ecg信号
输出:float型,完善的偏态系数(ssqi分数)
对称分布,偏态系数 = 0
不对称分布,向左倾斜,偏态系数 < 0
不对称分布,向右倾斜,偏态系数 > 0(原文一开始这里的一左一右都写的大于零,给我整不会了)
②峰度 ksqi
峰度是分布在其平均值附近的尾部的度量。为了描述峰度,我们计算皮尔逊矩系数,对应于第四标度矩。超额峰度定义为峰度-3(3是正态分布的峰度系数)。峰度可以是正的,也可以是负的。
高过剩峰度意味着存在远离分布平均值的异常值。
https://www.statext.com/android/kurtosis.html
ecg_qc.sqi_computing.sqi_frequency_distribution.ksqi(ecg_signal: list)→ float
用来计算超额峰度sqi(ksqi)。峰度表示分布的扩散程度。
输入:list型的ecg信号
输出:完善的超额峰度sqi分数,float型
-
Mesokurtic常峰分布(黑色):超额峰度=0
Leptokurtic尖峰分布(绿色):超额峰度>0
Platykurtic低峰分布(蓝色):超额峰度<0 -
(我也不知道这些分布都是啥,于是我把原文放在前面了)
二、功率谱sqi
①QRS波的功率谱分布
QRS波的能量在5Hz到15Hz的频率范围内计算(QRS波的能量集中在以10Hz为中心且宽度为10Hz的频带内),ECG信号的能量在5Hz到40Hz的频率范围内计算。
如果存在干扰,高频分量增加,pSQI降低。
我们来获取以下干净的ECG信号。计算出的psqi=0.07。
现在我们来做一个带有高频噪声的心电图。计算的psqi=0.3。
ecg_qc.sqi_computing.sqi_power_spectrum.psqi(ecg_signal: list, sampling_frequency: int)→ float
这个函数就是计算QRS波的功率谱分布。
输入:list型的ecg信号、对应采样率。
输出:float型的psqi分数
②基线中的相对功率
它对应于QRS波的能量与ECG信号的能量之比。根据0Hz至1Hz的频率计算基线能量,根据0Hz至40Hz的频率计算ECG信号能量。
如果没有基线漂移干扰,则bassqi值接近1。基线的异常变化会导致bassqi下降。
我们来获取以下干净的ECG信号。计算出的bassqi=0.99。
现在我们来做一个心电图,它有重要的基线偏移。计算出的bassqi=0.97。
ecg_qc.sqi_computing.sqi_power_spectrum.bassqi(ecg_signal: list, sampling_frequency: int)→ float
这个函数就是计算基线中的相对功率。输入:list型的ecg信号、对应的采样率。
输出:bas_sqi分数,float型
三、RR间期sqi
ECG信号是由P、Q、R和T波组成的周期性信号。(作者这么写的,呃哈哈哈)
The Basics of ECG - ACLS Medical Training
R波具有最大的振幅和最明显的特征,因此我们通常通过R波检测来表征心电信号。
ecg_qc.sqi_computing.sqi_rr_intervals.compute_qrs_frames_correlation
(
qrs_frames_1: list,
qrs_frames_2: list,
sampling_frequency: int,
matching_qrs_frames_tolerance=50
)→ float
#我这么写缩进肯定不对,就看个大概吧
①R-R区间的可变性
当伪影存在时,QRS检测器的表现不佳,要么缺失R峰值,要么错误地将噪声峰值识别为R峰值。上述两个问题将导致R-R区间分布的高度可变性;
ecg_qc.sqi_computing.sqi_rr_intervals.csqi(ecg_signal: list, sampling_frequency: int)→ float
输入:list型的ecg信号,对应采样率
输出:c_sqif分数,float型
②R峰检测的匹配度
ecg_qc.sqi_computing.sqi_rr_intervals.qsqi(ecg_signal: list, sampling_frequency: int)→ float
比较了两种R波检测算法各自检测到的R波数量。
-
①Hamilton【出戏音乐剧了,笑死】【what's your name, man——】【这个r峰检测法就是用biosppy工具包实现的】【插一句,这个工具包还有其他很牛的功能,详见别的大佬写的博客】轻量级生理信号处理工具BioSPPy中的ECG(1)_Aiwiscal的博客-CSDN博客_biosppy1 前言很久没有写博客了,之前也想过要放弃。不过想来当个业余爱好也好啊,也当是知识的巩固和积累。废话少说,下面介绍这次的主角——Biosppy工具包。2 简介接下来的这段主要是对官方英文文档的翻译和整理,关于官方英文文档具体可访问:https://biosppy.readthedocs.io/en/stable/index.html2.1 概况BioSPPy是基于Python的生理信号...
https://blog.csdn.net/qq_15746879/article/details/103899640
-
②SWT (平稳小波变换)
输入:ecg信号和采样率。
输出:q_sqi分数,float型
————————
本篇译自API documentation — ecg_qc 1.0.0 documentation,又加上了少量自己的理解,如有错误请指出,谢谢!