保存转换后的 .bdf 文件
Posted
技术标签:
【中文标题】保存转换后的 .bdf 文件【英文标题】:Saving a transformed .bdf file 【发布时间】:2016-04-09 10:58:33 【问题描述】:我使用 MATLAB R2011b 和 EEGLab 13.4.3b 加载了包含多个虚假触发器的 Biosemi .bdf 文件(EEG 记录)。触发器的位置存储在header.BDF.Trigger.POS
,触发器类型存储在header.BDF.Trigger.TYP
。
加载 the file 后:
header = sopen('05-AM-200-Deci.bdf','r',[1:40],'OVERFLOWDETECTION:OFF');
我对@987654330@ 和header.BDF.Trigger.TYP
向量进行了转换并替换了它们。
注意:这些转换不应该产生影响,因为即使我只加载 bdf 文件然后尝试将其保存回来,我也会得到完全相同的错误。
这是header
的结构(用get()
提取):
header =
FileName: '05-AM-200-Deci.bdf'
FILE: [1x1 struct]
TYPE: 'BDF'
ErrNum: [1025 0]
ErrMsg: ''
keycode: [1x34 double]
NS: 41
SampleRate: 1
T0: [2015 7 6 17 41 44]
Filter: [1x1 struct]
FLAG: [1x1 struct]
EVENT: [1x1 struct]
VERSION: -1
Patient: [1x1 struct]
PID: '05-AM-200'
RID: '05-AM-200'
HeadLen: 10752
reserved1: '24BIT '
NRec: 1207
Dur: 1
AS: [1x1 struct]
Label: 41x1 cell
Transducer: 41x1 cell
PhysDim: 41x1 cell
PhysMin: [1x41 double]
PhysMax: [1x41 double]
DigMin: [1x41 double]
DigMax: [1x41 double]
PreFilt: [41x80 char]
GDFTYP: [1x41 double]
SPR: 1
THRESHOLD: [41x2 double]
Cal: [1x41 double]
Off: [1x41 double]
Calib: [41x40 double]
BDF: [1x1 struct]
PhysDimCode: [41x1 double]
ELEC: [1x1 struct]
LeadIdCode: [41x1 double]
CHANTYP: ' '
InChanSelect: [40x1 double]
我尝试使用 EEGLab 函数保存转换后的文件 (header
) 无济于事。我知道如何使用 GUI 在 EEGLab 中保存 bdf 文件。但是,使用 GUI 不允许进行我需要的转换。
为了保存文件,我尝试使用pop_writeeeg()
和swrite()
,但它们都不起作用。
我使用了以下命令:
第一次拍摄:
`pop_writeeeg(header);`
返回:
Reference to non-existent field 'trials'.
Error in pop_writeeeg (line 38)
if EEG.trials > 1
然后我尝试了:
`pop_writeeeg(header, '05-new', 'TYPE', 'BDF');`
返回:
Reference to non-existent field 'chanlocs'.
Error in pop_writeeeg (line 66)
if ~isempty(EEG.chanlocs)
我的下一个想法是通过以下方式使用swrite()
:
`swrite(header, '05-new');`
返回:
Error SWRITE can not be applied, File 05-AM-200-Deci.bdf is not opened in WRITE mode
我很确定我在这里遗漏了一些简单的东西。
有谁知道如何将转换后的 EEG (bdf) 数据保存回 bdf 文件?
【问题讨论】:
请在 EEGLAB 版本中包含 link 以帮助人们解决您的问题,以及指向给您带来问题的 .bdf 文件的链接以及应用转换的代码。没有这些信息几乎无法帮助您。 不能只保存表头,需要包含数据。实际上语法是ssave(HDR,data)
或swrite(HDR,data)
我已经添加了 EEGLab 的链接,今晚将添加 bdf 文件。我假设数据是 bdf 文件中标题的一部分。不是这样吗?
不,通常任何数据集格式都会有一个描述数据和实际数据的标题。在您的情况下,eeg
数据集可以是单个变量,应包含标题和数据。
浏览文档,HDR = sopen(HDR, 'w');
允许您编写标题并引用一些demo3.m
文件。您可能想阅读文件的帮助和此演示。
【参考方案1】:
EEGLAB 工具箱不包含您需要的功能;你想要Biosig toolbox(它是 EEGLAB 的插件)。 Biosig 函数的范例是不寻常的。它使用带有文件句柄的数据结构。因此,要打开文件并保存修改后的数据,您需要执行以下步骤:
1) 打开 BDF 文件并读入数据。此步骤检索文件元数据并创建元数据结构(如问题所示)。
[raw_data,meta_data] = sload('05-AM-200-Deci.bdf',[1:40],'OVERFLOWDETECTION:OFF');
2) 即使转换仅涉及元数据,您也必须使用原始数据和元数据重新写入文件。您的数据必须位于大小为 Rows x Number_of_Channels 的变量中。根据 .bdf 文件的功能,您可能需要添加一个表示状态通道的附加列。
% do the transforms here. If it does not affect the raw data, no need to change variables.
transformed_data = raw_data; % transformed data to be saved to a file
meta_data.fZ = zeros([1 meta_data.NS]);
transformed_data(:,meta_data.NS)=0;
3) 打开文件写入警告:这将擦除磁盘上的文件
meta_data = sopen(meta_data,'w');
4) 将数据保存到文件中:
swrite(meta_data,transformed_data);
5) 关闭文件:
sclose(meta_data);
我使用here 提供的测试文件对此进行了测试。 BDF 格式较旧并且有很多选项,因此在此脚本中有一个额外的步骤来填写“状态”通道(通道 17),以使其与 Biosig 函数一起使用。
[s,hdr] = sload('Newtest17-2048.bdf'); % get the raw data from the file
hdr.fZ = zeros([1 hdr.NS]); s(:,hdr.NS)=0; % (create "missing" channel values)
hdr = sopen(hdr,'w'); % open the file for writing (ERASES FILE!)
swrite(hdr,s); % write data to the file
sclose(hdr); % close the file
问题中链接的 .bdf 文件也需要“丢失频道”的破解。
【讨论】:
感谢您指出应该使用sclose()
。我尝试将 bdf 文件(问题中的链接)加载到 myFileRef
和 transformed_data
(1.、2. 和 3.)中。 4) 返回错误Warning SOPEN: HDR.PhysDimCode of the following channel(s) is(are) not defined: 41 Error SOPEN (GDF/EDF/BDF)-W: PhysMin(41) does not fit into header
但它删除了文件。 5) 返回Undefined function 'minus' for input arguments of type 'struct'. Error in swrite (line 38) data = data - repmat(HDR.PhysMin(:)',size(data,1),1);
我上面给出的示例脚本适用于您的示例文件,如果您包括为额外通道添加一些填充行的“使其工作”步骤,例如在示例中。用您的文件替换测试文件名并使用 41 而不是 17(额外通道),看看它是否适合您。我仍然看到有关 PhysMin(41) 的错误,但数据被写入文件。
我已经完全按照你昨天的建议做了,但得到了错误。我认为文件没有保存(但今晚会检查)。
使用来自biosemi 的示例文件查看它是否也适用于您的系统。
sload()
有必要吗?您没有将它包含在代码的第一部分中。您提供的代码与 Biosemi 网站上的 bdf 文件一起工作(尽管它显示错误)(但保存一个空文件)。当我尝试在另一台机器上运行 Biosemi 代码时,我得到了一个 error :/以上是关于保存转换后的 .bdf 文件的主要内容,如果未能解决你的问题,请参考以下文章
怎么将高版本的CAD转换器转换成低版本,并将转换后的文件保存为电脑桌面?