dsp.BinaryFileReader

Считайте данные из двоичного файла

Описание

dsp.BinaryFileReader Система object™ читает многоканальные данные сигнала из двоичного файла. Если заголовок не пуст, то заголовок предшествует данным сигнала. Системный объект задает прототип заголовка, и тип, размер и сложность данных. В первый раз, когда вы читаете файл, читатель читает заголовок, сопровождаемый по условию. На последующих вызовах читатель считывает остающиеся данные. Если конец файла достигнут, читатель возвращает нули заданного типа данных, размера и сложности. Читатель может считать данные сигнала из двоичного файла, который не создается dsp.BinaryFileWriter Системный объект.

Объект принимает данные с плавающей точкой или целочисленные данные. Чтобы считать символьные данные и данные фиксированной точки, смотрите Запись и Считанные Символьные примеры Данных Фиксированной точки Записи и Данных об и Чтения. Входные данные могут быть действительными или комплексными. Когда данные являются комплексными, объект считывает данные как чередованные действительные и мнимые компоненты. Для примера смотрите Считанные Комплексные данные. Читатель принимает порядок байтов по умолчанию хост-машины. Чтобы изменить порядок байтов, можно использовать swapbytes функция. Для примера смотрите Порядок байтов Изменения Данных.

Считывать данные из двоичного файла:

  1. Создайте dsp.BinaryFileReader объект и набор его свойства.

  2. Вызовите объект с аргументами, как будто это была функция.

Чтобы узнать больше, как Системные объекты работают, смотрите то, Что Системные объекты?.

Создание

Описание

reader = dsp.BinaryFileReader создает объект читателя двоичного файла, reader, использование свойств по умолчанию.

пример

reader = dsp.BinaryFileReader(fname) устанавливает Filename свойство к fname.

reader = dsp.BinaryFileReader(fname,Name,Value) с Filename установите на fname, и каждый заданный набор свойств к заданному значению. Незаданные свойства имеют значения по умолчанию.

Пример: reader = dsp.BinaryFileReader('myFilename.bin','SamplesPerFrame',1000,'NumChannels',2);

Свойства

развернуть все

Если в противном случае не обозначено, свойства являются ненастраиваемыми, что означает, что вы не можете изменить их значения после вызова объекта. Объекты блокируют, когда вы вызываете их, и release функция разблокировала их.

Если свойство является настраиваемым, можно изменить его значение в любое время.

Для получения дополнительной информации об изменении значений свойств смотрите Разработку системы в MATLAB Используя Системные объекты.

Имя файла, из которого объект считывает данные в виде вектора символов. Если файл не находится на пути MATLAB®, то задайте полный путь для файла.

Структура задает прототип заголовка файла, то есть, размера заголовка и типа данных значений полей. Структура может иметь произвольное число полей. Каждое поле структуры должно быть действительной матрицей встроенного типа. Например, если HeaderStructure установлен в struct('field1',1:10,'field2',single(1)), объект принимает, что заголовок формируется 10 действительными значениями с двойной точностью, сопровождаемыми 1 значением с одинарной точностью. Если файл не содержит заголовка, можно установить это свойство на пустую структуру, struct([]). Чтобы получить заголовок файла, вызовите readHeader метод на объекте читателя.

Количество выборок на выход структурирует в виде положительного целого числа. SamplesPerFrame задает количество строк выходной матрицы, которую возвращает объект. Размером данных является SamplesPerFrame- NumChannels. Если конец файла достигнут, читатель возвращает нули заданного типа данных, размера и сложности.

Количество каналов в виде положительного целого числа. NumChannels задает количество столбцов выходной матрицы, которую возвращает объект. Это свойство задает количество последовательных чередованных выборок данных, сохраненных в файле в течение каждого раза момент. Размером данных является SamplesPerFrame- NumChannels. Если конец файла достигнут, если выходная матрица не полна, объект заполняет матрицу нулями, чтобы сделать его полноразмерной матрицей.

Тип данных в файле в виде вектора символов. Это свойство задает тип данных матрицы, возвращенной объектным алгоритмом.

Опция, чтобы задать сложность данных в виде false или true. Когда это свойство установлено в true, читатель обрабатывает данные как комплекс. Объект считывает данные как чередованные действительные и мнимые компоненты. Считайте объект читателя сконфигурированным, чтобы считать данные как матрицу 2 на 2. Объект читает [1 5 2 6 3 7 4 8] как [1 2; 3 4]+1j*[5 6; 7 8]. Если это свойство установлено в false, тот же объект считывает данные как [1 5; 2 6].

Использование

Синтаксис

Описание

пример

data = reader() считывает данные из двоичного файла в упорядоченном по строкам формате. Тип данных, размер и сложность данных определяются свойствами объекта читателя. Если конец файла достигнут, выход содержит нули заданного типа данных, размера и сложности.

