脑电信号处理与特征提取

一、脑电信号获取

脑电信号是由脑部神经元的兴奋和抑制行为产生的微弱电流信号。为了获取脑电信号,需要使用电极阵列将电极头置于头皮上。脑电信号是一种高噪声、低幅值、高时间分辨率的信号,因此需要进行信号放大和滤波。

二、脑电信号预处理

脑电信号需要进行预处理处理,以消除噪声、伪迹和其他干扰。预处理包括:滤波、空间滤波、伪迹去除。

1. 滤波

  def butter_bandpass_filter(data,lowcut,highcut,fs,order=5):
    nyq = 0.5 * fs
    low = lowcut / nyq
    high = highcut / nyq
    b, a = butter(order, [low, high], btype='band')
    y = filtfilt(b, a, data)
    return y

使用巴特沃斯滤波器进行带通滤波,过滤掉低频和高频噪音。这个函数的输入数据data是一维的,函数返回的也是一维的数据。

2. 空间滤波

  def common_average_reference(data,anchors,bads = []):
    '''
    common average reference
    @data:(n_channels,n_samples)脑电信号数据矩阵
    @anchors:(n_channels,n_channels)电极距离矩阵或者十二个电极头的距离矩阵
    @bads:(n_bad_chls)默认是空通道数组
    '''
    n_chls,n_samps = data.shape
    all_chls = np.arange(n_chls)
    if len(bads)!=0:
        all_chls = np.delete(all_chls,bads)
    n_active_chls = len(all_chls)
    loc = pycsd.estimate_locations(
        anchors[all_chls,:][:,all_chls],#使用最小描述长度方法估计电极的三维坐标
        ch_xyz=False)
    loc = loc[:n_active_chls,:]
    tmp_data = data[all_chls,:]
    mu = np.mean(tmp_data,axis=0,keepdims=True)
    re_tmp_data = tmp_data - mu
    csr = pycsd.constant_neighborhood(loc)
    csr_noise = pycsd.CSRNoiseThreshold(estimate='median', factor=1.0)
    csr.apply(re_tmp_data,out=tmp_data)
    csr_noise.apply(tmp_data,out=tmp_data)
    csr_back = pycsd.CSRBackProjection(loc)
    csr_back.apply(tmp_data,out=tmp_data)
    re_data = np.zeros((n_chls,n_samps))
    re_data[all_chls,:] = tmp_data + mu
    return re_data

公共平均参考(car)是一种将整个电极阵列上的平均电压作为参考的预处理方法。空间滤波是一种更高级的预处理方法,它通过通过前后极性间电导率或距离权重来进行精细的空间过滤。以上代码实现的是car算法,这个函数的输入数据data是二维的(通道×时间),函数返回的也是二维数据。

3. 伪迹去除

经常会发现一些漂移伪迹,这些伪迹可以通过比较普通平均假设和初始假设之间的网格方差来检测。伪迹去除需要进行去除或比较。

  def drift_removal(data,fs,design='exponential'):
    '''
    @design:(str)scipy.signal.butter中的滤波函数的类型,包括‘butter’,’chebyshev’,’cheb2’,’ellip’,’bessel’
    '''
    drift_removal = MFDFA.rolling_band_pass_filter(exponent=0.25,
                                low_frequency_cutoff=0.01,
                                high_frequency_cutoff=1,
                                num_frequencies=50,
                                sampling_frequency=fs,
                                filter_type=design,
                                roll_perc=0.02,
                                enforce_constant_signal_length=True)
    data_removal = drift_removal(np.copy(data))
    return data_removal

三、信号分析

对脑电文本采用时间序列分析相关方法进行信号分析

1、频谱分析

频谱分析可以帮助我们寻找脑波的周期性。Python可以通过使用pyeeg中的fband函数来实现求功率谱密度,以下是代码示例:

  import numpy as np
  import pyeeg
  import matplotlib.pyplot as plt

  def psd_plot(data,fs):
    powers, freqs = pyeeg.bin_power(
      data,
      band=[0.5,4,8,15,30],
      fs=fs)
    plt.plot(freqs,powers)
    plt.show()

2、时频分析

时频分析是指在时间和频率两个维度上分析信号。它是一种用于描述时间变化信号中频率变化的信号分析方法。Python中可以使用tftb中的mmsp函数来实现时频分析,以下是代码示例:

  import numpy as np
  from tftb.processing import SmoothedPseudoWignerVilleDistribution

  def spwvd_transform(data):
    n_chls,n_samps = np.shape(data)
    spwvd_transform = np.zeros((n_chls,n_samps,n_samps))
    for i in range(n_chls):
      spwvd_transform[i] = SmoothedPseudoWignerVilleDistribution(data[i])
    return spwvd_transform

3、小波变换

小波变换是一种基于时间和频率的信号分析方法,它将信号分解为时间和频率两个维度上的不同成分。Python中可以使用pywt来实现小波分析,以下是代码示例:

  import pywt

  def wavelet_transform(data,wavelet='db3'):
    coeffs = []
    n_chls,n_samps = np.shape(data)
    for i in range(n_chls):
      coeffs_chl = pywt.wavedec(data[i],wavelet)
      coeffs.append(coeffs_chl)
    return coeffs

