exponenta event banner

dsp. BinaryFileReader

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

Описание

dsp.BinaryFileReader Система object™ считывает данные многоканального сигнала из двоичного файла. Если заголовок не пуст, то заголовок предшествует сигнальным данным. Объект System определяет прототип заголовка, а также тип, размер и сложность данных. При первом чтении файла считывающее устройство считывает заголовок, за которым следуют данные. При последующих вызовах считывающее устройство считывает оставшиеся данные. По достижении конца файла модуль чтения возвращает нули указанного типа данных, размера и сложности. Устройство чтения может считывать данные сигнала из двоичного файла, который не создан 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 объект.

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

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

release(obj)

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

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

Примеры

свернуть все

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

Запись данных

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

  • DataType имеет значение double.

  • Для сложности установлено значение false.

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

  • NumChannel (количество столбцов в матрице данных) установлено равным 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 свойства объекта reader.

Если точный заголовок не известен на стороне считывателя, необходимо по крайней мере указать прототип заголовка. То есть количество полей, тип данных, размер и сложность каждого поля в прототипе должны соответствовать данным заголовка, записанным в двоичный файл. Когда 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.

  • NumChannel (количество столбцов в матрице данных) установлено равным 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 свойства объекта reader. Если точный заголовок неизвестен, необходимо по крайней мере указать прототип заголовка. То есть количество полей, тип данных, размер и сложность каждого поля в прототипе должны соответствовать данным заголовка, записанным в двоичный файл. dsp.BinaryFileReader объект считывает двоичный файл Matdata.bin до тех пор, пока не будет достигнут конец файла. Сконфигурируйте объект System для считывания данных по 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. Данные представляют собой последовательность из 1000 значений двойной точности.

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, fracityLength). В этом примере данные подписываются длиной слова 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™ использует полноту хост-машины. Чтобы изменить endianness, например, когда хост-машина, которая записывает данные, не имеет такой же endianness, как хост-машина, которая считывает данные, используйте swapbytes функция.

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

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 соответствует исходным данным.

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

.
Представлен в R2016b