近红外光谱脑功能成像(fNIRS):1.光学原理、变量选取与预处理

一、朗伯-比尔定律与修正的朗伯-比尔定律

        朗伯-比尔定律 是一个描述光通过溶液时被吸收的规律。想象你有一杯有色液体,比如一杯红茶。当你用一束光照射这杯液体时,光的一部分会被液体吸收,导致透过液体的光变弱。朗伯-比尔定律告诉我们,透过液体的光的强度减少的程度与以下三个因素有关:

  1. 光的传输路径长度:如果你增加液体的深度(即光穿过的路径更长),光被吸收得更多,透过液体的光就更少。
  2. 吸光物质的浓度:如果液体中吸收光的物质(比如茶叶中的色素)更多,光被吸收得更多,透过液体的光就更少。
  3. 消光系数:这是一个物质的特性,表示这种物质吸收光的能力。不同的物质有不同的消光系数。

朗伯-比尔定律的数学表达式是:

OD=ϵ⋅C⋅L

其中:

  • OD是光密度(Optical Density),表示光被吸收的程度。
  • ϵ 是消光系数,表示物质吸收光的能力。
  • C 是吸光物质的浓度。
  • L 是光穿过的路径长度。

        修正的朗伯-比尔定律 是在朗伯-比尔定律的基础上考虑了光在生物组织中的散射效应。在生物组织中,光不仅会被吸收,还会因为与组织中的微粒碰撞而改变方向,这种现象叫做散射。散射使得光在组织中的实际路径比直线更长,因此光被吸收得更多。

        修正的朗伯-比尔定律考虑了这一点,并引入了两个新的参数:

  1. 路径长度修正因子(DPF):这个因子表示由于散射效应,光在组织中的实际路径长度是直线长度的多少倍。
  2. 其他因素引起的光强衰减总和(G):这个参数表示除了吸光物质之外,其他因素(如颅骨、脑脊液等)引起的光强衰减。

        修正的朗伯-比尔定律的数学表达式是:

OD=ϵ⋅C⋅DPF⋅L+G

        在实际应用中,由于 G 很难测量,通常我们只关注吸光物质浓度的相对变化,而不是绝对值。通过测量不同时间点的光衰减量,并利用修正的朗伯-比尔定律,可以求解出血红蛋白浓度的相对变化,这对于研究脑功能等生物学过程非常有用。

二、因变量与自变量选取

       在认知心理学领域,fNIRS脑成像实验通过操纵自变量(如不同刺激或行为)来记录血液动力学响应的变化,以此作为因变量,探索认知功能的神经基础。因变量在fNIRS研究中通常表现为血液动力学响应的变化,具体可以取的值包括氧合血红蛋白和脱氧血红蛋白的浓度变化、脑区血流量的变化等

        自变量是实验者可以操纵的因素,其不同取值称为不同水平或条件。自变量可以通过操作化定义转换为具体、可量化的指标,以便于实验操作和结果分析。例如,受试者对任务的参与程度可以通过可能获得的报酬数量来量化,通过设置不同等级的报酬来实现对受试者参与程度这个变量的操纵。自变量可以根据数据类型(类别变量或连续变量)、来源(作业/任务变量、环境变量、受试者变量)和可操作性进行分类。类别变量的例子如性别(男/女),连续变量的例子如学习成绩(0—100的任意取值)。

        单因素设计通过比较实验条件与基线条件来计算神经响应指标。减法法则要求比较两种任务的反应时差异,以分离特定认知过程的反应时。因变量在这种情况下可以取的值包括反应时、正确率等行为响应指标,以及神经活动引起的局部血液动力学响应。

        共性法则通过多个减法实验求得共性部分,提高脑区与认知成分关联的可能性。因素设计同时操纵多个自变量,每个因素设置多个水平,以探索因素间的交互作用。因变量在因素设计中可以取的值包括不同实验条件下神经活动的变化,如脑区血红蛋白浓度的变化。

        参数设计将感兴趣的变量视为连续变量,通过在多个水平上观察和记录因变量的值,来确定自变量与神经响应之间的具体关系模式。因变量在参数设计中可以取的值包括随着自变量变化,脑活动的变化模式,如线性或非线性关系。

