创建新的文件系统对象的输入和输出
这个例子展示了如何创建和使用两个不同的系统对象方便的数据流的MATLAB®:TextFileReader
和TextFileWriter
。
讨论的对象,在本例中解决许多现实使用情况下,他们可以定制实现更高级的和专门的任务。
介绍
来自MATLAB系统对象类matlab.System
。因此,系统对象继承一个共同的公共接口,包括标准方法:
设置
——初始化对象,通常一开始的模拟重置
——明确的对象的内部状态,把它带回其默认post-initialization地位释放
——释放任何资源(内存、硬件或os资源)的内部使用的对象
当你创建新的类型的系统对象,提供具体的实现所有前面的方法来确定其行为。
在这个例子中,我们讨论了以下两个系统的内部结构和使用对象:
TextFileReader
TextFileWriter
系统创建这些对象在MATLAB的流数据,这个示例使用标准低级文件I / O函数中可用MATLAB(如fscanf
,从文件中读
,流
,写入文件
)。通过抽象掉大部分使用这些功能的细节,他们的目标是使阅读和写作的任务流数据更简单和更有效率。
这个例子包括使用一些高级结构作者系统对象。对于一个更基本的创作系统概论对象,明白了创建系统对象。
类的定义TextFileReader
的TextFileReader
类包含一个类的定义,公共和私有属性、构造函数、方法的覆盖保护matlab.System
基类和私有方法。的TextFileWriter
类是类似的结构。
类定义
类定义的TextFileReader
类是来自两个matlab.System
和matlab.system.mixin.FiniteSource
。
classdef (StrictDefaults) TextFileReader < matlab。系统& matlab.system.mixin.FiniteSource
matlab.System
要求所有系统对象的基类吗matlab.system.mixin.FiniteSource
显示这个类是一个信号源与有限数量的数据样本。对于这种类型的类,除了通常的接口,系统对象也将暴露结束
函数。当结束
返回true,对象的可用的数据。
公共属性
公共属性可以改变由用户调整对象的行为他或她的特定应用程序。TextFileReader
有两个nontunable公共属性(之前他们只能改变第一个调用对象)和四个可调的公共属性。所有的公共属性有一个默认值。默认值被分配到相应的属性,当没有其他由用户指定。
属性(Nontunable) = ' tempfile文件名。txt”HeaderLines = 4
属性DataFormat = % g的分隔符=”、“SamplesPerFrame = 1024 PlayCount = 1
私有财产
私人属性对用户不可见,可以用于许多目的,包括
只是偶尔来保存值计算,然后用于后续调用算法。例如,值在初始化时使用,当
设置
被称为或对象第一次呼吁。这可以节省再计算他们在运行时,提高核心功能的性能定义对象的内部状态。例如,
pNumEofReached
存储的文件尾的次数指标达成:
属性(访问=私人)pFID = 1 pNumChannels pLineFormat pNumEofReached = 0
构造函数
构造函数,这样您就可以构造一个定义TextFileReader
对象使用名称-值对。的一个新实例时调用构造函数TextDataReader
被创建。调用找
在构造函数允许设置属性名称-值对的建设。没有其他的初始化任务应该在构造函数中指定。相反,使用setupImpl
方法。
方法函数obj = TextFileReader(变长度输入宗量)找(obj,输入参数个数,变长度输入宗量{:});结束结束
压倒一切的matlab.System
基类的保护方法
系统所有对象共有的公共方法都有相应的保护方法,他们在内部调用。这些保护方法的名称包括一个Impl
后缀。他们可以在定义类来实现项目系统对象的行为。
更多信息之间的通信标准的公共方法和它们的内部实现,请参考总结调用序列。
例如,TextFileReader
覆盖这些Impl
方法:
setupImpl
resetImpl
stepImpl
releaseImpl
isDoneImpl
processTunedPropertiesImpl
loadObjectImpl
saveObjectImpl
私有方法
私有方法只可在同一类的其他方法。他们可以用来做其余的代码更加可读。他们还可以提高代码的可重用性,由分组单独例程代码中多次使用类的不同部分。为TextFileReader
创建私有方法为:
getWorkingFID
goToStartOfData
peekCurrentLine
lockNumberOfChannelsUsingCurrentLine
readNDataRows
读写数据
这个例子展示了如何使用TextFileReader
和TextFileWriter
由:
创建一个文本文件包含两个不同的正弦信号使用的样品
TextFileWriter
从文本文件中读取的
TextFileReader
。
创建一个简单的文本文件
创建一个新文件来存储两个正弦信号频率为50 Hz, 60赫兹。对于每一个信号,存储的数据是由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的两个样品的,…的正弦曲线,\ nwith % d赫兹和% d赫兹频率和采样率的,…“% d千赫\ n \ n”f)、N、f (1), (2), fs / 1000);
存储信号到一个文本文件,创建一个TextFileWriter
对象。的构造函数TextFileWriter
需要目标文件的名字和一些可选的参数,可以通过名称-值对。
TxtWriter = TextFileWriter (“文件名”,“sinewaves.txt”,“头”fileheader)
TxtWriter = TextFileWriter属性:文件名:“sinewaves。txt的头:“下面包含两个正弦曲线的800个样本,…DataFormat: %。分隔符:18 g”、“
TextFileWriter
将数据写入delimiter-separated ASCII文件。其公共属性包括:
文件名
——编写的文件的名称。如果带有这个名字的文件已经存在,覆盖。操作开始时,对象写入文件头后立即开始。然后对象添加新的数据在每个后续调用对象,直到它被释放。调用重置恢复文件的写作从一开始。头
字符串,通常由多个行和终止由换行符(\ n
)。这是由用户指定,可以修改嵌入可读信息,描述了实际的数据。DataFormat
——格式用于存储每个数据样本。这可以采取任何价值分配中转换说明符formatSpec
字符串使用内置的MATLAB函数流
。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。dataFrame =罪(2 *π* t * f);TxtWriter (dataFrame)结束发行版(TxtWriter)
从现有的文本文件读取
从文本文件中读取的,创建的实例TextFileReader
。
TxtReader = TextFileReader (“文件名”,“sinewaves.txt”,“HeaderLines”3,“SamplesPerFrame”frameLength)
TxtReader = TextFileReader属性:文件名:“sinewaves。txt HeaderLines: 3 DataFormat: ' % g的分隔符:“SamplesPerFrame: 32 PlayCount: 1
TextFileReader
从delimiter-separated ASCII文件读取数值数据。它的属性是相似的TextFileWriter
。遵循的一些差异
HeaderLines
——行数内使用的头文件中指定文件名
。第一次调用对象开始阅读从行号HeaderLines + 1
。后续调用对象保持阅读线紧跟着前面读。调用重置
从线将继续阅读HeaderLines + 1
。分隔符
字用于分离样本来自不同渠道的同时。在这种情况下,分隔符也用于确定数据通道存储在文件的数量。对象是第一次运行时,对象的数量分隔符
行字符HeaderLines + 1
说,numDel
。然后每次即时,对象读取numChan = numDel + 1
数值与格式DataFormat
。矩阵算法返回的大小SamplesPerFrame
——- - - - - -numChan
。SamplesPerFrame
——每个调用对象读取的行数。这个值也是矩阵的行数作为输出返回。当最后一个可用的数据行,可能有少于所需的SamplesPerFrame
。在这种情况下,可用的数据填充零得到一个矩阵的大小SamplesPerFrame
——- - - - - -numChan
。一旦所有的数据读取,算法仅返回0 (SamplesPerFrame numChan)
直到重置
或释放
被称为。PlayCount
——多次读取文件中的数据周期性。如果该对象到达文件的末尾,和文件尚未阅读的次数等于PlayCount
、阅读简历从一开始的数据(线HeaderLines + 1
)。如果文件的最后一行没有提供足够的样本,形成一个完整的输出矩阵的大小SamplesPerFrame
——- - - - - -numChan
,然后使用初始数据帧完成。一旦文件被读取PlayCount
次,返回的输出矩阵算法满是零,和所有调用结束
返回true,除非重置
或释放
被称为。无限循环可用的数据,PlayCount
可以设置为正
。
从文本文件中读取数据,使用更一般的流的方法。这种读取数据的方法也有关处理非常大的数据文件。Preallocate数据帧frameLength
行和2列。
dataFrame = 0 (frameLength 2“单一”);
从文本文件中读取和写入二进制文件,而数据存在于源文本文件。注意方法结束
用于控制while循环的执行。
而(~结束(TxtReader)) dataFrame (,) = TxtReader ();结束发行版(TxtReader)
总结
这个例子演示了如何作者和使用系统对象读取和写入数字数据文件。TextFileReader
和TextFileWriter
可以执行编辑专用文件读写操作。你也可以把这些自定义系统对象与内置的系统对象等dsp.BinaryFileWriter
和dsp.BinaryFileReader
。
有关编写系统对象的更多信息自定义算法,明白了创建系统对象。