exponenta event banner

dsp. BinaryFileWriter

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

Описание

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

Объект может записывать данные с плавающей запятой и целочисленные данные. Сведения о записи символьных данных и данных с фиксированной точкой см. в разделах Запись и чтение символьных данных и Запись и чтение данных с фиксированной точкой. Входные данные могут быть реальными или сложными. Когда данные сложны, объект записывает данные как перемежающиеся вещественные и мнимые компоненты. Пример см. в разделе Запись и чтение данных с фиксированной точкой. По умолчанию модуль записи использует значение endianness хост-компьютера. Чтобы изменить эндианнесс, можно использовать 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
Поддержка комплексного номера: Да

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

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

release(obj)

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

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

Создать 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, 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.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