dsp. BinaryFileWriter

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

Описание

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

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

Записывать данные к двоичному файлу:

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

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

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

Создание

Синтаксис

writer = dsp.BinaryFileWriter
writer = dsp.BinaryFileWriter(fname)
writer = dsp.BinaryFileWriter(fname,Name,Value)

Описание

writer = dsp.BinaryFileWriter создает объект средства записи двоичного файла, writer, с помощью свойств по умолчанию.

пример

writer = dsp.BinaryFileWriter(fname) устанавливает свойство Filename на fname.

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

Пример: writer = dsp.BinaryFileWriter('myFilename.bin','HeaderStructure',struct('field1',1:10,'field2',single(1)));

Свойства

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

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

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

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

Имя файла, в который объект пишет данные, заданные как вектор символов или скаляр строки. Необходимо задать полный путь для файла.

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

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

Синтаксис

writer(data)

Описание

пример

writer(data) записывает данные к двоичному файлу в главном строкой формате. Каждый вызов алгоритма пишет элементы data в конце файла. В первом вызове алгоритма объект пишет заголовок сначала, сопровождаемый по условию. Если заголовок пуст, то никакой заголовок не записан.

Входные данные могут быть действительными или комплексными. Для комплексных данных чередованы действительные и мнимые части. Например, если данные равняются [1 2; 3 4]+1j*[5 6; 7 8], то объект пишет элементы как 1 5 2 6 3 7 4 8.

Входные параметры

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

Данные, которые будут записаны в двоичный файл в главном строкой формате, заданном как вектор или матрица. Объект написал данные в главном строкой формате. Например, если входной массив [1 2 4 5; 8 7 9 2], объект пишет данные как [1 2 4 5 8 7 9 2].

Входные данные могут быть действительными или комплексными. Для комплексных данных чередованы действительные и мнимые части. Например, если данные равняются [1 2; 3 4]+1j*[5 6; 7 8], то объект пишет элементы как [1 5 2 6 3 7 4 8].

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64
Поддержка комплексного числа: Да

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

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

release(obj)

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

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 выборок. Поскольку существует недостаточно выборок, чтобы завершить кадр, объект читателя добавляет нули в конце каждого кадра.

Создайте объект dsp.BinaryFileWriter, который пишет в файл с именем myfile.dat. Нет никакого заголовка. Данные являются комплексными.

writer = dsp.BinaryFileWriter('myfile.dat');
data = [1 2 3 4]+1i*[5 6 7 8];
writer(data);
release(writer);

Считайте данные с помощью Системы dsp.BinaryFileReader object™. Чтобы просмотреть данные в формате, это записано в файл, установите свойство IsDataComplex на false. Объект читателя считывает данные как последовательность чисел подряд главный формат. Установите SamplesPerFrame на 1 и NumChannels к 8.

reader = dsp.BinaryFileReader('myfile.dat','SamplesPerFrame',1,...
    'NumChannels',8);
s = struct([]);
reader.HeaderStructure = s;
dataRead = reader();

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

display(dataRead);
dataRead = 1×8

     1     5     2     6     3     7     4     8

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.BinaryFileWriter object™ использует порядок байтов хост-машины. Чтобы изменить порядок байтов, используйте функцию swapbytes.

Запишите числовой массив в myfile.dat с помощью объекта dsp.BinaryFileWriter. Прежде, чем записать данные, измените порядок байтов данных с помощью функции swapbytes.

data = [1 2 3 4 2 2];
swapData = swapbytes(data);
writer = dsp.BinaryFileWriter('myfile.dat');
writer(swapData);

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

Введенный в R2017b