2014-07-08 7 views
2

나는 1 분 동안 심장 박동수를 읽고 그것으로부터 심박수 변동성을 계산해야하는 응용 분야에서 연구 중이다.HR (심박수)에서 HRV (심박수 변화)를 얻는 방법

  1. Research article on SDNN/RMSSD

  2. RMSSD for HRV Analysis : 마음을 읽는

    도움이 내가 다음 링크하지만 아무것도를 통해 내가 사라 HRV를 계산하기위한 스트랩 (폴라)

    Heart beat reading code I have used from link

    을 사용하고 이길

  3. Comparison between HR and HRV

내가 HR은 1 분 얻을 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

나는이 프로그래밍 관련 질문이라고 생각하지 않는다 –

+0

나는 공식을 가지고 있지만 HR을 읽는 것에 대해 혼란 스럽다. "didUpdateValueForCharacteristic"이 호출되었거나이 타임 스탬프를 얻는 것이 가장 큰 질문이다. –

+0

업데이트 할 수 있습니까? NSLog (@ "% @", datas)의 결과에 대한 질문 - 센서의 값의 원시 데이터를 볼 필요가 있습니다. 디코딩 코드가 올바르지 않은 것 같습니다. 소비 된 에너지가 존재하고 패킷 당 여러 개의 RR 값이있을 수 있는지 알아 보려면 비트 3을 검사해야합니다. 또한이 논문을 읽으면 SSDN은 RMSS가 아닌 HRV 인 것처럼 보입니다. 또한 RR 값은 데이터 패킷의 1/1024ths 초입니다. – Paulw11

답변

2

당신은 당신의 첫번째 링크 된 문서의 2.2.1에 설명 된 통계 계산을 수행해야합니다.

RR 간격을 사용할 필요가있는 심박수에서 HRV를 계산할 수 없습니다.

플래그 바이트의 비트 4가 설정되어 있는지 확인하려면 센서에서 반환 한 데이터를 확인해야합니다. 이는 RR 데이터가 있음을 나타냅니다. 그런 다음 RR 데이터를 어레이로 읽어 들여 16 비트 샘플 데이터를 NSNumber으로 변환 할 수 있습니다. 자습서에서 16 비트 하트 비트 값을 int로 변환하는 코드를 적용 할 수 있습니다.

일단 충분한 샘플을 수집하면 (그리고 1 분 샘플이 통계적으로 유효하지만 통계학자가 아님을 확신하지 못함) 분석을 수행 할 수 있습니다.

THB는

MRR 배열에서 RR 간격의 수를 것 또는 다음과 같이 I (BAR) 당신은 계산할 수 있습니다 - 다음과 같이합니다 (HRV입니다)

float rrTotal=0; 

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

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

SDNN이 계산됩니다 -

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를 계속해서 다시 계산할 수 있습니다.

+0

안녕하세요 @ Paulw11 도움을 주셔서 감사합니다. . 내 편집 내용을보고 나를 도우려고. –

+0

링크를 사용하여 RR의 여러 패킷을 추가했습니다. http://stackoverflow.com/questions/17422218/bluetooth-low-energy-how-to-parse-rr-interval 하나를 고칠 수있는 가치있는 희망 –

+0

Daniel의 코드를 해당 링크에서 변환해야합니다. 다른 대답보다 낫다. – Paulw11