脑电EDF数据文件读取+截取+保存(写入)操作

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:本笔记主要做个人学习记录用:

本笔记主要记录了利用Matlab对EDF数据进行读取、截取、保存的操作,适用于版本Matlab2022a以上的(Maybe,有自带的 edfread() 和 edfwrite() 函数都可以,博主的版本是2022a)。


提示:以下是本篇文章正文内容,下面案例可供参考

一、EDF数据文件是什么?

EDF 的全称是 European Data Format,即欧洲数据格式。它是一种标准化的、开放的文件格式,专门用于存储和交换多通道生物信号数据。EDF是脑电研究和技术中最基础、最常用的文件格式之一,它以一种标准化的方式将多通道的脑电压信号和相关的记录信息打包在一起。

此外EDF数据文件不仅用于保存脑电,还有心电、眼电、肌电、呼吸、血氧等多种生理信号,多余的不在这里赘述,deepseek讲解比我更细致。能找到这篇帖子的也不是来看这些基础只是的科普的,直接上代码!!

二、代码示例

代码如下(示例):

%% 读取数据并保存为edf文件
clear all;
close all;
clc;
fclose('all');

Readfilename = "...\xxx.edf";
Savefilename = "...\xxxAfter.edf";

[Outdata, annotations] = edfread(Readfilename);		% 这里读取出来的是timetable类型的数据
InData = Outdata(end-60*10+1:end, :);         % 截取最后10分钟

First5Min = InData(end-60*10+1:end-60*5, :);	% 最后10分钟的前5min
Last5Min = InData(end-60*5+1:end, :);				% 最后10分钟的后5min

info = edfinfo(Readfilename);   
%%%% 没有头文件的时候edfinfo可读取出来需要的头文件的信息

First5Min2 = table2cell(Last5Min);
First5Min3 = cell2mat(First5Min2);		% 这里主要是为了转成矩阵,好在edfwrite的时候使用,因为只支持输入矩阵信号

% 物理值转换为数字值
digital_values = (First5Min3' - info.PhysicalMin) .* ...
    (info.DigitalMax - info.DigitalMin) ./ ...
    (info.PhysicalMax - info.PhysicalMin) + ...
    info.DigitalMin;
% 一定要这样做转换,不然后续edfwrite写入的时候,会自动内部做逆向转化(数字值转化为物理值),导致保存的数据结果不一致

digital_values = digital_values';

%% 头文件的信息
fs = 1024; % 请根据实际情况调整采样率
% 手动创建header结构体
numChannels = size(First5Min2, 2);
hdr = edfheader("EDF+");
hdr.NumDataRecords = 5*60;         % 记录时间改为300s
hdr.DataRecordDuration = seconds(size(First5Min2, 1));
hdr.NumSignals = 63;
hdr.SignalLabels = info.SignalLabels;
hdr.PhysicalDimensions = info.PhysicalDimensions;   % 单位:uV
hdr.PhysicalMin = info.PhysicalMin;
hdr.PhysicalMax = info.PhysicalMax;
hdr.DigitalMin = info.DigitalMin;     % 数字采样值必须 ≥ 对应信号的最小值,向下取整防止超过头文件中的字节限制
hdr.DigitalMax = info.DigitalMax;     % 数字采样值必须 ≤ 对应信号的最大值,向上取整防止超过头文件中的字节限制
% hdr.DigitalMin = floor(min(First5Min3));     % 数字采样值必须 ≥ 对应信号的最小值,向下取整防止超过头文件中的字节限制
% hdr.DigitalMax = ceil(max(First5Min3));     % 数字采样值必须 ≤ 对应信号的最大值,向上取整防止超过头文件中的字节限制

edfw = edfwrite(Savefilename,hdr,digital_values);

%% 重新读取出来进行验证
[Outdata222, annotations222] = edfread(Savefilename);
First5Min222 = table2cell(Outdata222);
First5Min333 = cell2mat(First5Min222);
info222 = edfinfo(Savefilename);   

% 物理值转换为数字值
First5Min444 = (First5Min333' - info222.PhysicalMin) .* ...
    (info222.DigitalMax - info222.DigitalMin) ./ ...
    (info222.PhysicalMax - info222.PhysicalMin) + ...
    info222.DigitalMin;

First5Min444 = First5Min444';
%%%% 验证信号结果完全一致

可以自己画图看信号,应该是一致的,如果出现了保存后的信号和原本的信号幅度不一致的问题,大概率是 Physical 或者 Digital 的 Max Min 值错了,或者是你忘记做上面的【% 物理值转换为数字值】的部分了,重新核对后应该能解决问题。


总结

主要是作为自己学习记录使用,各位可以拿去使用,能帮到大家就更好了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值