理解并掌握EMD算法:原理与实践
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 np
from 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和剩余信号res
emd = EMD()
emd.emd(S)
imfs, res = emd.get_imfs_and_residue()
# 绘制 IMF
vis = Visualisation()
vis.plot_imfs(imfs=imfs, residue=res, t=t, include_residue=True)
# 绘制并显示所有提供的IMF的瞬时频率
vis.plot_instant_freq(t, imfs=imfs)
vis.show()
参考
[1] 基于稳态视觉诱发电位的脑-机接口系统研究
推荐阅读
-
理解并掌握LVS/DR模式(直接路由模式)的实现原理与操作步骤
-
理解并掌握 LINQ 的推导与原理
-
理解并掌握EMD算法:原理与实践
-
【2022新手指南】Java编程进阶之路 - 六、技术架构篇 ### MySQL索引底层解析与优化实战 - 你会讲解MySQL索引的数据结构吗?性能调优技巧知多少? - Redis深度揭秘:你知道多少?从基础到哨兵、主从复制全梳理 - Redis持久化及哨兵模式详解,还有集群搭建和Leader选举黑箱打开 - Zookeeper是个啥?特性和应用场景大公开 - ZooKeeper集群搭建攻略及 Leader选举、读写一致性、共享锁实现细节 - 探究ZooKeeper中的Leader选举机制及其在分布式环境中的作用 - Zab协议深入剖析:原理、功能与在Zookeeper中的核心地位 - RabbitMQ全方位解读:工作模式、消费限流、可靠投递与配置策略 - 设计者视角:RabbitMQ过期时间、死信队列与延时队列实践指南 - RocketMQ特性和应用场景揭示:理解其精髓与差异化优势 - Kafka详细介绍:特性及广泛应用于实时数据处理的场景解析 - ElasticSearch实力揭秘:特性概述与作为搜索引擎的广泛应用 - MongoDB认知升级:非关系型数据库的优势阐述,安装与使用实战教学 - BIO/NIO/AIO网络模型对比:掌握它们的区别与在网络编程中的实际应用 - Netty带你飞:理解其超快速度背后的秘密,包括线程模型分析 - 网络通信黑科技:Netty编解码原理与常用编解码器的应用,Protostuff实战演示 - 解密Netty粘包与拆包现象,怎样有效应对这一常见问题 - 自定义Netty心跳检测机制,轻松调整检测间隔时间的艺术 - Dubbo轻骑兵介绍:核心特性概览,服务降级实战与其实现益处 - Dubbo三大神器解读:本地存根与本地伪装的实战运用与优势呈现 ----------------------- 七、结语与回顾
-
三步阅读法详解:第三次阅读 - 消化与转化篇。深入研读后,我们领略了书籍精华,但关键在于将这些精彩之处内化为个人的知识。为了真正吸收并掌握,第三次阅读需聚焦于思考:书中知识如何能应用到自己生活或工作中?又该如何从不同角度实施?通过实践应用,进一步深化对原作的理解和领悟。
-
理解并掌握C++中的内存操控与内存工作原理
-
从入门到精通:彻底理解并实践Logback日志框架——原理解析与实战教程之二(轻松易懂版)
-
详解常见图像滤波算法的实践操作与原理解析
-
《编译原理》:理解终结符与非终结符的判断方法与技巧 重新表述: 本文将向你介绍《编译原理》中关于终结符与非终结符的相关概念及其应用。 首先,我们将解释什么是终结符和非终结符,并通过具体的例子来帮助你更好地理解它们的区别和联系。 其次,我们还会分享一些实用的方法和技巧,以便你在学习和实践过程中更加高效地运用这些概念。 最后,我们将会讨论如何通过识别符号开始,逐步将非终结符替换为相应的规则右部的符号串,最终得到一个只包含终结符的句子。 希望这篇文章能对你有所帮助,让你在学习编译原理的过程中取得更好的进展。