从 .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。
这个问题可能很幼稚,但答案可以帮助我。
测量值以二进制格式记录,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。