Source code for mne_nirs.signal_enhancement._negative_correlation
# Authors: Robert Luke <mail@robertluke.net>
#
# License: BSD (3-clause)
import numpy as np
from mne import pick_types
from mne.io import BaseRaw
from mne.utils import _validate_type
[docs]
def enhance_negative_correlation(raw):
"""
Apply negative correlation enhancement algorithm.
As described in :footcite:`cui2010functional`.
This function will return a modified raw instance that has the
enhancement applied to it.
This function can only be run on data containing
hbo and hbr types.
Parameters
----------
raw : instance of Raw
Haemoglobin data.
Returns
-------
raw : instance of Raw
The modified raw instance.
References
----------
.. [1] Cui et al, Functional Near Infrared Spectroscopy (NIRS) signal
improvement based on negative correlation between oxygenated and
deoxygenated hemoglobin dynamics, NeuroImage
https://doi.org/10.1016/j.neuroimage.2009.11.050
"""
raw = raw.copy().load_data()
_validate_type(raw, BaseRaw, "raw")
hbo_channels = pick_types(raw.info, fnirs="hbo")
hbr_channels = pick_types(raw.info, fnirs="hbr")
if (not len(hbo_channels)) & (not len(hbr_channels)):
raise RuntimeError(
"enhance_negative_correlation should " "be run on haemoglobin data."
)
if len(hbo_channels) != len(hbr_channels):
raise RuntimeError("Same number of hbo and hbr channels required.")
for idx in range(len(hbo_channels)):
if (
raw.info["chs"][hbo_channels[idx]]["ch_name"][:-4]
!= raw.info["chs"][hbr_channels[idx]]["ch_name"][:-4]
):
raise RuntimeError("Channels must alternate between HBO and HBR.")
for idx in range(len(hbo_channels)):
hbo = raw._data[hbo_channels[idx]]
hbr = raw._data[hbr_channels[idx]]
hbo = hbo - np.mean(hbo)
hbr = hbr - np.mean(hbr)
hbo_std = np.std(hbo)
hbr_std = np.std(hbr)
alpha = hbo_std / hbr_std
raw._data[hbo_channels[idx]] = 0.5 * (hbo - alpha * hbr)
raw._data[hbr_channels[idx]] = -(1 / alpha) * raw._data[hbo_channels[idx]]
return raw