В этом примере показано, как создать и использовать два различных Системных объекта, чтобы упростить потоковую передачу данных в и из MATLAB®: TextFileReader
и TextFileWriter
.
Объекты, обсужденные в этом примере, обращаются ко многим реалистическим вариантам использования, и они могут быть настроены, чтобы достигнуть более усовершенствованных и специализированных задач.
Системные объекты являются классами MATLAB, которые выводят из matlab.System
. В результате Системные объекты, все наследовали общий открытый интерфейс, который включает стандартные методы:
setup
— Инициализируйте объект, обычно в начале симуляции
reset
— Очистите внутреннее состояние объекта, возвратив его его состоянию постинициализации по умолчанию
release
— Высвободите любые средства (память, оборудование или специфичные для ОС ресурсы) используемый внутренне объектом
Когда вы создаете новые виды Системных объектов, вы обеспечиваете определенные реализации для всех предыдущих методов, чтобы определить его поведение.
В этом примере мы обсуждаем внутреннюю структуру и использование следующих двух Системных объектов:
TextFileReader
TextFileWriter
Чтобы создать эти Системные объекты для потоковой передачи данных в и из MATLAB, этот пример использует стандартные низкоуровневые функции ввода-вывода файлов, доступные в MATLAB (как fscanf
fread
fprintf
, и 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
указывает, что этот класс является источником сигнала с конечным числом выборок данных. Для этого типа класса, в дополнение к обычному интерфейсу, Системный объект также отсоединит isDone
функция. Когда isDone
возвращает true, объект достиг конца доступных данных.
Публичные свойства могут быть изменены пользователем, чтобы настроить поведение объекта к его конкретному приложению. TextFileReader
имеет два ненастраиваемых публичных свойств (они могут только быть изменены перед первым вызовом объекта), и четыре настраиваемых публичных свойств. Все публичные свойства имеют значение по умолчанию. Значения по умолчанию присвоены соответствующим свойствам, когда ничто иное не задано пользователем.
properties (Nontunable) Filename = 'tempfile.txt' HeaderLines = 4 end
properties DataFormat = '%g' Delimiter = ',' SamplesPerFrame = 1024 PlayCount = 1 end
Частные свойства не отображаются пользователю и могут служить многим целям, включая
Содержать значения вычисляло только иногда, затем используемый с последующими вызовами алгоритма. Например, значения использовали во время инициализации, когда 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
.
Для получения дополнительной информации об объектах авторской системы для пользовательских алгоритмов см. Создание системных объектов.