保存转换后的 .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'); 

我对@9​​87654330@ 和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 文件(问题中的链接)加载到 myFileReftransformed_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 文件的主要内容,如果未能解决你的问题,请参考以下文章

FPGA如何将.bdf文件转换成.v文件

怎么将高版本的CAD转换器转换成低版本,并将转换后的文件保存为电脑桌面?

如何在ModelSim中仿真Quartus的bdf文件和IP核

txt文件如何转成pdf文件

怎么将html转换为pdf

如何在python中保存修剪后的波形文件?