主要内容

为文件输入和输出创建新的系统对象

这个例子展示了如何创建和使用两个不同的System对象,以促进数据流进出MATLAB®:TextFileReaderTextFileWriter

该物体在这个例子中的地址讨论了一些现实的使用情况,以及他们可以进行定制,以实现更先进,更专业的任务。

介绍

系统对象是从派生类MATLABmatlab。系统.因此,系统对象都继承一个公共的公共接口,其中包括标准方法:

  • 设置-初始化对象,通常在模拟的开始

  • 重置-清除对象的内部状态,使其恢复到初始化后的默认状态

  • 释放释放对象内部使用的任何资源(内存、硬件或特定于操作系统的资源)

当您创建新的System对象类型时,您将为所有上述方法提供特定的实现,以确定其行为。

在本例中,我们将讨论以下两个系统对象的内部结构和使用:

  • TextFileReader

  • TextFileWriter

要创建这些对进出MATLAB的流数据系统对象,本例使用MATLAB中可用的标准低级别的文件I / O功能(如的fscanf弗瑞德fprintf中,写入文件).通过抽象这些函数的大部分使用细节,它们旨在使读写流数据的任务更简单、更高效。

这个示例包括使用许多高级构造来创建System对象。有关创建System对象的更基本介绍,请参见创建系统对象

类的定义TextFileReader

TextFileReader类包括类定义、公共和私有属性、构造函数以及从matlab。系统基类,和私有方法。这TextFileWriter类的结构类似。

类定义

类定义状态的TextFileReader类是从两者派生的matlab。系统matlab.system.mixin.FiniteSource

classdef(StrictDefaults)TextFileReader 
            
  • matlab。系统是必需的,是所有系统对象的基类

  • matlab.system.mixin.FiniteSource指示此类是具有有限数量数据样本的信号源。对于此类,除了常规接口外,系统对象还将公开已经完成了函数。当已经完成了返回true,则对象已到达可用数据的末尾。

公共财产

用户可以修改公共属性,以调整其特定应用程序的对象行为。TextFileReader有两个nontunable公共属性和四个可调的公共属性(它们只能在第一次调用对象之前改变)。所有的公共属性都有一个默认值。当由用户指定的没有别的缺省值分配给相应的属性。

属性(不可调优)Filename = 'tempfile.txt' HeaderLines = 4结束
属性DataFormat='%g'分隔符=','SamplesPerFrame=1024 PlayCount=1结束

私有财产

私有财产对用户不可见,并且可以用于多种目的,包括

  • 为了保持计算的只是偶尔的值,然后与后续调用算法使用。例如,值在初始化时使用时,设置或对象第一次被调用。这可以节省在运行时重新计算它们的时间,并提高核心功能的性能

  • 定义对象的内部状态。例如pNumEofReached存储了档案结尾指标达到次数:

属性(Access=private)pFID=-1 pNumChannels pLineFormat PNUMEOFRACHED=0 end

构造函数

定义了构造函数,以便您可以构造TextFileReader使用对象名称 - 值对。构造函数调用时的一个新实例TextDataReader已创建。调用setProperties方法在构造函数中允许与在建的名称 - 值对设置的属性。没有其他初始化任务应在构造函数中指定。相反,使用setupImpl方法。

方法函数obj=TextFileReader(varargin)setProperties(obj,nargin,varargin{:});结束

最重要的matlab。系统基类受保护的方法

公共方法适用于所有系统对象,每个都具有相应的保护方法,他们内部调用。这些受保护的方法的名称都包括IMPLPostfix。他们可以定义的类到你的系统对象的行为程序时实施。

有关标准的公共方法和他们的内部实现之间的对应关系的更多信息,请参阅呼叫序列摘要

例如,TextFileReader覆盖这些IMPL方法:

  • setupImpl

  • 重置impl

  • stepImpl

  • releaseImpl

  • isDoneImpl

  • processTunedPropertiesImpl

  • loadObjectImpl

  • saveObjectImpl

私有方法

私有方法只能从同一类的其他方法中访问。它们可用于使其余代码更具可读性。它们还可以通过将在类的不同部分多次使用的代码分组到单独的例程下,从而提高代码的可重用性。例如TextFileReader,将为以下对象创建专用方法:

  • getWorkingFID

  • goToStartOfData

  • peekCurrentLine

  • lockNumberOfChannelsUsingCurrentLine

  • readNDataRows

写入和读取数据

这个例子展示了如何使用TextFileReaderTextFileWriter作者:

  • 创建使用含有两种不同的正弦信号的样本的文本文件TextFileWriter

  • 使用从文本文件中读取TextFileReader

创建一个简单的文本文件

创建一个新文件以存储两个频率分别为50 Hz和60 Hz的正弦信号。对于每个信号,存储的数据由800个采样组成,采样率为8 kHz。

创建数据示例:

fs = 8000;达峰时间= 0.1;t = (0:1 / fs: tmax-1 / fs) ';N =长度(t);f =(50、60);data =罪(2 *π* t * f);

形成头字符串来描述以供将来使用(可选步骤)一个可读的方式中的数据:

fileheader = sprintf (['下面包含%d个样本'......正弦波,频率为%d Hz和%d Hz,采样率为......“%d kHz\n\n”],N,f(1),f(2),fs/1000);

存储信号到一个文本文件,创建一个TextFileWriter对象。的构造函数TextFileWriter需要目标文件的名称和一些可选参数,这些参数可以作为名称-值对传递。

