Source code for neurokit2.hrv.intervals_process

# -*- coding: utf-8 -*-
from warnings import warn

import numpy as np

from ..misc import NeuroKitWarning
from ..signal import signal_detrend, signal_interpolate
from .intervals_utils import (
    _intervals_sanitize,
    _intervals_time_to_sampling_rate,
    _intervals_time_uniform,
)


[docs] def intervals_process( intervals, intervals_time=None, interpolate=False, interpolation_rate=100, detrend=None, **kwargs ): """**Interval preprocessing** R-peak intervals preprocessing. Parameters ---------- intervals : list or array List or numpy array of intervals, in milliseconds. intervals_time : list or array, optional List or numpy array of timestamps corresponding to intervals, in seconds. interpolate : bool, optional Whether to interpolate the interval signal. The default is False. interpolation_rate : int, optional Sampling rate (Hz) of the interpolated interbeat intervals. Should be at least twice as high as the highest frequency in vhf. By default 100. To replicate Kubios defaults, set to 4. detrend : str Can be one of ``"polynomial"`` (traditional detrending of a given order) or ``"tarvainen2002"`` to use the smoothness priors approach described by Tarvainen (2002) (mostly used in HRV analyses as a lowpass filter to remove complex trends), ``"loess"`` for LOESS smoothing trend removal or ``"locreg"`` for local linear regression (the *'runline'* algorithm from chronux). By default None such that there is no detrending. **kwargs Keyword arguments to be passed to :func:`.signal_interpolate`. Returns ------- np.ndarray Preprocessed intervals, in milliseconds. np.ndarray Preprocessed timestamps corresponding to intervals, in seconds. int Sampling rate (Hz) of the interpolated interbeat intervals. Examples -------- **Example 1**: With interpolation and detrending .. ipython:: python import neurokit2 as nk import matplotlib.pyplot as plt plt.rc('font', size=8) # Download data data = nk.data("bio_resting_5min_100hz") sampling_rate = 100 # Clean signal and find peaks ecg_cleaned = nk.ecg_clean(data["ECG"], sampling_rate=100) _, info = nk.ecg_peaks(ecg_cleaned, sampling_rate=100, correct_artifacts=True) peaks = info["ECG_R_Peaks"] # Convert peaks to intervals rri = np.diff(peaks) / sampling_rate * 1000 rri_time = np.array(peaks[1:]) / sampling_rate # # Compute HRV indices # @savefig p_intervals_process1.png scale=100% # plt.figure() # plt.plot(intervals_time, intervals, label="Original intervals") # intervals, intervals_time = nk.intervals_process(rri, # intervals_time=rri_time, # interpolate=True, # interpolation_rate=100, # detrend="tarvainen2002") # plt.plot(intervals_time, intervals, label="Processed intervals") # plt.xlabel("Time (seconds)") # plt.ylabel("Interbeat intervals (milliseconds)") # @suppress # plt.close() """ # Sanitize input intervals, intervals_time, _ = _intervals_sanitize( intervals, intervals_time=intervals_time ) if interpolate is False: interpolation_rate = None if interpolation_rate is not None: # Rate should be at least 1 Hz (due to Nyquist & frequencies we are interested in) # We considered an interpolation rate 4 Hz by default to match Kubios # but in case of some applications with high heart rates we decided to make it 100 Hz # See https://github.com/neuropsychology/NeuroKit/pull/680 for more information # and if you have any thoughts to contribute, please let us know! if interpolation_rate < 1: warn( "The interpolation rate of the R-R intervals is too low for " " computing the frequency-domain features." " Consider increasing the interpolation rate to at least 1 Hz.", category=NeuroKitWarning, ) # Compute x-values of interpolated interval signal at requested sampling rate. x_new = np.arange( start=intervals_time[0], stop=intervals_time[-1] + 1 / interpolation_rate, step=1 / interpolation_rate, ) intervals = signal_interpolate(intervals_time, intervals, x_new=x_new, **kwargs) intervals_time = x_new else: # check if intervals appear to be already interpolated if _intervals_time_uniform(intervals_time): # get sampling rate used for interpolation interpolation_rate = _intervals_time_to_sampling_rate(intervals_time) if detrend is not None: intervals = signal_detrend( intervals, method=detrend, sampling_rate=interpolation_rate ) return intervals, intervals_time, interpolation_rate