Выходные аргументы

развернуть все

Данные считаны читателем двоичного файла, возвращенным как вектор или матрица. Размер данных дан SamplesPerFrame- NumChannels, где SamplesPerFrame и NumChannels свойства dsp.BinaryFileReader объект.

Функции объекта

Чтобы использовать объектную функцию, задайте Системный объект как первый входной параметр. Например, чтобы выпустить системные ресурсы Системного объекта под названием obj, используйте этот синтаксис:

release(obj)

развернуть все

isDoneСостояние конца данных
readHeaderСчитайте заголовок файла
stepЗапустите алгоритм Системного объекта
releaseВысвободите средства и позвольте изменения в значениях свойств Системного объекта и введите характеристики
resetСбросьте внутренние состояния Системного объекта

Примеры

свернуть все

Создайте двоичный файл с пользовательским заголовком с помощью dsp.BinaryFileWriter Системный объект. Запишите данные к этому файлу. Считайте заголовок и данные с помощью dsp.BinaryFileReader Системный объект.

Запишите данные

Задайте заголовок файла как структуру со следующими полями:

  • DataType устанавливают на double.

  • Набор сложности к false.

  • FrameSize (количество строк в матрице данных) набор к 150.

  • NumChannels (количество столбцов в матрице данных) набор к 1.

Создайте dsp.BinaryFileWriter объект с помощью этого заголовка. Объект пишет заголовок сначала, сопровождаемый по условию, к ex_file.bin. Данные являются шумным синусоидальным сигналом. Просмотрите данные в осциллографе времени.

L = 150;
header = struct('DataType','double','Complexity',false,'FrameSize',L,'NumChannels',1);
writer = dsp.BinaryFileWriter('ex_file.bin','HeaderStructure',header);

sine = dsp.SineWave('SamplesPerFrame',L);
scopewriter = timescope(1,'YLimits',[-1.5 1.5],'SampleRate',...
    sine.SampleRate,'TimeSpanSource','Property','TimeSpan',1);

for i = 1:1000
    data = sine() + 0.01*randn(L,1);
    writer(data);
    scopewriter(data)
end

Выпустите средство записи так, чтобы читатель мог получить доступ к данным из этого файла.

release(writer);

Считайте данные

Считайте данные из двоичного файла, ex_file.bin, использование dsp.BinaryFileReader объект. Файл содержит данные о заголовке, сопровождаемые фактическими данными. Объект считывает двоичные данные, пока конец файла не достигнут. Задайте заголовок читателю, использующему HeaderStructure свойство объекта читателя.

Если точный заголовок не известен на стороне читателя, необходимо, по крайней мере, задать прототип заголовка. Таким образом, количество полей, и тип данных, размер и сложность каждого поля в прототипе должны соответствовать с данными о заголовке, записанными в двоичный файл. Когда readHeader функция считывает данные из двоичного файла, функция извлекает информацию о заголовке на основе того, как поля заданы в прототипе заголовка. Например, полевой набор заголовка к 'double' на средстве записи сторона может быть задана как любая строка 6 символов на стороне читателя. readHeader функционируйте читает это поле как строку 6 символов от двоичного файла, который соответствует с 'double'.

headerPrototype = struct('DataType','datype','Complexity',false,'FrameSize',1,'NumChannels',10);
reader = dsp.BinaryFileReader(...
    'ex_file.bin',...
    'HeaderStructure',headerPrototype);
headerReader = readHeader(reader)
headerReader = 

  struct with fields:

       DataType: 'double'
     Complexity: 0
      FrameSize: 150
    NumChannels: 1

Данные о заголовке извлечены readHeader функция присвоена соответствующим свойствам reader объект.

reader.IsDataComplex = headerReader.Complexity;
reader.DataType = headerReader.DataType;
reader.NumChannels = headerReader.NumChannels;
reader.SamplesPerFrame = headerReader.FrameSize;

Инициализируйте осциллограф на стороне читателя, чтобы просмотреть извлеченные данные о двоичном файле.

scopereader = timescope(1,'YLimits',[-1.5 1.5],'SampleRate',...
    sine.SampleRate,'TimeSpanSource','Property','TimeSpan',1);

Данные считаны в один канал (столбец), содержащий несколько систем координат, где каждая система координат имеет 150 выборок. Просмотрите данные в осциллографе времени.

while ~isDone(reader)
    out = reader();
    scopereader(out)
end
release(reader);
release(scopereader);

Установите читателя считывать данные в системах координат размера 300. Проверьте, что данные считали соответствия данные, записанные в файл.

reader.SamplesPerFrame = 300;
while ~isDone(reader)
    out = reader();
    scopereader(out)
end
release(reader);

Даже когда читатель считывает данные с различным форматом кадра, выходом в оба раза соответствия осциллографов точно.

