创建新的文件系统对象的输入和输出
这个例子展示了如何创建和使用两个不同的系统对象,以促进在MATLAB的数据流:dspdemo.TextFileReader
和dspdemo.TextFileWriter
。
讨论的对象,在本例中解决许多现实使用情况下,他们可以定制实现先进和更专业的任务。
介绍
这个例子展示了如何创建和使用新型的系统对象文件阅读和写作。在内部,这些系统对象使用标准的低级文件I / O函数可以在MATLAB(如。fscanf
,流
,从文件中读
,写入文件
)。通过抽象掉大部分使用这些功能的细节,他们的目标是使阅读和写作的任务流数据更简单和更有效率。
这个例子包括使用一些高级结构作者系统对象。对于一个更基本的创作系统概论对象,请参考一节中的示例定义新的系统对象DSP系统工具箱的文档。
系统对象™接口
来自MATLAB系统对象类matlab.System
。因此,系统对象继承一个共同的公共接口,其中包括以下标准方法:
设置
——初始化对象,通常一开始的模拟重置
——明确的对象的内部状态,把它带回其默认post-initialization地位一步
——执行对象的核心功能,可以接受一些输入和/或返回一些输出释放
——释放任何资源(如内存、硬件或os)内部使用的对象
当你创建新的类型的系统对象,提供具体的实现所有前面的方法来确定其行为。
在这个例子中,我们讨论了以下两个系统的内部结构和使用对象:
类的定义dspdemo.TextFileReader
系统所有对象共享一个通用的结构在前面的列表。例如dspdemo.TextFileReader
包括以下部分
1。类定义声明,这意味着这个类是来自两个matlab.System
和matlab.system.mixin.FiniteSource
。
classdef TextFileReader < matlab。系统& matlab.system.mixin.FiniteSource
matlab.System
是必需的,并且是所有系统的基类对象matlab.system.mixin.FiniteSource
显示这个类是一个信号源与有限数量的数据样本。这意味着,除了通常的接口,系统对象也将暴露方法结束。结束时返回true对象达到可用数据的结束。
2。公共属性。在这种情况下,两个是nontunable(他们无法改变后第一次调用步骤),都有一个默认值。默认值被分配到相应的属性,当没有其他由用户指定。公共属性可以改变由用户调整对象的行为,他或她的特定应用程序。
属性(Nontunable) = ' tempfile文件名。txt”HeaderLines = 4
属性DataFormat = % g的分隔符=”、“SamplesPerFrame = 1024 PlayCount = 1
3所示。大量的私人性质。这些用户是不可见的,可以用于许多目的,包括
只是偶尔握紧值计算(如在初始化时,当
设置
被称为或者当一步
被称为第一次),然后被后续调用一步
。这可以节省重新计算他们在运行时,因此提高核心功能的性能定义对象的内部状态。例如
pNumEofReached
存储的文件尾的次数指标达成
属性(访问=私人)pFID = 1 pNumChannels pLineFormat pNumEofReached = 0
4所示。一个构造函数。这就是当一个新实例dspdemo.TextDataReader
是由用户创建的。调用的方法找
在构造函数允许用户设置的属性对象通过提供在建筑名称-值对。
方法函数obj = TextFileReader(变长度输入宗量)找(obj,输入参数个数,变长度输入宗量{:});结束结束
5。覆盖的方法matlab.System
基类。系统所有对象共有的公共方法都有相应的保护方法,他们在内部调用。这些保护方法的名称包括一个Impl
后缀。他们可以在定义类来实现项目的具体行为特定的系统对象。
更多信息之间的通信标准的公共方法和它们的内部实现,请参考计时方法。
例如,特定的实现方法覆盖dspdemo.TextFileReader
是
setupImpl
resetImpl
stepImpl
releaseImpl
isDoneImpl
processTunedPropertiesImpl
loadObjectImpl
saveObjectImpl
6。私有方法。这些方法只是从在其他访问同一个类的方法。他们可以用来做其余的代码更加可读。他们还可以提高代码的可重用性,由分组单独例程代码中多次使用类的不同部分。
读写数据,介绍的例子
接下来的代码给出了一个简单的演示如何使用这些新的对象。以下任务
创建一个文本文件包含两个不同的正弦信号使用的样品
dspdemo.TextFileWriter
从文本文件中读取的
dspdemo.TextFileReader
和写入另一个文件以二进制形式,这一次使用dsp.BinaryFileWriter
从新的二进制文件读取信号样本周期使用
dsp.BinaryFileReader
和分析结果图形化。
创建一个简单的文本文件包含所需的数据
首先,创建一个新的文本文件来存储两个正弦信号频率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);
存储信号到一个文本文件,创建一个文本文件的一个实例的作家。的构造函数dspdemo.TextFileWriter
需要目标文件的名字和一些可选的参数,可以通过名称-值对。
TxtWriter = dspdemo.TextFileWriter (“文件名”,“sinewaves.txt”,…“头”fileheader)% #好< NOPTS >
TxtWriter = dspdemo。TextFileWriter属性:文件名:“sinewaves。txt的头:“下面包含两个正弦曲线的800个样本,…DataFormat: %。分隔符:18 g”、“
dspdemo.TextFileWriter
将数据写入delimiter-separated ASCII文件。其公共属性包括以下
文件名
:文件的名称。如果带有这个名字的文件已经存在,覆盖。操作开始时,对象写入文件后立即开始的头,然后添加新数据在每个后续调用步骤,直到它被释放。调用重置恢复文件的写作从一开始。头
:字符串,通常由多个行和终止由换行符(\ n
)。这是由用户指定,可以修改嵌入可读信息,描述了实际的数据。DataFormat
:用于存储每个数据样本的格式。这可以采取任何价值分配中转换说明符formatSpec
字符串使用内置的MATLAB函数流
。DataFormat
适用于所有通道写入文件。此属性的默认值“% .18g”
,它允许双精度浮点数据保存在精度。分隔符
:字符用于分离样本来自不同渠道的同时。每一行的即时书面文件映射到一个时间,和它包含尽可能多的样本作为输入提供渠道的数量(即矩阵的列数输入传递给一步
)。
所有可用的数据写入文件,一个电话一步
可以使用如下
%写入文件的数据作为输入%注意:| TxtWriter(数据)|相当于(TxtWriter、数据)| |一步TxtWriter(数据)%版本控制的文件发行版(TxtWriter)
现在的数据是存储在新文件。可视地查看文件类型编辑(“sinewaves.txt”)
。因为头,注意数据从4号线开始,之后的三行标题。
在这个简单的例子中,整个信号的长度很小,它适合舒适系统内存。因此可以创建数据一次性写入一个文件在一个单一的步骤所示。
在某些情况下,这种方法是不可能的或实用。例如数据可能太大,适合一个MATLAB变量(即适用于系统内存太大),或者它可能被创建在一个循环周期,或者从外部源涌入MATLAB。在所有这些情况下,可以方便地将数据流到文件通过一个类似如下的方法
%使用流正弦波发生器来创建一个框架数据的每一步frameLength = 32;SineWave = dsp.SineWave (“频率”(50、60),“SampleRate”fs,…“SamplesPerFrame”,frameLength);%运行所需的迭代次数来创建数据并将其存储到%的文件达峰时间= 10;在这个场景中%写更多的数据t = (0:1 / fs: tmax-1 / fs) ';N =长度(t);data =罪(2 *π* t * f);numCycles = N / frameLength;为k = 1: numCycles dataFrame = SineWave ();TxtWriter (dataFrame)结束%版本控制的文件和正弦波发生器发布(TxtWriter)发布(SineWave)
从现有文本文件读取和写入新的二进制文件
下一步由新创建的数据文件,在阅读和写作中一个新的二进制文件。
从文本文件中读取的,创建的实例dspdemo.TextFileReader
。
%读者创建一个文本文件TxtReader = dspdemo.TextFileReader (“文件名”,“sinewaves.txt”,…“HeaderLines”3,“SamplesPerFrame”frameLength)% #好< NOPTS >
TxtReader = dspdemo。TextFileReader属性:文件名:“sinewaves。txt HeaderLines: 3 DataFormat: ' % g的分隔符:“SamplesPerFrame: 32 PlayCount: 1
dspdemo.TextFileReader
从delimiter-separated ASCII文件读取数值数据。它的属性是相似的dspdemo.TextFileWriter
。遵循的一些差异
HeaderLines
捕获的行数内使用的头文件中指定文件名
。第一次调用一步
开始读取行号HeaderLines + 1
。随后的调用一步
继续阅读线紧跟着前面读。调用重置
从线将继续阅读HeaderLines + 1
。分隔符
再次使用的字符分离样品从不同的渠道同时即时。在这种情况下,它还可以用于确定存储在文件:数据通道的数量一步
首先,对象计数的数量分隔符
行字符HeaderLines + 1
说,numDel
;它然后假设每次即时需要阅读numChan = numDel + 1
数值与格式DataFormat
。一步返回的矩阵大小SamplesPerFrame
xnumChan
。SamplesPerFrame
是由每个调用读取的行数一步
,即矩阵的行数作为输出返回。当最后一个可用的数据行,它可以发生不到所需SamplesPerFrame
。在这种情况下,可用的数据填充零得到一个矩阵的大小SamplesPerFrame
xnumChan
。一旦所有的数据读取,步骤简单的回报0 (SamplesPerFrame numChan)
直到重置
或释放
被称为。PlayCount
的次数的数据文件读取周期性。如果该对象到达文件的末尾,和文件尚未阅读的次数等于PlayCount
、阅读简历从一开始的数据(即线HeaderLines + 1
)。如果文件的最后一行没有提供足够的样本,形成一个完整的输出矩阵的大小SamplesPerFrame
xnumChan
,然后使用初始数据帧完成。一旦文件被读取PlayCount
次,返回的输出矩阵的步骤是零,和所有调用结束
返回true,除非重置或释放。无限循环可用的数据,PlayCount
可以设置为正
。
写信给一个新的二进制文件,创建一个实例dsp.BinaryFileWriter
BinWriter = dsp.BinaryFileWriter (“文件名”,“sinewaves.bin”,…“HeaderStructure”结构(“信息”fileheader));
数据作为输入传递给dsp.BinaryFileWriter
存储使用自己的数据类型。例如一个双精度浮点输入将每个示例使用8个字节。样本数据存储在时间顺序和多种渠道交叉。因此,输入矩阵传递给一步
使用行方法附加到文件(即第一行存储第一、从左到右,然后第二行,等等)。
传输的数据文本文件到二进制文件,使用更一般的流的方法。这也是有关处理非常大的数据文件。
使用单精度浮点%写二进制数据% Preallocate数据帧| frameLength |行和2列dataFrame = 0 (frameLength 2“单一”);%从文本文件中读取和写入二进制文件,同时数据%出现在源文本文件中。注意该方法|结束|使用%控制while循环的执行而(~结束(TxtReader)) dataFrame (,) = TxtReader ();BinWriter (dataFrame)结束%版本控制的文件发布(TxtReader)发布(BinWriter)
读二进制文件内容周期性
sinewaves.bin
持有一个整数的时期为正弦波,即500期50赫兹和600年60赫兹。这样的信号可以阅读周期性和用于生成任意长度的正弦波。在过去的这个演示的一部分dsp.BinaryFileReader
用来做的正是这一点。读取数据,两个正弦波是可视化在时域和他们的产品是在频域分析。
frameLength = 1024;%二进制文件读者创建一个实例BinReader = dsp.BinaryFileReader (“文件名”,“sinewaves.bin”,…“HeaderStructure”结构(“信息”0(元素个数(fileheader),“uint8”)),…“NumChannels”2,…“数据类型”,“单一”,…“SamplesPerFrame”frameLength)% #好< NOPTS >头= BinReader.readHeader.Info;%显示头从文件读取:char(头)
BinReader = dsp。BinaryFileReader属性:文件名:“/ tmp / BR2017bd_694400_188374 / publish_examples0 tpa9f65b0c / sinewaves。本“HeaderStructure: [1 x1 struct] SamplesPerFrame: 1024 NumChannels: 2数据类型:“单一”IsDataComplex:假ans = '下面包含两个正弦曲线的800个样本,频率50 Hz和60赫兹和8 kHz的采样率
的接口dsp.BinaryFileReader
主要是自解释的。以下是值得注意的
HeaderStructure
定义预期的头文件的开始。NumChannels
指定多少交错样品预计每次即时。这也决定了输出矩阵的列数返回的对象。执行时,该对象返回一个矩阵的大小SamplesPerFrame
xNumChannels
,存储在文件存储的方式。
以下帮助创建组件的视觉分析流信号,在时间和频率域
时域可视化的实例dsp.TimeScope
被创建。这是所有数据帧用来情节为正弦波,从文件读取。
TimeScope = dsp.TimeScope (“SampleRate”fs,“时间间隔”,frameLength / fs,…“ShowGrid”,真的,“YLimits”[1],“TimeSpanOverrunAction”,“滚动”);
频域可视化的实例dsp.SpectrumAnalyzer
被创建。这是用于分析的光谱之间的产品两个正弦波,期待两个色调组件(60-50)赫兹(60 + 50 Hz,分别。
因为信号的频率之间的比例和采样率很低,信号首先被摧毁的16倍的一个实例dsp.SampleRateConverter
。这让采样率降至500赫兹的频率成分,使目标信号更容易识别使用标准光谱分析。
RateConverter = dsp.SampleRateConverter (“InputSampleRate”,8000,…“OutputSampleRate”,500,“带宽”,100);%注意单个光谱快照使用以下设置%需要16384的输入样本,远远超过800年的实际存储在%的文件SpectAnalyzer = dsp.SpectrumAnalyzer (…“FrequencyResolutionMethod”,“WindowLength”,“WindowLength”,1024,…“FFTLengthSource”,“属性”,“FFTLength”,2048,“SampleRate”,500,…“PlotAsTwoSidedSpectrum”假的,“SpectralAverages”16);
以下while循环读取数据从文件读取和可视化的信号。它运行10分钟的模拟时间,不管实际数量的样本文件。故事情节的两个流可视化匹配预期的行为。
simtime = 0;%循环运行,直到仿真时间小于10 * 60秒而(simtime < 600)%回放文件如果没有更多的新样品如果结束(BinReader)重置(BinReader)结束%读取二进制文件,每帧1024个样本dataFrame = BinReader ();%可视化的单帧通道在时域TimeScope (dataFrame)%毁掉两个渠道,一个新的采样率为500 Hz,%导致新一帧长度的64个样本dataDecimated = RateConverter (dataFrame);%分析两个正弦波的产品在频域中,%积累多个数据帧内部和更新%可视化准备好后SpectAnalyzer (prod (dataDecimated 2))%更新仿真时间的价值simtime = simtime + frameLength / fs;结束%版本控制的文件和范围发布(BinReader)发布(RateConverter)发布(TimeScope)发布(SpectAnalyzer)
总结
这个例子演示了如何作者和使用系统对象读取和写入数字数据文件。所有对象(即使用。dspdemo.TextFileReader
,dspdemo.TextFileWriter
,dsp.BinaryFileReader
,dsp.BinaryFileWriter
)可以执行编辑专用文件读写操作。
有关编写系统对象的更多信息自定义算法,明白了创建系统对象。