三、数据预处理

  1. 去漂移(Detrending)

    • 原因成像系统(如机器)在工作过程中逐渐升温环境温度和光照的改变受试者缓慢的头动,通常表现为较长时间范围内的缓慢波动。这种漂移会使fNIRS信号的基线发生改变,影响信号的稳定性和准确性。
    • 方法:通过拟合信号中的线性或非线性趋势项,然后从原始信号中减去这些趋势项来实现去漂移。
    • 数学原理:去漂移是通过拟合信号中的线性或非线性趋势项,然后从原始信号中减去这些趋势项来实现的。
    • 公式:假设原始信号为 y(t),拟合的趋势项为 T(t),去漂移后的信号为 y_{d}(t),则有:

      y_{d}(t) = y(t) - T(t)

  2. 周期性噪声滤波(Filtering)

    • 原因:周期性噪声包括机器噪声(如工频噪声50Hz和随机热噪声高于2Hz)和生理噪声(如心率约1Hz、呼吸约0.2—0.3Hz、Mayer wave约0.1Hz和极低频的生理波动低于0.01Hz)。这些噪声成分具有明显的周期性波动特点,会影响信号的纯净度。
    • 方法:通过高通滤波、低通滤波和带通滤波等频域滤波方法去除信号中具有明显周期性波动特点的噪声成分。
    • 数学原理:滤波是通过在频域中去除特定频率成分来实现的。高通滤波、低通滤波和带通滤波是常用的滤波方法。
    • 公式:假设原始信号为 y(t),滤波后的信号为 y_{f}(t),滤波器的传递函数为 H(f),则有:

      Y_{f}(f) = Y(f) \cdot H(f)

  3. 头动噪声和浅层噪声去除

    • 头动噪声去除
      • 原因:受试者头动可能导致光极与头皮接触不良,这种头动噪声往往体现为信号中的大幅跳变。由于其出现时间和位置都较为随机,传统的频域滤波预处理方法很难去除这种噪声。
      • 方法:通过异常点检测方法检测到头动噪声,将任意时间点信号的幅值与一段时间内信号的平均幅值做对比,并且设置一定的阈限来标出异常点,然后去除这些异常点。
      • 数学原理:头动噪声通常表现为信号中的大幅跳变,可以通过异常点检测方法来识别和去除。
      • 公式:假设信号的均值为 μ,标准差为 σ,阈值为 k,则异常点检测公式为:异常点←∣y(t)−μ∣>k⋅σ
    • 浅层噪声去除
      • 原因:头皮、颅骨和脑膜等浅层组织中含丰富的毛细血管,呼吸、心跳等生理波动及任务相关的自主神经活动都会引起这些毛细血管中血红蛋白浓度的变化,从而导致fNIRS光衰减量的变化(即浅层生理噪声)。
      • 方法:通过短间隔通道法或空间滤波方法去除浅层噪声。短间隔通道法利用额外的短间距fNIRS通道记录浅层生理噪声,再从信号中将其去除。
      • 数学原理:浅层噪声可以通过短间隔通道法或空间滤波方法来去除。短间隔通道法利用额外的短间距fNIRS通道记录浅层生理噪声,然后从信号中减去这些噪声。
      • 公式:假设浅层噪声信号为 n(t),原始信号为 y(t),去除浅层噪声后的信号为 y_{n}(t),则有:y_{n}(t) = y(t) - n(t)

四、Python代码实现

代码如下:

import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import detrend, butter, filtfilt

np.random.seed(0)  # 模拟生成
t = np.linspace(0, 100, 1000)
y = np.sin(0.1 * t) + 0.1 * np.random.randn(1000)  # 添加正弦信号和噪声
y += 0.01 * t  # 添加线性漂移

# 去漂移
y_detrend = detrend(y)

# 周期性噪声滤波
def butter_bandpass_filter(data, lowcut, highcut, fs, order=4):
    nyq = 0.5 * fs
    low = lowcut / nyq
    high = highcut / nyq
    b, a = butter(order, [low, high], btype='band')
    filtered = filtfilt(b, a, data)
    return filtered

fs = 10  # 采样频率
lowcut = 0.5
highcut = 2.0
y_filtered = butter_bandpass_filter(y_detrend, lowcut, highcut, fs)

# 头动噪声去除
def remove_spikes(data, threshold=3):
    mean = np.mean(data)
    std = np.std(data)
    outliers = np.abs(data - mean) > threshold * std
    data_clean = np.copy(data)
    data_clean[outliers] = mean
    return data_clean

