18 Apr 2017 | 算法
心电指心脏在每个心动周期中,由起搏点、心房、心室相继兴奋,伴随着生物电的 变化。在一个正常心动周期中,一个典型的 ECG 波形是由一个 P 波,一个 QRS 波群,一个 T 波,以及 在 50% ~ 75% 的 ECG 中可能见到的 U 波。心率 (HR) 是指单位时间内心脏搏动的次数。
心率计算的算法大概以R-R间期算法最为普遍。
假设心电图机的采样频率为1000,即每秒采样1000个数据。
假设我们要求的心律是x,那么心率计算的数学公式如下(R波指的是大小为4000的缓冲区里面,心跳波动的波峰数):
[ frac{5+4+(2-3-(6+\frac{4}{5}))}{3(6-2)(2-7)} ]
这个数学公式中,(最后一个R波位置-第一个R波位置) 得到的是最后一个R波和第一个R波之间隔了多少个数据,采样率1000的话,这个值其实就是隔了多少个毫秒。(R波个数 - 1)得到的是在这么多个毫秒内,经历多少个心跳周期。
由此可以算出,即我们所求的心率。
// CALCULATE HEART RATE
r_check_counter++;
sample_counter++;
if (adc_sample_filtered > R_WAVE_THRESHOLD) // THE R WAVE WAS DETECTED
{
current_r_pos = sample_counter; // SAVE CURRENT R WAVE POSITION
r_check_counter = 0;
}
if (r_check_counter == SAMPLE_WINDOW) // THE R WAVE WAS NOT DETECTED DURING
{ // THE FOLLOWING 128 CONSECUTIVE SAMPLES
r_counter++;
if (r_counter > 1) // THE FIRST R WAVE HAS BEEN DETECTED
{
time_interval += current_r_pos - previous_r_pos;
if (r_counter == 3)
{
r_counter = 0;
_heart_rate = (30720 / time_interval) * 2; //512*60=30720
OLED_Clear();
Show_BPM(_heart_rate);
time_interval = 0;
sample_counter = 0;
}
}
previous_r_pos = current_r_pos;
}
其中,time_interval为第一个R波到最后一个R波的间期,2 为R波个数-1,即r_counter-1,此处为检测到3个R波计算一次。时钟频率为32768Hz,采样频率为512Hz。经测算,检测3个R波计算一次时瞬时性良好。
但是R波检测算法却并不完美,有时候会漏检,比如缓冲区里有5个R波,却只检出4个,这个时侯算出来的心律就偏低,不准确了。后期可以考虑P-T算法。