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

时间:2018-01-31 09:04:47

标签: matlab binary labview

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

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

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

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

2 个答案:

答案 0 :(得分:0)

二进制.rec文件格式可能涉及各种事物(基于MPEG4-TS的Topfield的音频/视频编码格式,专有音频编码,甚至菲利普斯的MRI扫描仪)......

如果它涉及MRI扫描仪,您可以在fileexchange上找到一些直接阅读器:Matlab PAR REC Reader

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

修改

不知道您记录的传感器位移的确切文件格式,这里是虚拟示例,其中fread用于逐块读取大型rec文件,假设标头仅包含数据长度,并且该数据只是一系列双值:

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   

答案 1 :(得分:0)

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

我已经对各种二进制文件进行了很多转换,所有二进制文件都有不同的布局。如果文件适合内存,那么只要知道二进制文件的布局就可以使用fread。以下是阅读标题和放大器的示例。简单的数据块。它当然必须根据文件的布局进行修改。取决于录音设备和计算机类型你可能还需要使用machinefmt('ieee-le'或'ieee-be')选项fread ...之前烧过我。

%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查看。