在脑电数据处理中滤波是很重要的一个步骤,直接影响后面的特征提取等计算流程。在之间写的博客中有过介绍(https://blog.csdn.net/zhoudapeng01/article/details/106124655),目前在脑电领域应用比较多的滤波方法有FIR,小波,以及STFT(短时傅里叶变换)等。这里主要对比MNE库提供的FIR滤波和STFT方法:

FIR滤波:FIR带通滤波在脑电数据处理中使用的非常多,其本质就是一个带通滤波器,主要用来分离不同频段的脑波数据,用于后续的数据处理工作。其在MNE库中有实现:https://blog.csdn.net/zhoudapeng01/article/details/106124655

STFT:短时傅里变换,是一种时频分析方法,网上有很多相关的介绍,其本质就是将信号按一个时间窗进行频率变换,然后堆叠在一起,可以参考下面的链接。

https://blog.csdn.net/yuelulu0629/article/details/76167229

https://zhuanlan.zhihu.com/p/150709566

博客对应的数据和代码:

https://download.csdn.net/download/zhoudapeng01/12751615

那FIR和STFT这两种方法的滤波效果有什么不同呢?下面分别对比下5种不同频段的滤波效果,代码如下。

# 短时傅里叶变换和FIR滤波效果对比import mne
import matplotlib.pyplot as plt
from scipy import signal, fft
import numpy as np
# 设置MNE库打印Log的级别
mne.set_log_level(False)
# 需要分析的频带及其范围
bandFreqs = [{'name': 'Delta', 'fmin': 1, 'fmax': 3},{'name': 'Theta', 'fmin': 4, 'fmax': 7},{'name': 'Alpha', 'fmin': 8, 'fmax': 13},{'name': 'Beta', 'fmin': 14, 'fmax': 31},{'name': 'Gamma', 'fmin': 31, 'fmax': 40}
]# 定义STFT函数
# epochsData:epochs的数据(mumpy格式)
# sfreq:采样频率
# band:频带类型
def STFT(epochsData, sfreq, band=bandFreqs):# 利用signal包进行STFT变换,f为频率,t为时间,Zxx为变换结果f, t, Zxx = signal.stft(epochsData, fs=sfreq)# 分频带保存STFT后的结果bandResult = []# 单独分析某一个频率范围for iter_freq in band:# 定位有效频率的索引index = np.where((iter_freq['fmin'] < f) & (f < iter_freq['fmax']))# 生成新的参数矩阵,初始化为复数元素为0portion = np.zeros(Zxx.shape, dtype=np.complex_)# 将有效频率赋值给新的参数矩阵portion[:, :, index, :] = Zxx[:, :, index, :]# 进行逆STFT变换,保留目标频率范围的信息_, xrec = signal.istft(portion, fs=sfreq)# 保存滤波后的结果bandResult.append(xrec)return bandResultif __name__ == '__main__':# 加载fif格式的数据epochs = mne.read_epochs(r'F:\BaiduNetdiskDownload\BCICompetition\BCICIV_2a_gdf\Train\Fif\A02T_epo.fif')# 绘图验证结果plt.figure(figsize=(15, 10))# 获取采样频率sfreq = epochs.info['sfreq']# 想要分析的目标频带bandIndex = 4# 想要分析的channelchannelIndex = 0# 想要分析的epochepochIndex = 0# 绘制原始数据plt.plot(epochs.get_data()[epochIndex][channelIndex], label='Raw')# 计算FIR滤波后的数据并绘图(注意这里要使用copy方法,否则会改变原始数据)firFilter = epochs.copy().filter(bandFreqs[bandIndex]['fmin'], bandFreqs[bandIndex]['fmax'])plt.plot(firFilter.get_data()[epochIndex][channelIndex], c=(1, 0, 0), label='FIR_Filter')# 计算STFT滤波后的数据并绘图stft = STFT(epochs.get_data(), sfreq)plt.plot(stft[bandIndex][epochIndex][channelIndex], c=(0, 1, 0), label='STFT_Filter')# 绘制图例和图名plt.legend()plt.title(bandFreqs[bandIndex]['name'])####################################FFT对比两种方法的频谱分布plt.figure(figsize=(15, 10))# 对FIR滤波后的数据进行FFT变换mneFIRFreq = np.abs(fft.fft(firFilter.get_data()[epochIndex][channelIndex]))# 对STFT滤波后的数据进行FFT变换,需要注意STFT变换后数据的点数可能会发生变化,这里截取数据保持一致性pointNum = epochs.get_data()[epochIndex][channelIndex].shape[0]stftFreq = np.abs(fft.fft(stft[bandIndex][epochIndex][channelIndex][:pointNum]))# 想要绘制的点数pointPlot = 500# FIR滤波后x轴对应的频率幅值范围FIR_X = np.linspace(0, sfreq/2, int(mneFIRFreq.shape[0]/2))# STFT滤波后x轴对应的频率幅值范围STFT_X = np.linspace(0, sfreq/2, int(stftFreq.shape[0]/2))# 绘制FIR滤波后的频谱分布plt.plot(FIR_X[:pointPlot], mneFIRFreq[:pointPlot], c=(1, 0, 0), label='FIR_Filter')# 绘制STFT滤波后的频谱分布plt.plot(STFT_X[:pointPlot], stftFreq[:pointPlot], c=(0, 1, 0), label='STFT_FIlter')# 绘制图例和图名plt.legend()plt.title(bandFreqs[bandIndex]['name'])plt.show()

注:STFT滤波后数据长度发生改变,这主要和窗长及计算方式有关,超出原始长度的数据可以不用关心,上面的代码中在进行频谱分析前,也就是计算FFT前对数据的长度进行了处理,这样可以保证分析出频谱数据的一致性。

FIR和STFT滤波在不同频段的效果对比

时域对比:从时域的滤波结果来看,FIR和STFT的趋势基本保持一致,只是其幅值会有些差别。

频域对比:从频谱分析的结果来看,STFT滤波后信号的频带分布范围更加准确,滤波后信号的频谱分布看起来更加符合预期,如下图所示,FIR滤波后的信号频谱分布较广,甚至超出了目标范围。

Delta频段(1Hz-3Hz)对应的结果

Theta频段(4Hz-7Hz)对应的结果

Alpha频段(8Hz-13Hz)对应的结果

Beta频段(14Hz-31Hz)对应的结果

Gamma频段(31Hz-40Hz)对应的结果

博客对应的数据和代码:

https://download.csdn.net/download/zhoudapeng01/12751615

Python中FIR滤波和STFT滤波对比(MNE脑电数据处理)相关推荐

  1. Python中FIR滤波和小波包滤波对比(MNE脑电数据处理)

    小波变换有信号显微镜之称,在EEG分析中也有广泛的应用,印象中小波算法是来源于地球物理解释的.之前有介绍过小波的一些资料和实现:https://blog.csdn.net/zhoudapeng01/a ...

  2. Python中的difflib模块(文本对比)

    Python中的difflib模块(文本对比) 1. difflib模块简介 2. difflib模块用法 3. 符号理解 4. 实现文本对比 5. linux文件之间的对比 1. difflib模块 ...

  3. 用MNE包进行Python脑电数据处理

    代码来自公众号"路同学". 这里仅仅把路同学总结的文档里面的代码挑出来了而已.为了方便想先试用一下MNE进行脑电预处理的友友. 这里加载的数据集是你的eeglab里面的sample ...

  4. python中字符编码的总结和对比_python2和python3差异总结

    项目马上就要由python2迁移到python3环境所有就简单总结下区别,个人觉得这些差不多,详情见如下吧 核心类差异 Python3 对 Unicode 字符的原生支持 Python2 中使用 AS ...

  5. python中显示第三行数据_Python从零开始第三章数据处理与分析①python中的dplyr(1)...

    前言 我经常使用R的dplyr软件包进行探索性数据分析和数据处理. dplyr除了提供一组可用于解决最常见数据操作问题的一致函数外,dplyr还允许用户使用管道函数编写优雅的可链接的数据操作代码. 现 ...

  6. Python专栏 | MNE脑电数据(EEG/MEG)可视化

    关注微信公众号:脑机接口研习社 了解脑机接口最近进展 系列文章目录 Python专栏 | 脑电图和脑磁图(EEG/MEG)的数据分析方法之载入数据 文章目录 系列文章目录 正文 总结 正文 MNE包的 ...

  7. Python 中MNE库去伪迹(ICA)

    脑电数据处理过程中如何去除伪迹是很重要的一个步骤,伪迹的处理主要包括眼电.心电.肌肉点以及工频干扰.实际处理过程中通过滤波0.5-45赫兹的带通滤波器可以去除掉大部分的噪音,在我接触到的实际脑电数数据 ...

  8. Python 中 MNE 读取EEG竞赛数据(gdf格式)

    最近在研究运动想象相关的算法,发现网上有一些公开的脑电数据,发现之前EEG还有这方面的竞赛,不知道为啥现在没有了,或许还有只不过我到目前还没找到,哈哈.前半部分都是说如何获取数据,后面才是标题的重点内 ...

  9. 【转发重要论文】顶中区N200: 一个中文视觉词汇识别特有的脑电反应

    2019独角兽企业重金招聘Python工程师标准>>> [转发重要论文]顶中区N200: 一个中文视觉词汇识别特有的脑电反应 话说原来一直在等<科学通报>网络版发布本论文 ...

最新文章

  1. LINUX CentOS7安装字体库
  2. pip 安装报错,is not a supported wheel on this platform
  3. 征信逾期了,5年后能自动消除吗?
  4. 学习搭建 Consul 服务发现与服务网格-有丰富的示例和图片
  5. Z-Stack Home Developer's Guide—8. Additional Information for HA Applications中文翻译
  6. ajaxpro定时刷新页面
  7. 多个ajaxFileUpload上传图片与ajax合用,解决同步问题,用户随意上传多少图片都可以;
  8. 2019年3月1日-日记
  9. 给对象添加属性和给对象原型添加属性的区别
  10. Ubuntu10.04下载并编译Android4.3源代码
  11. 深入理解jQuery插件开发(讲解jQuery开发的好文)
  12. Windows 2003网络负载均衡的实现
  13. win10 linux声音,win10电脑突然没有声音的10种修复方法
  14. JavaWeb学习篇8_用户登录、信息的增删改查、复杂功能小项目(Servlet、JSP、MySQL、JDBCTemplete、Durid、BeanUtils、tomcat、EL、JSTL)
  15. 谈一谈软件系统的可用性
  16. wegame显示密保服务器,wegame英雄联盟设置 | 手游网游页游攻略大全
  17. 爱情就是一物降一物——金庸教你谈恋爱
  18. 计算机保存的快捷方式,保存快捷键ctrl加什么
  19. 查看显卡型号命令_如何查看电脑显卡型号配置 快速查看显卡配置信息方法
  20. excel数据库_Excel再厉害的高手,也敌不过Access数据库的新手

热门文章

  1. Java面向对象编程-枚举类
  2. Spark操作外部数据源(RDBMS,Hive,HBase,Parquet)
  3. base64图片转换file,并上传到阿里云
  4. 模块化多电平变换器MMC两种调制策略实现(交流3000V-直流5000V整流)仿真,单桥臂二十子模块
  5. 企业定制crm客户管理系统需要做哪些准备?
  6. Docker知识五:服务编排(Docker Compose概念)
  7. SPOJ AMR12E Dyslexic Gollum 解题报告
  8. GitHub学生认证,可以愉快的使用Copilot了
  9. 嘟嘟早教卡小程序源码/带后台API管理系统源码
  10. k米魔云8服务器系统在哪购买,线上KTV“K米·魔云6”上市发布会在贵州举行