Создайте новые системные объекты для ввода и вывода файла

В этом примере показано, как создать и использовать два различных Системных объекта, чтобы упростить потоковую передачу данных в и из MATLAB®: TextFileReader и TextFileWriter.

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

Введение

Системные объекты являются классами MATLAB, которые выводят из matlab.System. В результате Системные объекты, все наследовали общий открытый интерфейс, который включает стандартные методы:

  • setup — Инициализируйте объект, обычно в начале симуляции

  • reset — Очистите внутреннее состояние объекта, возвратив его его состоянию постинициализации по умолчанию

  • release — Высвободите любые средства (память, оборудование или специфичные для ОС ресурсы) используемый внутренне объектом

Когда вы создаете новые виды Системных объектов, вы обеспечиваете определенные реализации для всех предыдущих методов, чтобы определить его поведение.

В этом примере мы обсуждаем внутреннюю структуру и использование следующих двух Системных объектов:

  • TextFileReader

  • TextFileWriter

Чтобы создать эти Системные объекты для потоковой передачи данных в и из MATLAB, этот пример использует стандартные низкоуровневые функции ввода-вывода файлов, доступные в MATLAB (как fscanffreadfprintf, и fwrite). Путем абстракции далеко большинства деталей использования тех функций, они стремятся делать задачу из чтения и записи переданных потоком данных более простой и более эффективной.

Этот пример включает использование многих усовершенствованных построений, чтобы создать Системные объекты. Для более основного введения в объекты авторской системы см. Создание системных объектов.

Определение класса TextFileReader

TextFileReader класс включает определение класса, публичные и частные свойства, конструктора, защищенные методы, переопределенные от matlab.System базовый класс и закрытые методы. TextFileWriter класс так же структурирован.

Определение класса

Определение класса утверждает что TextFileReader класс выведен из обоих matlab.System и matlab.system.mixin.FiniteSource.

   classdef (StrictDefaults)TextFileReader < matlab.System & matlab.system.mixin.FiniteSource
  • matlab.System требуется и базовый класс для всех Системных объектов

  • matlab.system.mixin.FiniteSource указывает, что этот класс является источником сигнала с конечным числом выборок данных. Fot этот тип класса, в дополнение к обычному интерфейсу, Системный объект также отсоединит isDone функция. Когда isDone возвращает true, объект достиг конца доступных данных.

Общественные собственности

Публичные свойства могут быть изменены пользователем, чтобы настроить поведение объекта к его конкретному приложению. TextFileReader имеет два ненастраиваемых публичных свойств (они могут только быть изменены перед первым вызовом объекта), и четыре настраиваемых публичных свойств. Все публичные свойства имеют значение по умолчанию. Значения по умолчанию присвоены соответствующим свойствам, когда ничто иное не задано пользователем.

   properties (Nontunable)
       Filename   = 'tempfile.txt' 
       HeaderLines = 4
   end
   properties
       DataFormat = '%g' 
       Delimiter = ',' 
       SamplesPerFrame = 1024
       PlayCount = 1
   end

Частные свойства

Частные свойства не отображаются пользователю и могут служить многим целям, включая

  • Содержать значения вычисляло только иногда, затем используемый с вызовами subsquent алгоритма. Например, значения использовали во время инициализации, когда setup называется или объект называется впервые. Это может сохранить перевычисление их во времени выполнения и улучшать производительность базовой функциональности

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

   properties(Access = private)
       pFID = -1 
       pNumChannels 
       pLineFormat 
       pNumEofReached = 0
   end

Конструктор

Конструктор задан так, чтобы можно было создать TextFileReader объект с помощью пар "имя-значение". Конструктор называется когда новый экземпляр TextDataReader создается. Вызов setProperties в конструкторе позволяет устанавливать свойства с парами "имя-значение" при конструкции. Никакие другие задачи инициализации не должны быть заданы в конструкторе. Вместо этого используйте setupImpl метод.

   methods
       function obj = TextFileReader(varargin)
           setProperties(obj, nargin, varargin{:});
       end
   end

Сверхизбавление matlab.System Защищенные методы базового класса

Открытые методы, характерные для всех Системных объектов, у каждого есть соответствующие защищенные методы, которые они вызывают внутренне. Имена этих защищенных методов все включают Impl постфикс. Они могут быть реализованы при определении класса, чтобы программировать поведение Системного объекта.

