如何从心率获取HRV(心率变异性)

6

我正在开发一个应用程序,需要读取一分钟内的心跳并计算其心率变异性。

为了读取心跳,我使用了带子(Polar)。

我使用了来自此链接的心跳读取代码

关于计算HRV,我查看了以下链接,但没有得到任何帮助:

  1. SDNN/RMSSD的研究文章

  2. 用于HRV分析的RMSSD

  3. HR和HRV的比较

请提供公式,以便我可以从HR中获得HRV(RMSSD),并且持续时间为一分钟。

任何帮助都将不胜感激..

编辑:

我已经使用以下代码获取了RR值:

- (void) updateWithHRMData:(NSData *)datas {

const uint8_t *reportData = [datas bytes];

uint16_t bpm = 0;
uint16_t bpm2 = 0;

if ((reportData[0] & 0x04) == 0)
{
    NSLog(@"%@", @"Data are not present");
}
else
{

    bpm = CFSwapInt16LittleToHost(*(uint16_t *)(&reportData[2]));

    bpm2 = CFSwapInt16LittleToHost(*(uint16_t *)(&reportData[4]));

    if (bpm != 0 || bpm2 != 0) {

            NSLog(@"%u", bpm);

            if (bpm2 != 0) {
                NSLog(@"%u", bpm2);
            }
    }

}

}

我的问题是,我得到的RR值是:666、636、645等。但是当我使用HRV +应用程序并通过电子邮件导出RR值时,它显示的值为0.785、0.734、0.724等。如果我使用以下公式对我的RR值进行计算:
RMSSD = enter image description here 它会给我完全错误的结果。
请帮忙解答。
编辑:
 //==================RR
if ((reportData[0] & 0x04) == 0)
{
    NSLog(@"%@", @"Data are not present");
}
else
{
    uint16_t rr2 = CFSwapInt16LittleToHost(*(uint16_t *)(&reportData[2]));
    RR = CFSwapInt16LittleToHost(*(uint16_t *)(&reportData[4]));

    //sometimes two values of RR may found so there are two RR: RR and rr2 which added in array and all calculation goes after one minute

    if (rr2 > 0 || RR > 0) {

        NSLog(@"RR2 %u", rr2);
        if (rr2>0) {
            [RRArray addObject:[NSNumber numberWithInt:rr2]];
        }
        if (RR != 0) {
            NSLog(@"RR %u", RR);
            [RRArray addObject:[NSNumber numberWithInt:RR]];

            }

        }

    }

}

3
我认为这个问题与编程无关。 - Bryan Chen
我对于读取 HR(心率)外围设备时使用公式,是通过“didUpdateValueForCharacteristic”委托方法获取时间戳还是其他方式更大的疑问。 - Chitra Khatri
你能否更新你的问题,附上 NSLog(@"%@",datas) 的输出结果 - 我需要看到传感器值的原始数据。我怀疑你的解码代码不正确。你需要检查第3位,以查看是否存在能量消耗,并且每个数据包可能有多个RR值。另外,从阅读论文来看,SSDN是HRV,而不是RMSSD。还要注意,数据包中的RR值以1/1024秒为单位。 - Paulw11
1
正如Paulw11所建议的那样,您应该检查数据是否包含EnergyExpended数据。还要注意,可能会有多于2个RR值。RR值的数量是不同的,需要进行计算。您可以在此处查看我的帖子和完整的代码示例:https://dev59.com/dXPYa4cB1Zd3GeqPpfzi - Brabbeldas
1个回答

2
您需要执行第一篇文章中2.2.1章节所描述的统计计算。
您不能从心率计算HRV,必须使用RR间期。
您需要检查传感器返回的数据,看看标志字节的第4位是否设置 - 这表明RR数据的存在。然后,您可以将RR数据读入数组中,将16位采样数据转换为NSNumber。您可以改编教程中将16位心跳值转换为int的代码。
收集足够的样本后(我不确定1分钟的样本是否具有统计学意义,但我不是统计学家),则可以执行分析。
THB是您数组中的RR间隔数。
MRR或I(BAR)可以按以下方式计算-
float rrTotal=0;

for (int i=1;i<[rrIntervals count]; i++) {
   rrTotal+=[[rrIntervals objectAtIndex:i] intValue];
}

float mrr = rrTotal/([rrIntervals count]-1);

SDNN(即您的HRV)的计算方法如下:

float sdnnTotal = 0;

for (int i=1;i<[rrIntervals count]; i++) {
   sdnTotal+=pow( [[rrIntervals objectAtIndex:i] intValue] - mrr,2) ;
}

float sdnn = sqrt(sdnTotal/([rrIntervals count]-1));

当你添加更多数据到数组中时,可以不断重新计算HRV。


我使用链接https://dev59.com/dXPYa4cB1Zd3GeqPpfzi添加了多个RR数据包,希望这样可以纠正一个问题。 - Chitra Khatri
你应该尝试将那个链接中的Daniel的代码转换过来。它比其他答案更好。 - Paulw11

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接