TxtWriter=TextFileWriter('文档名称'“sinewaves.txt”“标题”fileheader)
TxtWriter = TextFileWriter具有属性:文件名: 'sinewaves.txt' 标题: '以下包含两个正弦波的800个采样,...' DATAFORMAT: '%0.18克' 分隔符: ''

TextFileWriter将数据写入分隔符分隔的ASCII文件。其公共财产包括:

  • 文档名称-要写入的文件的名称。如果具有此名称的文件已存在,则会覆盖该文件。当操作开始时,对象开始在头之后立即写入文件。然后,对象在每次后续调用对象时都会追加新数据,直到释放为止。调用reset将从文件的开头继续写入。

  • 标题-字符串,通常由多行组成,以换行符结尾(\ n)。这由用户指定,可以修改以嵌入描述实际数据的人类可读信息。

  • DATAFORMAT- 使用的格式存储每个数据样本。这可能需要的任何值作为分配内的转换指定格式规范内置MATLAB函数使用的字符串fprintf中DATAFORMAT应用于写入文件的所有通道。此属性的默认值为“%.18g”,允许以完全精度保存双精度浮点数据。

  • 分隔符-字符用于在同一时刻从不同的通道分离样本。书面文件的每一行映射到的时刻,并且它包括作为多的样品,作为输入提供的信道数(换句话说,传递给对象在输入矩阵的列数)。

为了写出所有可用的数据文件,对可用于单个呼叫。

TxtWriter(数据)

通过调用释放文件的控制权释放函数。

发行版(TxtWriter)

数据现在存储在新文件中。要直观地检查文件,输入:

编辑(“sinewaves.txt”

由于标头占用三行,因此数据从第行开始4.

在这种简单的情况下,整个信号的长度很小,它适合于系统内存。因此,可以一次性创建所有数据,并在单个步骤中将其写入文件。

有些情况下,这种方法不可能或不实用。例如,数据可能太大,无法装入单个MATLAB变量(太大,无法装入系统内存)。或者,数据可以在循环中循环创建,或者从外部源流式传输到MATLAB。在所有这些情况下,可以使用类似于以下示例的方法将数据流式传输到文件中。

使用流式正弦波生成器来创建每个环路数据的帧。运行迭代创建数据并将其存储到文件所需数量:

frameLength = 32;达峰时间= 10;t = (0:1 / fs: tmax-1 / fs) ';N =长度(t);data =罪(2 *π* t * f);numCycles = N / frameLength;对于k=1:10%长时间运行循环,当你与numCycles替换10。数据帧=sin(2*pi*t*f);TxtWriter(数据帧)终止发行版(TxtWriter)

从现有文本文件阅读

要从文本文件中读取,请创建TextFileReader

TxtReader = TextFileReader('文档名称'“sinewaves.txt”“头线”3,“样品性能框架”,帧长)
TxtReader = TextFileReader与属性:Filename: 'sinewaves.txt' HeaderLines: 3 DataFormat: '%g' Delimiter: ',' SamplesPerFrame: 32 PlayCount: 1

TextFileReader从分隔符分隔的ASCII文件中读取数字数据。其属性与TextFileWriter.遵循的一些差异

  • 车头线-文件中指定的头文件使用的行数文档名称。对对象的第一次调用开始读取行号HeaderLines + 1.对该对象的后续调用将继续从紧挨着前一个读取行的行中读取。调用重置将恢复从线上阅读HeaderLines + 1

  • 分隔符-字符用于在同一时刻从不同的通道分离样本。在本例中,分隔符还用于确定存储在文件中的数据通道的数量。当对象第一次运行时,对象计数分隔符第行字符HeaderLines + 1说,纽德尔.然后,对于每一个瞬间,对象读取numChan = numDel + 1与格式数值DATAFORMAT.通过算法返回的矩阵具有大小SamplesPerFrame——- - - - - -numChan

  • SamplesPerFrame- 通过每次调用对象读取的行数。此值也返回作为输出矩阵的行的数量。当最后一个可用的数据行达到了,有可能比需要较少SamplesPerFrame。在这种情况下,可用数据用零填充,以获得大小为的矩阵SamplesPerFrame——- - - - - -numChan.一旦读取了所有的数据,算法就会简单地返回0 (SamplesPerFrame numChan)直到重置释放被称为。

  • PlayCount—循环读取文件数据的次数。如果对象到达文件的末尾,并且文件还没有被读取的次数等于PlayCount,从数据(行)开始阅读简历HeaderLines + 1).如果该文件的最后一行没有提供足够的样本,形成大小的完整输出矩阵SamplesPerFrame——- - - - - -numChan,则该帧被使用初始数据完成。一旦文件被读PlayCount时,算法返回的输出矩阵为零,所有调用已经完成了返回true,除非重置释放调用。要无限期地循环使用可用数据,PlayCount可以设置为

要从文本文件中读取数据,使用更通用的流式方法。这种读取数据的方法也与处理非常大的数据文件有关。使用帧长行和2列。

dataFrame = 0 (frameLength 2“单身”);

从文本文件,并写入二进制文件中读取数据时出现在源文本文件。注意,此时的方法已经完成了用于控制while循环的执行。

(~isDone(TxtReader)) dataFrame(:) = TxtReader();终止释放(TxtReader)

总结

这个例子说明了如何创建和使用系统对象来读取和写入数字数据文件。TextFileReaderTextFileWriter可编辑执行特殊用途的文件读写操作。您还可以将这些定制的System对象与内置的System对象组合起来,例如dsp.BinaryFileWriterdsp。BinaryFileReader

有关为自定义算法创建System对象的更多信息,请参见创建系统对象

相关的话题