c++ edf文件的读取与存储

EDF文件简介

EDF,全称是 European Data Format,是一种标准文件格式,用于交换和存储医疗时间序列。
该格式文件能够存储多通道的数据,允许每个信号拥有不同的采样频率。
在内部,它包括标题和一个或多个数据记录。标题包含一些一般信息(患者标识,开始时间…等等)以及每个信号的技术规格(校准,采样率,过滤,…等等),编码为 ASCII 字符。数据记录包含小端 16 位整数的样本。因此,EDF 也是多导睡眠图(PSG)录音的流行格式。

读取EDF软件推荐与资源

读取edf文件有Polyman和EDFbrowser等,我个人使用过程中感觉Polyman识别起来比较合适,edfbrowser对头信息的检测比较严格导致识别部分不规范的文件时会失败,不过edfbrower对于其他格式转edf比较方便。然后edfbrower读取多个文件时显示会不正常,一次只能读取一个edf文件。 用这两个文件的读取结果可以和自己读取的比较一下看是否正确读取波形。

edf文件头信息简介

参考这个网址吧https://www.edfplus.info/specs/edfplus.html 就是开头一个0,然后后面是时间以及受试人的一些信息什么的

edf文件读取

#include "edflib.h" //首先我们需要导入工具包
//我这里用了一个opendialog来读取路径名打开文件,也可以直接输入固定路径
OpenDialog->Title = "数据文件";
OpenDialog->Filter ="bdf files bdf|*.bdf|rec|*.rec|edf|*.edf";
OpenDialog->DefaultExt = "bdf";
if ( OpenDialog->Execute() == true )
  {
	NewFileName = OpenDialog->FileName;
	//这里是文件句柄,edf_struct这是用来存储数据信息的自定义类型, EDFLIB_DO_NOT_READ_ANNOTATIONS这里是读取注释的模式,0是不读取,1是读到结束事件(注释),2是读取全部注释。具体的定义如下
/*#define EDFLIB_DO_NOT_READ_ANNOTATIONS 0
#define EDFLIB_READ_ANNOTATIONS        1
#define EDFLIB_READ_ALL_ANNOTATIONS    2*/
	fp = edfopen_file_readonly(NewFileName.c_str(), &edf_struct, EDFLIB_DO_NOT_READ_ANNOTATIONS);
SampleFrequency =  edf_struct.signalparam[0].smp_in_datarecord/(edf_struct.datarecord_duration/10000000);//读取采样率
edfread_physical_samples(fp, i, DataLength, ReadBlock[i]);//读取第i导中datalength长度的数据到readblock数组
  }

edf文件存储

fp = edfopen_file_writeonly (NewFileName.c_str(), EDFLIB_FILETYPE_BDFPLUS , 8);   //8 代表8导  
edf_blockwrite_physical_samples(fp, SaveArray );//自动按照12345678导存储数据
edf_set_samplefrequency(fp, i, SampleFrequency);//设置采样率
edf_set_physical_maximum(fp, i, 2500000);//设置物理最大值
edf_set_physical_minimum(fp, i, -2500000);//设置物理最小值
edf_set_digital_maximum(fp, i, 8388607);//设置最大值
edf_set_digital_minimum(fp, i, -8388608);//设置最小值
edf_set_datarecord_duration(fp, 10000000);   //这句可以不要 默认1秒     10000000
edf_set_label(fp, 0, "GSR");//设置对应导的label
edfclose_file(fp);//存完记得关闭
int edfwrite_physical_samples(int handle, double *buf);

/* Writes n physical samples (uV, mA, Ohm) from *buf belonging to one signal */
/* where n is the samplefrequency of that signal. */
/* The physical samples will be converted to digital samples using the */
/* values of physical maximum, physical minimum, digital maximum and digital minimum */
/* The number of samples written is equal to the samplefrequency of the signal */
/* Size of buf should be equal to or bigger than sizeof(double[samplefrequency]) */
/* Call this function for every signal in the file. The order is important! */
/* When there are 4 signals in the file,  the order of calling this function */
/* must be: signal 0, signal 1, signal 2, signal 3, signal 0, signal 1, signal 2, etc. */
/* Returns 0 on success, otherwise -1 */
//这个是一导一导存储的,调用时第一次就是存储到0导第二次就是存储到1导,满了以后就又从0导开始一次写入n个(n是采样频率大小)

采样频率,也称为采样速度或者采样率,定义了每秒从连续信号中提取并组成离散信号的采样个数,它用赫兹(Hz)来表示。
采样频率的倒数是采样周期或者叫作采样时间,它是采样之间的时间间隔。
通俗的讲采样频率是指计算机每秒钟采集多少个信号样本

这里就是简单介绍一下,其他的用法和属性比较多久不赘述了。

你可能感兴趣的:(c++ edf文件的读取与存储)