文档

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

这个例子展示了如何创建和使用两个不同的系统对象,以促进在MATLAB的数据流:dspdemo.TextFileReaderdspdemo.TextFileWriter

讨论的对象,在本例中解决许多现实使用情况下,他们可以定制实现先进和更专业的任务。

介绍

这个例子展示了如何创建和使用新型的系统对象文件阅读和写作。在内部,这些系统对象使用标准的低级文件I / O函数可以在MATLAB(如。fscanf,,从文件中读,写入文件)。通过抽象掉大部分使用这些功能的细节,他们的目标是使阅读和写作的任务流数据更简单和更有效率。

这个例子包括使用一些高级结构作者系统对象。对于一个更基本的创作系统概论对象,请参考一节中的示例定义新的系统对象DSP系统工具箱的文档。

系统对象™接口

来自MATLAB系统对象类matlab.System。因此,系统对象继承一个共同的公共接口,其中包括以下标准方法:

  • 设置——初始化对象,通常一开始的模拟

  • 重置——明确的对象的内部状态,把它带回其默认post-initialization地位

  • 一步——执行对象的核心功能,可以接受一些输入和/或返回一些输出

  • 释放——释放任何资源(如内存、硬件或os)内部使用的对象

当你创建新的类型的系统对象,提供具体的实现所有前面的方法来确定其行为。

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

类的定义dspdemo.TextFileReader

系统所有对象共享一个通用的结构在前面的列表。例如dspdemo.TextFileReader包括以下部分

1。类定义声明,这意味着这个类是来自两个matlab.Systemmatlab.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。一步返回的矩阵大小SamplesPerFramexnumChan

  • SamplesPerFrame是由每个调用读取的行数一步,即矩阵的行数作为输出返回。当最后一个可用的数据行,它可以发生不到所需SamplesPerFrame。在这种情况下,可用的数据填充零得到一个矩阵的大小SamplesPerFramexnumChan。一旦所有的数据读取,步骤简单的回报0 (SamplesPerFrame numChan)直到重置释放被称为。

  • PlayCount的次数的数据文件读取周期性。如果该对象到达文件的末尾,和文件尚未阅读的次数等于PlayCount、阅读简历从一开始的数据(即线HeaderLines + 1)。如果文件的最后一行没有提供足够的样本,形成一个完整的输出矩阵的大小SamplesPerFramexnumChan,然后使用初始数据帧完成。一旦文件被读取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指定多少交错样品预计每次即时。这也决定了输出矩阵的列数返回的对象。执行时,该对象返回一个矩阵的大小SamplesPerFramexNumChannels,存储在文件存储的方式。

以下帮助创建组件的视觉分析流信号,在时间和频率域

时域可视化的实例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)可以执行编辑专用文件读写操作。

有关编写系统对象的更多信息自定义算法,明白了创建系统对象

这个主题有帮助吗?