metrics
Functions
compute_heart_rate(data, sample_rate=1000, method='fft', **kwargs)
Compute heart rate in BPM from PPG signal.
Parameters:
-
data(NDArray) –PPG signal (1-D).
-
sample_rate(float, default:1000) –Sampling rate in Hz.
-
method(str, default:'fft') –Method to compute heart rate,
"fft"or"peak". -
**kwargs(dict, default:{}) –Keyword arguments to pass to the selected method.
Returns:
Example
import numpy as np ppg = np.sin(2 * np.pi * 1.2 * np.arange(0, 5, 1/100)) bpm, _ = compute_heart_rate(ppg, sample_rate=100) int(round(bpm)) 72
Source code in physiokit/ppg/metrics.py
compute_heart_rate_from_fft(data, sample_rate=1000, lowcut=0.5, highcut=4.0)
Compute heart rate from FFT of PPG signal.
Parameters:
-
data(NDArray) –PPG signal (1-D).
-
sample_rate(float, default:1000) –Sampling rate in Hz.
-
lowcut(float, default:0.5) –Lowcut frequency in Hz.
-
highcut(float, default:4.0) –Highcut frequency in Hz.
Returns:
Example
import numpy as np ppg = np.sin(2 * np.pi * 1.3 * np.arange(0, 5, 1/100)) bpm, _ = compute_heart_rate_from_fft(ppg, sample_rate=100) int(round(bpm)) 78
Source code in physiokit/ppg/metrics.py
compute_heart_rate_from_peaks(data, sample_rate=1000, min_rr=0.3, max_rr=2.0, min_delta=0.3)
Compute heart rate from peaks of PPG signal.
Parameters:
-
data(NDArray) –PPG signal (1-D).
-
sample_rate(float, default:1000) –Sampling rate in Hz.
-
min_rr(float, default:0.3) –Minimum RR interval (s).
-
max_rr(float, default:2.0) –Maximum RR interval (s).
-
min_delta(float, default:0.3) –Allowed fractional RR deviation.
Returns:
Example
import numpy as np ppg = np.sin(2 * np.pi * 1.0 * np.arange(0, 5, 1/50)) bpm, qos = compute_heart_rate_from_peaks(ppg, sample_rate=50) bpm > 50 and qos > 0 True
Source code in physiokit/ppg/metrics.py
compute_spo2_from_perfusion(dc1, ac1, dc2, ac2, coefs=(1, 0, 0))
Compute SpO2 from ratio of perfusion indexes (AC/DC).
Device Coefficients
- MAX30101: [1.5958422, -34.6596622, 112.6898759]
- MAX8614X: [-16.666666, 8.333333, 100]
Parameters:
-
dc1(float) –DC component of 1st PPG signal (e.g RED).
-
ac1(float) –AC component of 1st PPG signal (e.g RED).
-
dc2(float) –DC component of 2nd PPG signal (e.g. IR).
-
ac2(float) –AC component of 2nd PPG signal (e.g. IR).
-
coefs(tuple[float, float, float], default:(1, 0, 0)) –Calibration coefficients. Defaults to (1, 0, 0).
Returns:
-
float(float) –SpO2 value clipped to [50, 100].
Example
compute_spo2_from_perfusion(dc1=1.0, ac1=0.2, dc2=1.0, ac2=0.2, coefs=(1, 0, 90)) 90.0
Source code in physiokit/ppg/metrics.py
compute_spo2_in_frequency(ppg1, ppg2, coefs=(1, 0, 0), sample_rate=1000, lowcut=0.5, highcut=4.0, order=3)
Compute SpO2 from PPG signals in frequency domain.
Parameters:
-
ppg1(NDArray) –1st PPG signal (e.g RED).
-
ppg2(NDArray) –2nd PPG signal (e.g. IR).
-
coefs(tuple[float, float, float], default:(1, 0, 0)) –Calibration coefficients.
-
sample_rate(float, default:1000) –Sampling rate in Hz.
-
lowcut(float, default:0.5) –Lowcut frequency in Hz.
-
highcut(float, default:4.0) –Highcut frequency in Hz.
-
order(int, default:3) –Order of filter.
Returns:
-
float(float) –SpO2 value.
Example
import numpy as np t = np.arange(0, 2, 0.01) ppg1 = 1.0 + 0.1 * np.sin(2 * np.pi * t) ppg2 = 1.0 + 0.1 * np.sin(2 * np.pi * t + 0.2) 50 <= compute_spo2_in_frequency(ppg1, ppg2, sample_rate=100) <= 100 True
Source code in physiokit/ppg/metrics.py
compute_spo2_in_time(ppg1, ppg2, coefs=(1, 0, 0), sample_rate=1000, lowcut=0.5, highcut=4, order=3)
Compute SpO2 from PPG signals in time domain.
Parameters:
-
ppg1(NDArray) –1st PPG signal (e.g RED).
-
ppg2(NDArray) –2nd PPG signal (e.g. IR).
-
coefs(tuple[float, float, float], default:(1, 0, 0)) –Calibration coefficients.
-
sample_rate(float, default:1000) –Sampling rate in Hz.
-
lowcut(float, default:0.5) –Lowcut frequency in Hz.
-
highcut(float, default:4) –Highcut frequency in Hz.
-
order(int, default:3) –Order of filter.
Returns:
-
float(float) –SpO2 value.
Example
import numpy as np t = np.arange(0, 2, 0.01) ppg1 = 1.0 + 0.1 * np.sin(2 * np.pi * t) ppg2 = 1.0 + 0.1 * np.sin(2 * np.pi * t + 0.1) 50 <= compute_spo2_in_time(ppg1, ppg2, sample_rate=100) <= 100 True
Source code in physiokit/ppg/metrics.py
derive_respiratory_rate(ppg, peaks, troughs=None, rri=None, sample_rate=1000, method='rifv', lowcut=0.1, highcut=1.0, order=3, threshold=0.85, interpolate_method='linear')
Derive respiratory rate from PPG signal using given method.
Parameters:
-
ppg(NDArray) –PPG signal.
-
peaks(NDArray) –Peak indices of PPG signal.
-
troughs(NDArray | None, default:None) –Trough indices (required for
"riav"). -
rri(NDArray | None, default:None) –RR intervals (required for
"rifv"). -
sample_rate(float, default:1000) –Sampling rate in Hz.
-
method(Literal['riav', 'riiv', 'rifv'], default:'rifv') –Respiratory method.
-
lowcut(float, default:0.1) –Lowcut frequency in Hz.
-
highcut(float, default:1.0) –Highcut frequency in Hz.
-
order(int, default:3) –Filter order.
-
threshold(float | None, default:0.85) –Threshold for FFT peak selection.
-
interpolate_method(str, default:'linear') –Interpolation method for resampling the derived respiratory signal.
Returns:
Example
import numpy as np t = np.arange(0, 10, 0.1) ppg = np.sin(2 * np.pi * 0.2 * t) peaks = np.array([5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95]) troughs = peaks + 2 derive_respiratory_rate(ppg=ppg, peaks=peaks, troughs=troughs[troughs < ppg.size], sample_rate=10, method="riiv")[0] 12.0