Используйте dsp.BinaryFileReader Система object™, чтобы считать данные из двоичного файла в упорядоченном по строкам формате.

Запишите данные

Запишите матричный A к двоичному файлу Matdata.bin использование dsp.BinaryFileWriter объект. Объект пишет заданный заголовок, сопровождаемый по условию.

Заголовок имеет следующий формат:

  • DataType устанавливают на double.

  • Набор сложности к false.

  • FrameSize (количество строк в матрице данных) набор к 3.

  • NumChannels (количество столбцов в матрице данных) набор к 4.

A = [1 2 3 8; 4 5 6 10; 7 8 9 11];
header = struct('DataType','double','Complexity',false,'FrameSize',3,'NumChannels',4);
writer = dsp.BinaryFileWriter('Matdata.bin','HeaderStructure',header);
writer(A);

Выпустите средство записи так, чтобы читатель мог получить доступ к данным.

release(writer);

Считайте данные

Задайте заголовок с помощью HeaderStructure свойство объекта читателя. Если точный заголовок не известен, необходимо, по крайней мере, задать прототип заголовка. Таким образом, количество полей, и тип данных, размер и сложность каждого поля в прототипе должны соответствовать с данными о заголовке, записанными в двоичный файл. dsp.BinaryFileReader возразите читает двоичный файл Matdata.bin пока конец файла не достигнут. Сконфигурируйте Системный объект, чтобы считать данные в 4 канала с каждым каналом, содержащим 5 выборок. Каждый цикл итерации читает канал (или система координат) данных.

headerPrototype = struct('DataType','double','Complexity',false,'FrameSize',5,'NumChannels',4);
reader = dsp.BinaryFileReader('Matdata.bin','HeaderStructure',headerPrototype,'NumChannels',4,...
    'SamplesPerFrame',5);
while ~isDone(reader)
    out = reader();
    display(out)
end
out = 5×4

     1     2     3     8
     4     5     6    10
     7     8     9    11
     0     0     0     0
     0     0     0     0

Каждая система координат out содержит системы координат матричного A, сопровождаемый нулями, чтобы завершить систему координат. Исходный матричный A содержит 4 канала с 3 выборками в каждом канале. Читатель сконфигурирован, чтобы считать данные в 4 канала с каждым каналом, содержащим 5 выборок. Поскольку существует недостаточно выборок, чтобы завершить систему координат, объект читателя добавляет нули в конце каждой системы координат.

Считайте данные о заголовке из двоичного файла с помощью readHeader функция.

Запишите заголовок, сопровождаемый по условию к двоичному файлу под названием myfile.dat. Заголовок является матрицей 1 на 4 значений двойной точности, сопровождаемых вектором 5 на 1 из значений с одинарной точностью. Данные являются последовательностью 1 000 значений с двойной точностью.