Для получения дополнительной информации о соответствии между стандартными открытыми методами и их внутренними реализациями, обратитесь к Сводным данным Последовательности Вызова.

Например, TextFileReader переопределения они Impl методы:

  • setupImpl

  • resetImpl

  • stepImpl

  • releaseImpl

  • isDoneImpl

  • processTunedPropertiesImpl

  • loadObjectImpl

  • saveObjectImpl

Закрытые методы

Закрытые методы только доступны из других методов того же класса. Они могут использоваться, чтобы сделать остальную часть кода более читаемой. Они могут также улучшить возможность многократного использования кода путем группировки в соответствии с отдельным кодом стандартных программ, который используется многократно в различных частях класса. Для TextFileReader, закрытые методы создаются для:

  • getWorkingFID

  • goToStartOfData

  • peekCurrentLine

  • lockNumberOfChannelsUsingCurrentLine

  • readNDataRows

Запись и чтение данных

В этом примере показано, как можно использовать TextFileReader и TextFileWriter :

  • Создание текстового файла, содержащего выборки двух различных синусоидальных сигналов с помощью TextFileWriter

  • Читайте из текстового файла с помощью TextFileReader.

Создайте простой текстовый файл

Создайте новый файл, чтобы сохранить два синусоидальных сигнала частотами 50 Гц и 60 Гц. Для каждого сигнала хранимые данные состоят из 800 выборок на уровне выборки 8 кГц.

Создайте выборки данных:

fs = 8000;
tmax = 0.1;
t = (0:1/fs:tmax-1/fs)';
N = length(t);
f = [50,60];
data = sin(2*pi*t*f);

Сформируйте строку заголовка, чтобы описать данные читаемым способом к будущему использованию (дополнительный шаг):

fileheader = sprintf(['The following contains %d samples of two ',...
    'sinusoids,\nwith frequencies %d Hz and %d Hz and a sample rate of',...
    ' %d kHz\n\n'], N, f(1),f(2),fs/1000);

Чтобы сохранить сигнал к текстовому файлу, создайте TextFileWriter объект. Конструктор TextFileWriter нуждается в имени конечного файла и некоторых дополнительных параметров, которые могут быть переданы в как пары "имя-значение".

TxtWriter = TextFileWriter('Filename','sinewaves.txt','Header',fileheader)
TxtWriter = 
  TextFileWriter with properties:

      Filename: 'sinewaves.txt'
        Header: 'The following contains 800 samples of two sinusoids,...'
    DataFormat: '%.18g'
     Delimiter: ','

TextFileWriter записывает данные к разделенным от разделителя ASCII-файлам. Его публичные свойства включают:

  • Filename — Имя файла, который будет записан. Если файл с этим именем уже существует, это перезаписывается. Когда операции запускаются, объект начинает запись к файлу сразу после заголовка. Объект затем добавляет новые данные в каждом последующем вызове объекта, пока это не выпущено. Вызов сброса продолжает писать с начала файла.

  • Header — Символьная строка, часто состоящая из нескольких линий и отключенная символом новой строки (\n). Это задано пользователем и может быть изменено, чтобы встроить человекочитаемую информацию, которая описывает фактические данные.

  • DataFormat — Формат раньше хранил каждую выборку данных. Это может принять любое значение, присваиваемое как Спецификатор Преобразования в formatSpec строка, используемая встроенной функцией MATLAB fprintf. DataFormat применяется ко всем каналам, записанным в файл. Значением по умолчанию для этого свойства является '%.18g', который позволяет сохранять данные с плавающей запятой двойной точности в полной точности.

  • Delimiter — Символ раньше разделял выборки от различных каналов одновременно момент. Каждая линия записанных карт файлов к моменту времени, и это включает столько же выборок сколько количество каналов, обеспеченных, как введено (другими словами, количество столбцов в матричном входе передало объекту).

Чтобы записать все доступные данные в файл, один вызов может использоваться.

TxtWriter(data)

Выпустите управление файла путем вызова release функция.

release(TxtWriter)

Данные теперь хранимы в новом файле. Чтобы визуально смотреть файл, введите:

edit('sinewaves.txt')

Поскольку заголовок поднимает три линии, данные запускают на линии 4.