y_no_spikes = remove_spikes(y_filtered)

# 浅层噪声去除(实际应用中需要额外的短间距通道数据)
y_no_shallow = y_no_spikes - 0.1 * np.random.randn(1000)  

fig, axs = plt.subplots(5, 1, figsize=(10, 15), sharex=True)

plt.rcParams['font.family'] = 'serif'
plt.rcParams['font.size'] = 12
plt.rcParams['lines.linewidth'] = 1.5
plt.rcParams['lines.linestyle'] = '-'

axs[0].plot(t, y, color='blue')
axs[0].set_title('Original Signal', fontsize=14)
axs[0].grid(True)

axs[1].plot(t, y_detrend, color='green')
axs[1].set_title('Detrended Signal', fontsize=14)
axs[1].grid(True)

axs[2].plot(t, y_filtered, color='red')
axs[2].set_title('Filtered Signal', fontsize=14)
axs[2].grid(True)

axs[3].plot(t, y_no_spikes, color='purple')
axs[3].set_title('Signal without Spikes', fontsize=14)
axs[3].grid(True)

axs[4].plot(t, y_no_shallow, color='orange')
axs[4].set_title('Signal without Shallow Noise', fontsize=14)
axs[4].grid(True)

plt.xlabel('Time (s)', fontsize=14)
plt.tight_layout()
plt.show()

结果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/768570.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024中国西安科博会暨硬科技产业博览会11月召开

2024第18届中国西安国际科学技术产业博览会暨硬科技产业博览会 时间:2024年11月3日-5日 地点:西安国际会展中心 主办单位:中国国际科学技术合作协会 陕西省科技资源统筹中心 协办单位:西安市科学技术协会 西安市中小企业协会、…

IO多路复用学习

Linux中的I/O多路复用 相关基础概念 在学习I/O多路复用之前,先学习一些相关的基础概念,便于理解。 内核缓冲区和用户缓冲区 😮 CPU 上会运行两种程序,一种是操作系统的内核程序(也称为系统程序)&#x…

强行仅用time.localtime制作“日历牌”——全程记录“顶牛”“调戏”我的AI学习搭子

