dsp.BinaryFileReader

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

Описание

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

Объект принимает данные с плавающей точкой или целочисленные данные. Чтобы считать символьные данные и данные с фиксированной точкой, смотрите примеры Write and Read Character Data и Write and Read Fixed-Point Data. Входные данные могут быть реальными или сложными. Когда данные сложны, объект читает данные как перемеженные действительные и мнимые компоненты. Для получения примера смотрите Чтение Комплексных данных. Считыватель принимает конечность хоста по умолчанию. Чтобы изменить эндианнессу, можно использовать 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 метод на объекте reader.

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

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

Тип данных в файле, заданный как вектор символов. Это свойство определяет тип данных матрицы, возвращаемой алгоритмом объекта.

Опция для задания сложности данных, заданная как false или true. Когда для этого свойства задано значение trueсчитывающее устройство рассматривает данные как комплексные. Объект читает данные как перемеженные реальные и мнимые компоненты. Рассмотрим объект reader, сконфигурированный, чтобы считать данные как матрицу 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() считывает данные из двоичного файла в формате основной строки. Тип, размер и сложность данных определяются свойствами объекта 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 = 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 выборок. Поскольку для завершения системы координат недостаточно выборок, объект считывающего устройства добавляет нули в конец каждой системы координат.

Считайте данные заголовка из двоичного файла с помощью 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 свойство. Объект читает данные как перемеженные реальные и мнимые компоненты. The 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-by- NumChannel матрица вещественных значений.

reader.IsDataComplex = false;
data = reader();
display(data);
data = 2×2

     1     9
     2    10

release(reader);

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

Запись числового массива в myfile.dat в большом эндовом формате. Считайте данные с помощью dsp.BinaryFileReader объект. Объект reader считывает данные в маленьком эндовом формате.

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