脑电数据处理分析——edf转mat及fft
声明:参考来源:https://zhuanlan.zhihu.com/p/34410111
生理信号数据常用的格式为edf,而matlab常用的是mat,txt。
如果已经在数据库里下载了edf格式的数据。不妨先了解下EDF格式具体内容:
HEADER RECORD
8 ascii : 数据格式的版本
80 ascii : 被试ID
80 ascii : 数据记录编号
8 ascii : 开始记录的日期 (dd.mm.yy)
8 ascii : 开始记录的时间 (hh.mm.ss)
8 ascii : 头比特数
44 ascii :保留给EDF+
8 ascii : 初始值-1,结束时被赋其他值
8 ascii : 数据持续记录时间,s
4 ascii : 记录几种信号种类
ns * 16 ascii : 电极位置,体温等信息
ns * 80 ascii : 电极信息
ns * 8 ascii : ns * 幅值单位信息
ns * 8 ascii : ns * physical minimum (e.g. -500 or 34)
ns * 8 ascii : ns * physical maximum (e.g. 500 or 40)
ns * 8 ascii : ns * digital minimum (e.g. -2048)
ns * 8 ascii : ns * digital maximum (e.g. 2047)
ns * 80 ascii : 滤波器参数
ns * 8 ascii : 采样率
ns * 32 ascii : 采集信号类型
DATA RECORD
nr of samples[1] * integer : first signal in the data record
nr of samples[2] * integer : second signal
..
nr of samples[ns] * integer : last signal
我们将matlab官方提供的读edf头文件的脚本跑一下:看看是否像如上格式
[header,~] = edfread('Subject00_1.edf')
“edfRead ” version 2.10 (7.44 KB) by Brett Shoelson:
(温馨提醒:为保证后续阅读,手机用户长按松开拷贝地址到浏览器打开为宜)
http://cn.mathworks.com/matlabcentral/fileexchange/31900-edfread
下载代码,命令行运行结果如下:
我的数据结果:
符合翻译的Header的格式。
帧头之后就是数据。
这里原始数据我用了网上的另一个代码:因为他支持的格式更全,支持edf,rec转mat。
用的是 Alois Schloegl 的脚本。(点击下载源码)
https://files.cnblogs.com/files/myohao/edfsample.zip
mathworks官网也给出了列子:https://ww2.mathworks.cn/matlabcentral/fileexchange/31900-edfread?s_tid=prof_contriblnk
直接运行代码取变量S的前三列,即EDF数据前三通道的脑电数据,画出结果如下:
recorddata = recorddata';
%转置数据,一列为一个通道,采集的数据太长,只展示2000点
plot(recorddata(1:2000,1:3));
将工作区的变量S右键,数据另存为导出为txt。好了有了我们最熟悉的txt格式,接下来选出想分析的通道(列)进行分析就可以了。
(我的数据为一行代表一个通道)
接下来我们跑个简单的算法:FFT分析睡眠数据,我们提取出不同的节律,也就是不同的频段,进行功率谱估计。
以下是四种节律:
α/阿尔法脑波(ALPHA)在大脑中有时出现,有时消失,它并不总是存在。例如,在深睡情况下没有α波;如果一个人在激动状态下,或恐惧,愤怒时,大脑中也没有α脑波。α脑波在初睡或初醒时出现(即半睡半醒时),此时身体处于放松状态,并有自觉的警觉意识。
δ/德尔塔脑波(DELTA)只在深睡时出现。
θ/西塔脑波(THETA)在浅睡时出现。
β/贝塔脑波(BETA)在清醒时出现,伴有需努力能够达到的注意力集中。
不懂傅里叶变换原理的先来这里:最通俗的讲解传送门:
https://zhuanlan.zhihu.com/p/19759362
Matlab下FFT实现代码实例:
https://cn.mathworks.com/help/matlab/ref/fft.html?searchHighlight=FFT&s_tid=doc_srchtitle
由于添加了噪声,fft之后的数据强度接近0.5和1,但不完全相等
%fft部分实验,生成带噪声的数据,fft变换,再反变换回时域数据
%Y = fft(X,n)如果 X 是矩阵,则 fft(X) 将 X 的各列视为向量,并返回每列的傅里叶变换。
%fft的官方解释https://ww2.mathworks.cn/help/matlab/ref/fft.html?searchHighlight=FFT&s_tid=doc_srchtitle
Fs = 500; % Sampling frequency
T = 1/Fs; % Sampling period
L = length(recorddata(:,1)); % Length of signal
t = (0:L-1)*T; % Time vector
%构造一个信号,其中包含幅值为 0.7 的 50 Hz 正弦量和幅值为 1 的 120 Hz 正弦量。
S = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t);
%用均值为零、方差为 4 的白噪声扰乱该信号。
X = S + 2*randn(size(t));
%在时域中绘制含噪信号。通过查看信号 X(t) 很难确定频率分量。
figure; plot(1000*t(1:50),X(1:50))
title('Signal Corrupted with Zero-Mean Random Noise');
xlabel('t (milliseconds)');
ylabel('X(t)');
%%
%计算信号的傅里叶变换。
Y = fft(X);
%计算双侧频谱 P2。然后基于 P2 和偶数信号长度 L 计算单侧频谱 P1。
P2 = abs(Y/L);
P1 = P2(1:L/2+1);%计算单侧频率
P1(2:end-1) = 2*P1(2:end-1);
%定义频域 f 并绘制单侧幅值频谱 P1。与预期相符,由于增加了噪声,幅值并不精确等于 0.7 和 1。一般情况下,较长的信号会产生更好的频率近似值。
f = Fs*(0:(L/2))/L;
figure; plot(f,P1)
title('Single-Sided Amplitude Spectrum of X(t)')
xlabel('f (Hz)')
ylabel('|P1(f)|')%%
%现在,采用原始的、未破坏信号的傅里叶变换并检索精确幅值 0.7 和 1.0。
Y = fft(S);
P2 = abs(Y/L);
P1 = P2(1:L/2+1);
P1(2:end-1) = 2*P1(2:end-1);figure; plot(f,P1)
title('Single-Sided Amplitude Spectrum of S(t)')
xlabel('f (Hz)')
ylabel('|P1(f)|')
有了FFT的函数,在主函数中调用,分割不同频率,分割不同时间,就得到需要的图片了。比如,我想得到10s-150s的θ/西塔脑波(THETA)值。部分源码在这:
http://www.cnblogs.com/myohao/p/8539001.html
测试结果如下
符合截取区间。
附:
主要的心电数据库:https://www.cnblogs.com/myohao/p/8538740.html
edf转txt, mat:https://files.cnblogs.com/files/myohao/edfsample.zip
上面没有给出来中间fft的过程,摸索一下再来补充~
脑电数据处理分析——edf转mat及fft相关推荐
- Analyzer脑电数据处理步骤
Analyzer脑电数据处理步骤 1 简化版流程 2 详细版流程 2.1 设置数据路径的workspace 2.2 转换参考(New Reference 2.3 滤波(Filters) 2.4 ICA ...
- Python中FIR滤波和STFT滤波对比(MNE脑电数据处理)
在脑电数据处理中滤波是很重要的一个步骤,直接影响后面的特征提取等计算流程.在之间写的博客中有过介绍(https://blog.csdn.net/zhoudapeng01/article/details ...
- CHB-MIT波士顿儿童医院癫痫EEG脑电数据处理-癫痫发作预测(六)
CHB-MIT波士顿儿童医院癫痫EEG脑电数据处理-癫痫发作预测(六) 导入需要的包 各功能模块 数据集导入 模型训练 训练结果 保存模型 测试结果 导入需要的包 import numpy as np ...
- CHB-MIT波士顿儿童医院癫痫EEG脑电数据处理-通道选择(五)
CHB-MIT波士顿儿童医院癫痫EEG脑电数据处理-通道选择(五) 概述 通道选择模型 通道选择 LightGBM模块代码 LightGBM模型训练 概述 由于癫痫发作时不是整个大脑区域都有相关的反映 ...
- 数据分析实战<一>脑电(EEG)分析
这两天需要对预实验的脑电进行一个分类,在这里记录一下流程 脑电分析系列文章 mne官网 mne教程 随机森林分类 Python 多因素方差分析 文章目录 1. 脑电数据的处理 1.1 基本概念 1.2 ...
- 茗创:脑电数据处理业务
文章来源于微信公众号(茗创科技),欢迎有兴趣的朋友搜索关注. 01 数据预处理 好的数据质量是获得可靠结果的前提,而预处理的质量往往对后处理的结果存在一定的影响.脑电的数据对噪音的敏感性很强,为了提高 ...
- 用MNE包进行Python脑电数据处理
代码来自公众号"路同学". 这里仅仅把路同学总结的文档里面的代码挑出来了而已.为了方便想先试用一下MNE进行脑电预处理的友友. 这里加载的数据集是你的eeglab里面的sample ...
- 脑电溯源分析/源定位 EEG source analysis / Localization
脑电溯源定位,即脑电逆向问题,是根据头表记录到的电位信号,反向推算出估计的脑内神经活动源的位置.方向和强度信息. 参考链接:脑电溯源定位 本质上,脑电逆问题是非线性优化问题,考虑到计算的复杂性,因而近 ...
- CHB-MIT波士顿儿童医院癫痫EEG脑电数据处理-2D-CNN(四)
主要内容 1.数据提取 2.提取过程 1.数据提取 本次教程做适用于整体数据集上的处理工作,以不同的的处理代码展示整体的数据处理! 本次数据处理教程是没有做STFT变换,之间将提取的数据变换为适合2D ...
最新文章
- 微信同步通讯录服务器繁忙,企业微信同步通讯录时提示 mobile existed
- 在Centos中安装aria2c
- 请输入有效值,两个最接近的有效值分别为1和2.
- 两个listmap合并去重_我是如何用单机实现亿级规模题库去重的?
- 牛客多校10 - Tournament(找规律)
- AdaBoost 算法 入门
- NLP情感分析笔记(三):Faster 情感分析
- (并查集)~APTX4869(fzu 2233)
- 基于stc15f2k60s2芯片单片机编程(呼吸灯)
- 《开源公开课分享》:Java开源框架案例分享
- ubuntu wps安装
- U盘量产U盘扩容和U盘芯片检测
- 基于YYLabel的图文混排
- “死扛”高并发大流量,大麦抢票的技术涅槃之路
- win7 计算机设置命令,Win7设置开机启动项命令的方法
- Multi-Armed Bandits
- 深圳人行推出企业信用报告网银查询渠道
- 预测二手车的交易价格
- 羊吃草--二分图匹配
- SOPHP免费稳定的微信公众号开源框架
热门文章
- 微信小程序获取收货地址及存储收货地址
- 中兴ZTEWCDMA3G模块MF206
- 综合布线系统中直接与用户终端设备相连的子系统是什么呢?
- 15:Named Entity Recognition without Labelled Data: A Weak Supervision Approach
- 基于神经网络——鸢尾花识别(Iris)
- 虚拟现实产业发展白皮书(2019年)发布
- java毕业设计家居体验平台的设计与实现Mybatis+系统+数据库+调试部署
- led灯串怎么摆造型_用灯带设计的造型图片
- micropython中文社区 microbit_UpyCraft-micropython: 让Microbit发声
- A Verifiable Secret Shuffle of Homomorphic Encryptions学习笔记