【问题标题】:Retrieve data from .rec binary file从 .rec 二进制文件中检索数据
【发布时间】:2018-02-01 01:42:18
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你知道是哪个应用程序生成了 .rec 文件吗?
  • 是的,它是位移传感器的用户界面。该文件应包含一个双精度数组,即在采样率下测量的位移。
  • 嗯,当我说应用程序时,我的意思是它是否在 LabVIEW、Visual C、Matlab 等上运行?如果 .rec 文件仅包含 tyoe double 的二进制数数组,那么假设存在分隔符,则将其转换为 double 相对简单,例如回车,逗号。为什么不发布一些数据,以便我们知道您在处理什么?
  • 最终用途是导入matlab中做进一步分析(Fft等)。生成 .rec 文件的应用程序是一个通过 Web 界面工作的“黑盒”,我们只能更改一些设置并将记录的数据保存为 .rec 文件或 csv 格式,但正如我在下面所说的,如果样本数量太多高(7x10^6 左右).rec 是唯一可行的选择
  • 我最近用matlab导入了一个类似的文件,也用LabVIEW导入了同一个文件。这可能会有所帮助:uk.mathworks.com/help/matlab/ref/fread.html?s_tid=gn_loc_drop

标签: matlab binary labview


【解决方案1】:

二进制.rec 文件格式可以指代各种事物(Topfield 基于 MPEG4-TS 的音频/视频编码格式、专有音频编码,甚至是 Phillips 的 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   

【讨论】:

  • 谢谢,现在清楚了一些。 .rec 文件应在标题之后包含一个双精度数组,表示传感器测量的位移。内置的用户界面允许保存 .rec 文件和 cvs 文件,但如果样本数量太大,导出 csv 文件会失败,而 .rec 始终可以保存
  • @AlessandroDelPizzo 我用fread 逐块读取大文件的示例编辑了我的帖子...当然文件更短,因此数据可以放入内存中,您可以读取所有内容一步...根据您的确切文件头/数据内容进行调整...
  • 我用过 fileID = fopen('rec.rec','r','n','UTF-8'); [recdata, siz] = fread(fileID, [1, 200000], '*char');这样,recdata 就包含了所有的标头。我能读到的最后一个字符是“主框架”,从它开始应该有双打数组,对吗? PS:我使用 utf-8 是因为我得到的东西有一定的意义,并且在某个时候我阅读了 Encoding: UTF-8
【解决方案2】:

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

我已经对不同布局的各种二进制文件进行了多次转换。如果文件适合内存,那么只要您知道二进制文件的布局,您就可以使用fread。下面是读取标题和简单数据块的示例。它当然必须根据文件的布局进行修改。根据录音设备和计算机类型,您可能还需要使用 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 进行处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多