Main Content

System object 与 MATLAB 函数

System object 与 MATLAB 函数

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

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

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

此示例说明如何编写仅包含 MATLAB 函数的代码来读取音频数据。

该代码会从文件中读取音频数据、对音频数据进行滤波,并播放滤波后的音频数据。音频数据是按帧读取的。该代码与下一示例中的 System object 代码生成相同的结果,您可对方法进行比较。

找到源音频文件。

fname = 'speech_dft_8kHz.wav';

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

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

定义要使用的滤波器。

b = fir1(160,.15);

初始化滤波器状态。

z = zeros(1,numel(b)-1);

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

frameSize = 1024;
nIdx = 1;

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

while nIdx <= maxSamples(1)-frameSize+1
    audio = audioread(fname,[nIdx nIdx+frameSize-1]);
    [y,z] = filter(b,1,audio,z);
    sound(y,fs);
    nIdx = nIdx+frameSize;
end  

该循环使用显式的索引和状态管理,此方法可能很繁琐且容易出错。您必须详尽了解各种状态,例如大小和数据类型。这种仅包含 MATLAB 的代码存在的另一个问题是,声音函数未设计为实时运行。生成的音频断断续续,几乎听不见。

使用 System object 处理音频数据

此示例说明如何编写 System object 代码来读取音频数据。

该代码使用 DSP System Toolbox™ 软件中的 System object 来从文件中读取音频数据、对音频数据进行滤波,然后播放滤波后的音频数据。该代码与前面显示的 MATLAB 代码生成相同的结果,允许您对方法进行比较。

找到源音频文件。

fname = "speech_dft_8kHz.wav";

定义 System object™ 以读取文件。

audioIn = dsp.AudioFileReader(fname,'OutputDataType','single');

定义 System object 以进行数据滤波。

filtLP = dsp.FIRFilter('Numerator',fir1(160,.15));

定义 System object 以播放滤波后的音频数据。

audioOut = audioDeviceWriter('SampleRate',audioIn.SampleRate);

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

while ~isDone(audioIn)
    audio = audioIn();    % Read audio source file
    y = filtLP(audio);   % Filter the data
    audioOut(y);         % Play the filtered data
end

此 System object 代码避免了仅使用 MATLAB 代码存在的问题。在不需要使用显式索引的情况下,文件读取器对象即可管理数据帧大小,而滤波器可管理状态。音频设备写入器对象会播放每个经过处理的音频帧。