强行只用time.localtime制作“日历牌”,码好代码试炼通过,想榨取ai智能优化算法,结果失败。本文详细记录“顶牛”全过程。 (笔记模板由python脚本于2024年07月01日 19:16:26创建,本篇笔记适合喜欢python,喜欢搞“事儿”…

I2C bus,adaptor,client 在sysfs 的路径定位

i2c bus 路径 struct bus_type i2c_bus_type {.name "i2c",.match i2c_device_match,.probe i2c_device_probe,.remove i2c_device_remove,.shutdown i2c_device_shutdown, }; EXPORT_SYMBOL_GPL(i2c_bus_type);static int __init i2c_init(void) {int re…

【Linux】线程封装与互斥(万字)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 文章目录 前言 C多线程的用法 对原生线程进行一次封装 理解pthread线程 Linux线程互斥 进程线程间的互斥相关背景概念 互斥量mutex 操作共享变量会有问题的售票…

数字信号处理教程(2)——时域离散信号与时域离散系统

上回书说到数字信号处理中基本的一个通用模型框架图。今天咱们继续,可以说今天要讲的东西必须是学习数字信号处理必备的观念——模拟与数字,连续和离散。 时域离散序列 由于数字信号基本都来自模拟信号,所以先来谈谈模拟信号。模拟信号就是…

小米MIX Fold 4折叠屏手机背面渲染图曝光

ChatGPT狂飙160天,世界已经不是之前的样子。 更多资源欢迎关注 7 月 3 日消息,消息源 Evan Blass 今天在 X 平台发布推文,分享了小米 MIX Fold 4 折叠屏手机的高清渲染图(图片有加工成分在,最终零售版本可能会存在差异…

基于Hadoop平台的电信客服数据的处理与分析③项目开发:搭建基于Hadoop的全分布式集群---任务1:运行环境说明

任务描述 项目的运行环境是基于Hadoop的全分布式模式集群。 任务的主要内容是规划集群节点及网络使用,准备初始环境,关闭防火墙和Selinux。 任务指导 1. 基于Hadoop的全分布式模式集群,如下图所示; 2. 硬软件环境:…

微信小程序转发朋友圈详细教程

微信小程序转发朋友圈功能,官方说的很官方,容易踩坑 官方链接戳这里 想分享朋友圈必须要分享好友 onShareTimeline() { } 想要生效必须先定义 onShareAppMessage() { } /*** 用户点击右上角分享*/onShareAppMessage() { },onShareTimeline() { } 简单…

当《开心消消乐》遇上 AI 推理,我们找到了高质量关卡背后的原因!

随着 AI 热潮席卷各行各业,其落地应用已经成为企业技术研发升级的工作重心。人工智能应用的升级不仅需要软件层面的升级迭代,还需要大规模基础设施的支撑。然而,自行搭建大规模算力、存储基础设施对于大多数企业而言都存在技术难度、人力资源…

OBD诊断(ISO15031) 04服务

文章目录 功能简介ISO 9141-2、ISO 14230-4和SAE J1850的诊断服务定义1、清除/重置与排放相关的诊断信息请求消息定义2、请求与排放相关的DTC响应消息定义3、报文示例 ISO 15765-4的诊断服务定义1、请求与排放相关的DTC请求消息定义2、请求与排放相关的DTC响应消息定义3、否定响…

网络基础:OSPF 协议

OSPF(Open Shortest Path First)是一种广泛使用的链路状态路由协议,用于IP网络中的内部网关协议(IGP)。OSPF通过在网络中的所有路由器之间交换路由信息,选择从源到目的地的最优路径。OSPF工作在OSI模型的第…

Python处理excel数据详解

1.导入文件 注意:要把excel放到跟你的python文件在同一个地方 import pandas as pd import numpy as np dfpd.read_excel("鸢尾花训练数据.xlsx",engine"openpyxl") import pandas 先引入 (若没有下载 需要在终端下载 pip install pandas)…

【C语言】enum 关键字

在C语言中,enum关键字用于定义枚举类型。枚举是一种用户自定义的数据类型,由一组命名的整型常量构成。使用枚举可以提高代码的可读性和可维护性,特别是在表示一组相关的常量时。 定义和使用枚举类型 基本定义 要定义一个枚举类型&#xff…

机器人控制系列教程之Delta机器人轨迹规划

并联机器人轨迹规划原理 轨迹规划:并联机器人的轨迹规划相比于串联机器人更加严苛,因为在大多数工作场合都有高速、高精度、轻载的特征。其一般运动轨迹为 Point-To-Point,对这始末两点的轨迹规划在 Delta 机器人乃至所有机器人领域具有重要…

01 数据采集层 流量分发第一步规范采集海量数据

《易经》:“初九:潜龙勿用”。潜龙的意思是隐藏,阳气潜藏,阳爻位于最下方称为“初九”,龙潜于渊,是学而未成的阶段,此时需要打好基础。 而模块一我们就是讲解推荐系统有关的概念、基础数据体系…

2024年7月2日 (周二) 叶子游戏新闻

老板键工具来唤去: 它可以为常用程序自定义快捷键,实现一键唤起、一键隐藏的 Windows 工具,并且支持窗口动态绑定快捷键(无需设置自动实现)。 卸载工具 HiBitUninstaller: Windows上的软件卸载工具 经典名作30周年新篇《恐怖惊魂夜…

VirtualBox Ubuntu Sever配置双网卡

Ubuntu 版本:Ubuntu Server 2404 vitrualBox 网卡配置: 如上配置后,ifconfig 只能看到 网卡1 应用了。要应用 网卡2 需要更改文件 /etc/netplan/50-cloud-init.yaml(不同的ubuntu版本这个文件名可能不同) 首先 ifcon…

《昇思25天学习打卡营第7天|函数式自动微分》

文章目录 今日所学:一、函数与计算图二、微分函数与梯度计算三、Stop Gradient四、Auxiliary data五、神经网络梯度计算总结 今日所学: 今天我学习了神经网络训练的核心原理,主要是反向传播算法。这个过程包括将模型预测值(logit…

PyCharm远程开发配置(2024以下版本)

目录 PyCharm远程开发配置 1、清理远程环境 1.1 点击Setting 1.2 进入Interpreter 1.3 删除远程环境 1.4 删除SSH 2、连接远程环境 2.1 点击Close Project 2.2 点击New Project 2.3 项目路径设置 2.4 SSH配置 2.5 选择python3解释器在远程环境的位置 2.6 配置远程…