主要内容

系统对象vs MATLAB函数

系统对象与MATLAB函数

许多系统对象都有MATLAB®函数。对于简单的一次性计算,使用MATLAB函数。但是,如果您需要设计和模拟一个包含许多组件的系统,请使用system对象。如果您的计算需要管理内部状态,需要随时间变化的输入,或者需要处理大数据流,那么使用System对象也是合适的。

仅使用MATLAB函数构建具有不同执行阶段和内部状态的动态系统需要复杂的编程。您需要代码来初始化系统、验证数据、管理内部状态以及重置和终止系统。系统对象在执行过程中自动执行许多这些管理操作。通过将程序中的System对象与其他MATLAB函数相结合,可以简化代码并提高效率。

处理音频数据仅使用MATLAB函数代码

这个例子展示了如何编写MATLAB函数代码来读取音频数据。

代码从文件中读取音频数据,过滤它,并播放过滤后的音频数据。音频数据以帧的形式读取。这段代码产生的结果与下一个示例中的System对象代码相同,允许您比较方法。

定位源音频文件。

帧=“speech_dft_8kHz.wav”

从源文件中获取样本总数和采样率。

audioInfo = audioInfo(帧);maxSamples = audioInfo.TotalSamples;fs = audioInfo.SampleRate;

定义要使用的筛选器。

b = fir1(160 .15点);

初始化过滤器状态。

z = 0(1,元素个数(b) (1);

定义一次要处理的音频数据量,并初始化while循环索引。

frameSize = 1024;nIdx = 1;

定义while循环来处理音频数据。

while nIdx <= maxSamples(1)-frameSize+1 audio = audioread(fname,[nIdx nIdx+frameSize-1]); / /输出[y, z] =过滤器(b, 1,音频,z);声音(y, fs);nIdx = nIdx + frameSize;结束

循环使用显式索引和状态管理,这可能是一种乏味且容易出错的方法。您必须对状态有详细的了解,例如,大小和数据类型。这个仅使用matlab的代码的另一个问题是,声音函数不是设计为实时运行的。由此产生的声音断断续续,几乎听不见。

使用系统对象处理音频数据

这个例子展示了如何编写System对象代码来读取音频数据。

该代码使用DSP系统工具箱™软件中的系统对象从文件中读取音频数据,过滤它,然后播放过滤后的音频数据。此代码产生与前面显示的MATLAB代码相同的结果,允许您比较方法。

定位源音频文件。

帧=“speech_dft_8kHz.wav”

定义System对象™来读取文件。

audioIn = dsp。AudioFileReader(帧,“OutputDataType”“单一”);

定义System对象来过滤数据。

filtLP = dsp。FIRFilter (“分子”fir1(160 .15点));

定义System对象来播放过滤后的音频数据。

audioOut = audioDeviceWriter (“SampleRate”, audioIn.SampleRate);

定义while循环来处理音频数据。

~isDone(audioIn)音频= audioIn();%读取音频源文件y = filtLP(音频);%过滤数据audioOut (y);播放过滤后的数据结束

这个系统对象代码避免了仅在matlab代码中出现的问题。在不需要显式索引的情况下,文件读取器对象管理数据帧大小,而过滤器管理状态。音频设备写入器对象在音频帧被处理时播放它。