四、特征提取

在时间序列分析中,特征提取是一种用于从信号中提取更有意义信息的方法。使用脑电信号特征提取可以有效地分析脑电数据的变化趋势和特征。下面介绍几种常用的特征提取方法:

1、能量谱密度

脑电信号的功率谱密度(PSD)对于特征提取非常有用。PSD提供了对频率功率分布的深入了解,并可以帮助识别与不同事件相关的特定频率变化。

  import numpy as np
  from scipy import signal

  def psd_feat(data,fs,freqs):
    psd_feature = []
    window = signal.windows.hann(len(data))
    for chl in data:
      freqs, psd = signal.welch(chl, fs, window=window,nperseg=len(chl))
      psd_feature.append(psd)
    return psd_feature

2、时域特征

时域特征是对脑电波形的统计特征进行建模。可以使用PyEEG的函数来计算各种时域特征,例如Hurst指数,样品熵等。

  import numpy as np
  import pyeeg

  def time_feat(data):
    time_feature = []
    for chl in data:
      pe = pyeeg.spectral_entropy(chl,6, EEG = True)
      time_feature.append(pe)
    return psd_feature

3、小波特征

小波变换可以实现频率的细分,有助于区分不同类型的脑电信号.通过对各小波系数的统计分析可得到比较鲜明的特征。例如,可以使用Hjorth参数,TKEO等方法计算一些小波形的特征。

  import numpy as np
  import pywt

  def wavelet_feat(data):
    feature = []
    for chl in data:
      cA, cD = pywt.dwt(chl, 'db1')
      feature.append([np.mean(cD), np.std(cD), np.mean(abs(cD)), np.median(abs(cD)), np.max(cD)-np.min(cD)])
    return feature

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/303396.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-31 11:49
下一篇 2024-12-31 11:49

相关推荐

  • 加菲猫是什么品种?解析加菲猫的品种特征

    如果你对猫咪很感兴趣,一定会听说过加菲猫这个名字。那么,加菲猫是什么品种呢?加菲猫的特征又有哪些呢?下面我们就来一一解答。 一、加菲猫的品种历史 加菲猫是由艾尔达·埃尔斯曼女士于1…

    编程 2025-04-27
  • 使用Matlab求解矩阵的特征值和特征向量

    一、求解矩阵的特征值 在Matlab中,使用函数eig(A)可以求解矩阵A的特征值。该函数的返回值为一个列向量,包含了矩阵A的所有特征值。例如: A = [1 2 3; 2 4 5…

    编程 2025-04-22
  • SIFT特征详解

    一、SIFT特征介绍 SIFT全称是Scale Invariant Feature Transform,即为尺度不变特征变换,是由David Lowe在1999年提出的一种特征检测…

    编程 2025-04-12
  • 深入理解文本特征

    一、什么是文本特征 文本特征是指在文本中占据重要位置的一些属性或特点,例如词频、词性、情感倾向、关键词等。在文本挖掘和自然语言处理任务中,文本特征通常用于描述和区分不同的文本。 其…

    编程 2025-04-12
  • 图像纹理特征提取

    图像纹理是图像中像素之间的复杂关系,其反映了图像的光滑、粗糙、混乱、有序等特征。因此,对于许多图像处理和分析任务,包括目标分类、目标检测、图像信息检索等,从图像纹理中提取特征已成为…

    编程 2025-02-27
  • 音频特征提取

    一、音频特征的意义与应用 在音频信息处理中,音频特征指的是从原始音频信号中提取出来的代表音频特点的参数值,是对音频信号的抽象和简化,是从物理角度、感性经验角度、统计特征角度等多角度…

    编程 2025-02-25
  • 特征点检测

    一、什么是特征点 特征点是指图像中具有独特、稳定性较高、易于提取和匹配的点。这些点通常是图像的显著部分或者具有一定的结构信息。例如,边缘、角点、斑点等。对于不同的应用场景,特征点并…

    编程 2025-02-24
  • 灰度特征的探究

    灰度是指在黑白影像中,某一像素点的亮度值。而灰度特征,则是在图像分析领域中,对于灰度值的某种特征的描述。对于灰度特征的研究,有助于深入理解图像的本质特征,可以用于图像分类、图像识别…

    编程 2025-02-05
  • 递归特征消除法详解

    一、递归特征消除法原理 递归特征消除法(Recursive Feature Elimination, RFE)是一种基于机器学习的特征选择方法。其基本思想是通过不断地训练模型并排除…

    编程 2025-02-01
  • 特征工程

    一、特征工程的定义 特征工程是指在机器学习和数据挖掘任务中,将原始数据转换为模型可用特征的过程。其目的是在保留最大信息量的同时,提高模型的准确性和预测能力。 在机器学习中,特征的选…

    编程 2025-01-20

发表回复

登录后才能评论