主要内容

系统对象vs MATLAB函数

系统对象与MATLAB函数

许多系统对象都有MATLAB®函数。为了实现简单的一次性计算,可以使用MATLAB函数。但是,如果需要设计和模拟具有许多组件的系统,请使用system对象。如果你的计算需要管理内部状态,有随时间变化的输入或处理大数据流,使用System对象也是合适的。

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

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

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

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

定位源音频文件。

帧=“speech_dft_8kHz.wav”

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

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

定义要使用的筛选器。

B = fir1(160,.15);

初始化筛选器状态。

Z = 0(1,数字(b)-1);

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

frameSize = 1024;nIdx = 1;

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

当nIdx <= maxSamples(1)-frameSize+1 audio = audioread(fname,[nIdx nIdx+frameSize-1]);[y,z] = filter(b,1,audio,z);声音(y, fs);nIdx = nIdx+frameSize;结束

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

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

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

该代码使用来自DSP System Toolbox™软件的System对象从文件中读取音频数据,过滤它,然后播放过滤后的音频数据。此代码产生的结果与前面显示的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) audio = audioIn();读取音频源文件y = filtLP(音频);过滤数据audioOut (y);播放过滤后的数据结束

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