从 .rec 二进制文件中检索数据

Retrieve data from .rec binary file

这个问题可能很幼稚,但答案可以帮助我。

测量值以二进制格式记录,header 包含有关数据和数据本身的所有信息(即一系列双精度数)。

测量数据可以从应用程序导出为csv格式,但需要很长时间。

尝试从二进制文件中读取数据时需要注意什么?这个过程甚至可以使用 Matlab 导入为数组或 labview(导出为 .txt 可能吗?)

二进制.rec文件格式可能指的是各种东西(audio/videoTopfield基于MPEG4-TS的编码格式,专有的音频编码,甚至是Phillips的MRI扫描仪)...

如果它指的是 MRI 扫描仪,您可能会在文件交换上找到一些直接的 reader:Matlab PAR REC Reader

如果引用其他内容,您可以使用低级例程自行解析二进制文件header和数据:fread

编辑

不知道记录的传感器位移的确切文件格式,这里是使用 fread 读取大型记录文件的虚拟示例 block-by-block 假设 header 仅包含数据长度,并且该数据是只是一系列双精度值:

function [] = DummyReadRec()
%[
    % Open rec file for reading
    [fid, errmsg] = fopen('dummy.rec', 'r');
    if (fid < 0), error(errmsg); end
    cuo = onCleanup(@()fclose(fid));

    % Read header (here supposing it is only an integer giving length of data)
    reclenght = fread(fid, 1, 'uint32');

    % Read data block-by-block (here supposing it is only double values)
    MAX_BLOCK_LENGTH = 512;
    blockCount = ceil(reclenght / MAX_BLOCK_LENGTH);
    for bi = 1:blockCount,

        % Will read a maximum of 'MAX_BLOCK_LENGTH' (or less if we're on the last block) 
        [recdata, siz] = fread(fid, [1 MAX_BLOCK_LENGTH], 'double');

        % Do something with this block (fft or whatever)
        offset = (bi-1)*MAX_BLOCK_LENGTH;
        position = (offset+1):(offset+siz);
        plot(position, 20*log10(abs(fft(recdata))));
        drawnow();

    end
%]
end   

答案将取决于二进制文件的格式及其大小。

我对各种布局不同的二进制文件进行了多次转换。如果文件适合内存,那么只要知道二进制文件的布局,就可以使用 fread。下面是一个读取 header & 简单数据块的例子。它当然必须根据文件的布局进行修改。根据录音设备和计算机类型的不同,您可能还需要使用 fread 的 machinefmt('ieee-le' 或 'ieee-be')选项 ... 以前让我很头疼。

%Open the File for reading
fid = fopen(yourRECfile,'r');

%Read the  Header  ... your layout will be different
header.MajorRel  = fread(fid,1,'uint16'); %Major File Rev #
header.MinorRel  = fread(fid,1,'uint16'); %Minor File Rev #
header.IRIGStart = fread(fid,1,'double'); %Start time in secs
header.Flags     = fread(fid,1,'uint32'); %Flags

%Read everything else from there until end of file as a series of doubles.
data = fread(fid,inf,'double'); 
fclose(fid);

如果文件不适合内存,您将需要分块处理它或考虑使用 memmapfile