В этом простом случае мала длина целого сигнала, и это соответствует удобно на системной памяти. Поэтому данные могут быть созданы целиком и записаны в файл на одном шаге.

Существуют случаи, когда этот подход не возможен или практичен. Например, данные могут быть слишком большими, чтобы поместиться в одну переменную MATLAB (слишком большой, чтобы соответствовать на системной памяти). В качестве альтернативы данные могут быть созданы циклически в цикле или переданы потоком в MATLAB из внешнего источника. Во всех этих случаях, передавая данные потоком в файл может быть сделан с подходом, похожим на следующий пример.

Используйте переданный потоком генератор синусоиды, чтобы создать систему координат данных на цикл. Запустите желаемое количество итераций, чтобы создать данные и сохранить его в файл:

frameLength = 32;
tmax = 10; 
t = (0:1/fs:tmax-1/fs)';
N = length(t);
data = sin(2*pi*t*f);
numCycles = N/frameLength;

for k = 1:10 % Long running loop when you replace 10 with numCycles. 
    dataFrame = sin(2*pi*t*f);
    TxtWriter(dataFrame)
end

release(TxtWriter)

Читайте из файла существующего текста

Чтобы читать из текстового файла, создайте экземпляр TextFileReader.

TxtReader = TextFileReader('Filename','sinewaves.txt','HeaderLines',3,'SamplesPerFrame',frameLength)
TxtReader = 
  TextFileReader with properties:

           Filename: 'sinewaves.txt'
        HeaderLines: 3
         DataFormat: '%g'
          Delimiter: ','
    SamplesPerFrame: 32
          PlayCount: 1

TextFileReader считывает числовые данные из разделенных от разделителя ASCII-файлов. Его свойства похожи на те из TextFileWriter. Некоторые различия следуют

  • HeaderLines — Количество линий, используемых заголовком в файле, задано в Filename. Первый вызов объекта начинает читать из номера строки HeaderLines+1. Последующие вызовы объектного хранения, читающего из линии сразу после ранее прочитанной строки. Вызов reset продолжит читать из линии HeaderLines+1.

  • Delimiter — Символ раньше разделял выборки от различных каналов одновременно момент. В этом случае разделитель также используется, чтобы определить количество каналов данных, сохраненных в файле. Когда объект является первым показом, числа объектов количество Delimiter символы в линии HeaderLines+1, скажите numDel. Затем в течение каждого раза момент, объект читает numChan = numDel+1 числовые значения с форматом DataFormat. Матрица, возвращенная алгоритмом, имеет размер SamplesPerFrame- numChan.

  • SamplesPerFrame — Количество строк, прочитанных каждым вызовом объекта. Это значение является также количеством строк матрицы, возвращенной, как выведено. Когда последние доступные строки данных достигнуты, могут быть меньше, чем необходимый SamplesPerFrame. В этом случае доступные данные дополнены нулями, чтобы получить матрицу размера SamplesPerFrame- numChan. Если все данные считаны, алгоритм просто возвращает zeros(SamplesPerFrame,numChan) до reset или release называется.

  • PlayCount — Число раз данные в файле читается циклически. Если объект достигает конца файла, и файл еще не был считан неоднократно равный PlayCount, чтение резюме с начала данных (линия HeaderLines+1). Если последние линии файла не обеспечивают достаточно выборок, чтобы сформировать полную выходную матрицу размера SamplesPerFrame- numChan, затем система координат завершается с помощью исходных данных. Если файл является чтением PlayCount времена, выходная матрица, возвращенная алгоритмом, заполнены нулями и всеми вызовами isDone возвратите true если reset или release называется. Циклично выполняться через доступные данные неопределенно, PlayCount может быть установлен в Inf.

Чтобы считать данные из текстового файла, более общий переданный потоком подход используется. Этот метод чтения данных также относится к контакту с очень большими файлами данных. Предварительно выделите систему координат данных с frameLength строки и 2 столбца.

dataFrame = zeros(frameLength,2,'single');

Читайте из текстового файла и запишите в двоичный файл, в то время как данные присутствуют в файле исходного текста. Заметьте как метод isDone используется, чтобы управлять выполнением цикла с условием продолжения.

while(~isDone(TxtReader))
    dataFrame(:) = TxtReader();
end

release(TxtReader)

Сводные данные

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

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