dsp.BinaryFileWriter

Запись данных в двоичные файлы

Описание

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

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

Чтобы записать данные в двоичный файл:

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

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

Дополнительные сведения о работе системных объектов см. в разделе «Что такое системные объекты?».

Создание

Описание

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 Использование Системных объектов.

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

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

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

Синтаксис

Описание

пример

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

The 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

The 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);

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

.
Введенный в R2016b