dsp. BinaryFileReader

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

Описание

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

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

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

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

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

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

Создание

Синтаксис

reader = dsp.BinaryFileReader
reader = dsp.BinaryFileReader(fname)
reader = dsp.BinaryFileReader(fname,Name,Value)

Описание

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).

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

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

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

Количество каналов, заданных как положительное целое число. NumChannels задает количество столбцов выходной матрицы, которую возвращает объект. Это свойство задает количество последовательных чередованных выборок данных, сохраненных в файле в течение каждого раза момент. Размером данных является SamplesPerFrame-by-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()

Описание

пример

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

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

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

Данные считаны читателем двоичного файла, возвращенным как вектор или матрица. Размер данных дан SamplesPerFrame-by-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 = dsp.TimeScope(1,'YLimits',[-1.5 1.5],'SampleRate',...
    sine.SampleRate,'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 = dsp.TimeScope(1,'YLimits',[-1.5 1.5],'SampleRate',...
    sine.SampleRate,'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);

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

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