fid = fopen('myfile.dat','w');
fwrite(fid,[1 2 3 4],'double');
fwrite(fid,single((1:5).'),'single');
fwrite(fid,(1:1000).','double');
fclose(fid);

Считайте заголовок с помощью dsp.BinaryFileReader объект. Задайте ожидаемую структуру заголовка. Эта структура задает только формат ожидаемого заголовка двоичного файла и не содержит точные значения.

reader = dsp.BinaryFileReader('myfile.dat');
s = struct('A',zeros(1,4),'B',ones(5,1,'single'));
reader.HeaderStructure = s;

Считайте заголовок с помощью readHeader функция.

H = readHeader(reader);
fprintf('H.A: ')
H.A: 
fprintf('%d ',H.A);
1 2 3 4 
fprintf('\nH.A datatype: %s\n',class(H.A))
H.A datatype: double
fprintf('H.B: ')
H.B: 
fprintf('%d ',H.B);
1 2 3 4 5 
fprintf('\nH.B datatype: %s\n',class(H.B))
H.B datatype: single

Считайте комплексные данные из двоичного файла с помощью dsp.BinaryFileReader объект.

Запишите последовательность чисел в двоичный файл под названием myfile.dat. Нет никакого заголовка. Данные 2 4 матрица значений с двойной точностью. fwrite написали данные в упорядоченном по столбцам формате. Таким образом, 2 4 матричный [1 2 3 4; 9 10 11 12] записан как [1 9 2 10 3 11 4 12] в двоичном файле.

fid = fopen('myfile.dat','w');
fwrite(fid,[1 2 3 4; 9 10 11 12],'double');
fclose(fid);

Задайте данные, чтобы быть комплексным использованием IsDataComplex свойство. Объект считывает данные как чередованные действительные и мнимые компоненты. SamplesPerFrame и NumChannel свойства задают количество строк и столбцов выходных данных. Структура заголовка задана как пустая.

reader = dsp.BinaryFileReader('myfile.dat','SamplesPerFrame',2,...
    'NumChannels',2,'IsDataComplex',true);
s = struct([]);
reader.HeaderStructure = s;
data = reader();
display(data);
data = 2×2 complex

   1.0000 + 9.0000i   2.0000 +10.0000i
   3.0000 +11.0000i   4.0000 +12.0000i

release(reader);

В качестве альтернативы, если вы не задаете данные, столь же комплексные, читатель считывает данные как SamplesPerFrame- NumChannel матрица действительных значений.

reader.IsDataComplex = false;
data = reader();
display(data);
data = 2×2

     1     9
     2    10

release(reader);

dsp.BinaryFileWriter и dsp.BinaryFileReader Системные объекты не поддерживают запись и чтение данных фиксированной точки. Как обходное решение, можно записать сохраненный целочисленный фрагмент fi данные, считанные данные и использование это значение, чтобы восстановить fi данные.

Запишите данные фиксированной точки

Создайте fi объект представлять 100 случайных чисел со знаком размером слова 14 и дробной длиной 12. Запишите сохраненный целочисленный фрагмент fi возразите против файла данных myFile.dat. Встроенным типом данных является int16, который может быть вычислен с помощью class(storeIntData).

data = randn(100,1);
fiDataWriter = fi(data,1,14,12);
storeIntData = storedInteger(fiDataWriter);

writer = dsp.BinaryFileWriter('myFile.dat');
writer(storeIntData);

Выпустите средство записи так, чтобы читатель мог получить доступ к данным.

release(writer);

Считайте данные фиксированной точки

Задайте читателя, чтобы считать хранимые целочисленные данные как int16 данные с 100 выборками на систему координат данных. Реальное значение номера фиксированной точки может быть представлено с помощью 2(-fractionLength)(storedInteger). Если вы знаете размер слова со знаком и дробную длину данных фиксированной точки, можно восстановить fi использование данных fi(realValue,signedness,wordLength,fractionLength). В этом примере данные подписываются с размером слова 14 и дробной длиной 12.

reader = dsp.BinaryFileReader('Filename','myFile.dat','SamplesPerFrame',100,...
    'DataType','int16');
data = reader();
fractionLength = 12;
wordLength = 14;
realValue = 2^(-fractionLength)*double(data);

fiDataReader = fi(realValue,1,wordLength,fractionLength);

Проверьте, что данные средства записи совпадают с данными читателя.

isequal(fiDataWriter,fiDataReader)
ans = logical
   1

dsp.BinaryFileWriter и dsp.BinaryFileReader Системные объекты не поддерживают запись и чтение символов. Как обходное решение, данные о символе броска к одному из встроенных типов данных и записи целочисленные данные. После того, как читатель считывает данные, преобразуйте данные в символ с помощью char функция.

Запишите символьные данные

Бросьте символ в uint8 использование cast функция. Запишите данные броска в файл данных myFile.dat.

data = 'binary_file';
castData = cast(data,'uint8');
writer = dsp.BinaryFileWriter('myFile.dat');
writer(castData);

Выпустите средство записи так, чтобы читатель мог получить доступ к данным.

release(writer);

Считайте uint8 Данные

Сконфигурируйте читателя, чтобы считать данные броска как uint8 данные.

reader = dsp.BinaryFileReader('myFile.dat','DataType','uint8','SamplesPerFrame',11);
readerData = reader();
charData = char(readerData);

Проверьте, что данные средства записи совпадают с данными читателя. По умолчанию читатель возвращает данные в упорядоченном по столбцам формате.

strcmp(data,charData.')
ans = logical
   1

По умолчанию, dsp.BinaryFileReader Система object™ использует порядок байтов хост-машины. Чтобы изменить порядок байтов, такой как тогда, когда хост-машина, которая пишет данные, не имеет того же порядка байтов как хост-машина, которая считывает данные, используйте swapbytes функция.

Запишите числовой массив в myfile.dat в формате с обратным порядком байтов. Считайте данные с помощью dsp.BinaryFileReader объект. Объект читателя считывает данные в формате с прямым порядком байтов.

fid = fopen('myfile.dat','w','b');
fwrite(fid,[1 2 3 4 5 6 7 8],'double');
fclose(fid);
reader = dsp.BinaryFileReader('myfile.dat','SamplesPerFrame',8);
x = reader();
display(x);
x = 8×1
10-318 ×

    0.3039
    0.0003
    0.0104
    0.0206
    0.0256
    0.0307
    0.0357
    0.0408

x не совпадает с исходными данными. Измените порядок байтов x использование swapbytes функция.

y = swapbytes(x);
display(y);
y = 8×1

     1
     2
     3
     4
     5
     6
     7
     8

y совпадает с исходными данными.

Расширенные возможности

Введенный в R2017b