欢迎关注我们,选择加"星标"或“置顶”
更多技术,第一时间送达
SSVEP信号中含有自发脑电和大量外界干扰信号,属于典型的非线性非平稳信号。传统的滤波方法通常不满足对非线性非平稳分析的条件,1998年黄鄂提出希尔伯特黄变换(HHT)方法,其中包含经验模式分解(EMD)和希尔伯特变换(HT)两部分。EMD可以将原始信号分解成为一系列固有模态函数(IMF) [1],IMF分量是具有时变频率的震荡函数,能够反映出非平稳信号的局部特征,用它对非线性非平稳的SSVEP信号进行分解比较合适。
EMD算法原理:
步骤1:
寻找信号全部极值点,通过三次样条曲线将局部极大值点连成上包络线,将局部极小值点连成下包络线。上、下包络线包含所有的数据点。
步骤2:
由上包络和下包络线的平均值 ,得出
若满足IMF的条件,则可认为是的第一个IMF分量。
步骤3:
若不符合IMF条件,则将作为原始数据,重复步骤1、步骤2,得到上、下包络的均值,通过计算是否适合IMF分量的必备条件,若不满足,重复如上两步次,直到满足前提下得到。第1个IMF表示如下:
步骤4:
将从信号中分离得到:
将作为原始信号重复上述三个步骤,循环次,得到第二个IMF分量直到第个IMF分量 ,则会得出:
步骤5:
当变成单调函数后,剩余的成为残余分量。所有IMF分量和残余分量之和为原始信号:
用EMD进行滤波的基本思想是将原信号进行EMD分解后,只选取与特征信号相关的部分对信号进行重构。如下图中a部分为原始信号,b部分为将原始信号进行EMD分解获得的6个IMF分量和1个残余分量,c部分为将分解获得的6个IMF分量和1个残余分量进行重构后的信号,可以看出SSVEP信号用EMD分解后,基本上包含了原有信号的全部信息。
图片来源于[1]
python实现EMD案例
# 导入工具库import numpy as npfrom PyEMD import EMD, Visualisation
构建信号
时间t: 为0到1s,采样频率为100Hz,S为合成信号
# 构建信号t = np.arange(0,1, 0.01)S = 2*np.sin(2*np.pi*15*t) +4*np.sin(2*np.pi*10*t)*np.sin(2*np.pi*t*0.1)+np.sin(2*np.pi*5*t)
# 提取imfs和剩余信号resemd = EMD()emd.emd(S)imfs, res = emd.get_imfs_and_residue()# 绘制 IMFvis = Visualisation()vis.plot_imfs(imfs=imfs, residue=res, t=t, include_residue=True)
# 绘制并显示所有提供的IMF的瞬时频率vis.plot_instant_freq(t, imfs=imfs)vis.show()
参考
[1] 基于稳态视觉诱发电位的脑-机接口系统研究
往期精彩
Python-EEG工具库MNE-Python详细安装与使用
MNE中文教程(1)-MNE中数据结构Raw及其用法简介
Python-EEG工具库MNE中文教程(2)-MNE中数据结构Epoch及其创建方法
Python-EEG工具库MNE中文教程(3)-MNE中数据结构Epoch及其用法简介
Python-EEG工具库MNE中文教程(4)-MNE中数据结构Evoked及其对象创建
Python-EEG工具库MNE中文教程(5)-机器学习算法随机森林判断睡眠类型
Python-EEG工具库MNE中文教程(6)-读取.set文件和.locs文件
稳态视觉诱发电位 SSVEP 简介
Nilearn中的基本操作和查看
脑电信号滤波-代码实现
脑机接口BCI学习交流群:QQ群:903290195
微信群请扫码添加,Rose拉你进群
(请务必填写备注,eg. 脑机接口或BCI)
长按加群
长按关注我们