피크 검출 (Peak detection)
피크 감지 단계는 적응형 피크 감지 임계값을 사용하여 PPG 복합체의 진폭 변화와 형태 변화를 수용한 다음, 여러 단계의 이상값 감지 및 제거를 시도한다. 심박을 식별하기 위해 이동 평균은 각 데이터 포인트의 양쪽에서 0.75초의 창을 사용하여 계산된다. 신호의 처음 0.75초와 마지막 0.75초는 신호의 평균으로 채워지며 이 섹션에 대해서는 이동 평균이 생성되지 않는다. 관심 영역 (ROI)은 신호 진폭이 피크를 감지하는 표준 방법인 이동 평균보다 큰 두 교차 지점 사이에 표시된다. R-피크는 각 ROI의 최대값에 표시된다.
피크 추출 과정을 보여주는 그림. 이동 평균은 교차 임계값 (II)으로 사용된다. 후보 피크는 교차점 사이의 최대값에 표시된다 (III). 이동 평균은 변화하는 PPG 파형 형태 (I)를 보상하기 위해 단계적으로 조정된다.
피크 감지 단계에서 알고리즘은 계산된 임계값의 진폭을 단계적으로 조정한다. 최적의 맞춤을 찾기 위해 연속 차이 (SDSD) 간의 표준 편차를 최소화하고 신호의 BPM을 확인한다. 이것은 심박수 신호의 상대적인 규칙성을 활용하여 최적의 임계값을 근사하는 빠른 방법을 나타낸다. 아래 그림에서 볼 수 있듯이 하나의 R-피크 (III)가 누락되면 최적 적합 (II)에 비해 SDSD가 상당히 증가한다. 잘못된 R-피크를 표시하면 SDSD (I)가 증가한다. 가능한 BPM 값과 함께 0이 아닌 가장 낮은 SDSD 값이 가장 적합한 것으로 선택된다. BPM은 미리 정해진 범위 내에 있어야 한다 (기본값 : 40 <= BPM <= 180, 사용자가 설정 가능한 범위).
아래 그림은 SDSD가 피크 피팅과 어떤 관련이 있는지 보여준다. 본질적으로 피팅 기능은 심박수 신호에서 예상되는 강한 규칙성을 활용한다.
SDSD가 단일 놓친 비트에도 강하게 반응하는 방식을 보여주는 그림 (하단 플롯), 모든 피크가 제대로 감지될 때 가장 낮은 (중간 플롯) 클리핑이 발생할 때마다 알고리즘이 이를 감지하고 스플라인 보간으로 파형을 재구성하려고 시도한다. 이것은 클리핑 감지 및 보간에서 논의된다.
감지된 각 피크 (양단에서 +/- 100ms)를 둘러싼 신호를 취하고 더 정확한 피크 위치 추정을 위해 더 높은 샘플링 속도를 시뮬레이션하기 위해 업샘플링하는 '고정밀 모드' 옵션을 사용할 수 있다. 기본적으로 ms-정확한 피크 위치 추정을 제공하기 위해 1000Hz로 업샘플링한다.
Peak rejection
피팅 단계 후에도 다양한 요인으로 인해 잘못 감지된 여러 피크가 여전히 남아 있을 수 있다. 다음 섹션의 RR 간격에 대한 임계값을 기반으로 테스트 및 거부된다.
임계값은 세그먼트의 RR 간격 평균을 기반으로 계산된다. 임계값은 RR_mean + / - (RR_mean의 30%, 최소값 300) (각각 상한 및 하한 임계값에 대해 + 또는 -)로 결정된다. RR 간격이 임계값 중 하나를 초과하면 무시된다.
Calculation of measures
모든 측정은 세그먼트에서 감지되고 허용된 피크에서 계산된다. RR 간격이 계산에 사용되면 두 개의 인접한 허용되는 피크에 의해 생성된 간격만 사용된다. RR 간격의 차이가 필요할 때마다 (ex: RMSSD에서) 두 개의 인접한 RR 간격 사이의 간격만 사용되며, 이 간격은 차례로 3개의 인접한 허용 피크에 의해 생성된다. 이는 거부된 피크가 후속 측정 계산에서 측정 오류를 주입하지 않도록 한다.
시계열 (Time-series)
시계열 측정은 감지된 피크에서 계산된다. 출력 측정값은 다음과 같다.
|
주파수 영역 (Frequency Domain)
계산된 주파수 영역 측정값은 다음과 같다.
|
측정값은 FFT 기반, Periodogram 기반 또는 Welch 기반 방법을 사용하여 자체적으로 추정되는 PSD (Power Spectral Density)에서 계산된다. 기본값은 Welch의 방법이다.
호흡수 추정 (Estimating breathing rate)
심장의 흥미로운 특성 중 하나는 심장이 뛰는 빈도가 자율 신경계를 통해 호흡에 의해 크게 영향을 받는다는 것이다. 심호흡이 신경을 진정시킬 수 있는 이유 중 하나이다. 또한, 이 관계를 활용하여 심박수 데이터 세그먼트에서 호흡수를 추출할 수 있다. 예를 들어, CO2 capnometry 신호와 PPG 신호를 모두 포함하는 데이터셋을 사용하면 호흡과 RR 간격 사이의 관계를 명확하게 볼 수 있다. 아래는 CO2 카프노메트리 신호 (코에서 측정된 호흡 신호)와 RR 간격에 의해 생성된 (업샘플링된) 신호이다.
문제는 이제 주파수 영역 변환 중 하나로 축소된다. 툴킷을 사용하여 호흡수를 추출할 수 있다. '프로세스' 함수를 호출한 후 반환되는 dict{} 객체에서 호흡수 (Hz)를 사용할 수 있다.
import heartpy as hp
data = hp.get_data('data.csv')
fs = 100.0
working_data, measures = hp.process(data, fs, report_time=True)
print('breathing rate is: %s Hz' %measures['breathingrate'])
breathing rate is: 0.16109544905356424 Hz
https://python-heart-rate-analysis-toolkit.readthedocs.io/en/latest/algorithmfunctioning.html
'Python Library > HeartPy' 카테고리의 다른 글
[HeartPy] ECG 신호 분석 (0) | 2022.08.24 |
---|---|
[HeartPy] PPG 신호 분석 (0) | 2022.08.24 |
[HeartPy] 심박수 분석 (Heart Rate Analysis) (0) | 2022.08.23 |
[HeartPy] 알고리즘 (1) (0) | 2022.08.23 |
HeartPy (0) | 2022.08.23 |