Matlab R2015a 사용. fread
바이너리 파일에서 센서 데이터를 읽는 데 사용 하고 있습니다. 데이터에는 여러 정밀도가 포함됩니다. 한 신호는 다른 신호보다 5 배 빠른 속도로 샘플링됩니다. 파일은 일련의 배치로 구성되며, 각 배치에는 예를 들어 signal_A의 샘플 1 개와 signal_B의 샘플 5 개가 있습니다.
데이터를 빠르게로드하고 형식을 지정하는 방법에 대한 예제를 봤지만 지금까지 본 솔루션은 단일 샘플링 속도가있는 경우 만 나타내므로 내가 말할 수있는 한 솔루션을 더 간단하게 만듭니다.
내가 피하고 싶은 for
것은 꽤 느린 루프를 사용하는 것입니다 . 파일에서 데이터가 정렬되는 방식에 대한 설명과 지금 가지고있는 간단한 코드 예제는 아래를 참조하십시오.
속도를 높이는 방법에 대한 제안이 있습니까?
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
더 많은 인터넷 검색과 멋진 솔루션이 마침내 나타났습니다 for
. -loop를 사용하는 것보다 약 100 배 더 빠릅니다 .
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;
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다