首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Matlab,fread,加速读取多个数据类型和多样本率的文件

Matlab,fread,加速读取多个数据类型和多样本率的文件
EN

Stack Overflow用户
提问于 2015-10-02 14:07:36
回答 1查看 1.1K关注 0票数 2

使用Matlab R2015a。我使用fread从二进制文件中读取传感器数据。数据包含多个精度。一个信号的采样速率是其他信号的5倍。该文件被构造为一个批的序列,其中每批有一个signal_A样本,但是有5个signal_B样本。

我在googled上搜索了关于如何快速加载和格式化数据的例子,但我看到的解决方案仅代表只有一个抽样率的情况,从而使解决方案更简单,据我所知。

我想避免的是for-loops的使用,它非常慢。有关数据在文件中是如何排列的,请参见下面的说明,以及我现在拥有的一个简单的代码示例。

对如何加快速度有什么建议吗?

代码语言:javascript
复制
clear;
fid = fopen('binaryFile.bin','r');
signal_B = [];

numBatches = Inf; % read all
batchSize = 17; % each batch takes up 17 bytes

% PART 1 (everything that is not signal_B)
batchSerialNumber = fread(fid, numBatches, '*uint32', batchSize-4);
fseek(fid, 4, 'bof'); % rewind
signal_A = fread(fid, numBatches, '*uint16', batchSize-2);
fseek(fid, 6, 'bof'); % rewind
misc_info = fread(fid, numBatches, '*uint8', batchSize-1);

% PART 2 (signal_B)
for i = 1:length(batchSerialNumber)
    fseek(fid, ((i-1)*batchSize) + 7, 'bof'); % set position in file, according to batch number (i)
    signal_B = [signal_B; fread(fid, 5, '*int16')]; % read the 5 samples of signal_B in this batch
end
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-02 20:49:46

更多的谷歌搜索和一个很好的解决方案最终出现..。大约比使用for-loop快100倍。

代码语言:javascript
复制
clear;
fid = fopen('binaryFile.bin','r');

numBatches = Inf; % read all
batchSize = 17; % each batch takes up 17 bytes

% PART 1 (everything that is not signal_B)
batchSerialNumber = fread(fid, numBatches, '*uint32', batchSize-4);
fseek(fid, 4, 'bof'); % rewind
signal_A = fread(fid, numBatches, '*uint16', batchSize-2);
fseek(fid, 6, 'bof'); % rewind
misc_info = fread(fid, numBatches, '*uint8', batchSize-1);
fseek(fid, 7, 'bof'); % rewind

% PART 2 (signal_B)
signal_B_line_1 = fread(fid, numBatches, '*int16', batchSize-2);
fseek(fid, 9, 'bof');
signal_B_line_2 = fread(fid, numBatches, '*int16', batchSize-2);
fseek(fid, 11, 'bof');
signal_B_line_3 = fread(fid, numBatches, '*int16', batchSize-2);
fseek(fid, 13, 'bof');
signal_B_line_4 = fread(fid, numBatches, '*int16', batchSize-2);
fseek(fid, 15, 'bof');
signal_B_line_5 = fread(fid, numBatches, '*int16', batchSize-2);

signal_B(length(batchSerialNumber)*5,1) = int16(0);

signal_B(1:5:end,1) = signal_B_line_1;
signal_B(2:5:end,1) = signal_B_line_2;
signal_B(3:5:end,1) = signal_B_line_3;
signal_B(4:5:end,1) = signal_B_line_4;
signal_B(5:5:end,1) = signal_B_line_5;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32909040

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档