主要内容

系统对象与MATLAB功能

系统对象与MATLAB功能

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

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

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

此示例显示了如何编写用于读取音频数据的仅MATLAB功能代码。

该代码从文件中读取音频数据,对其进行过滤并播放过滤后的音频数据。音频数据以帧读取。该代码在下一个示例中产生与系统对象代码相同的结果,从而可以比较方法。

找到源音频文件。

fname ='Speech_dft_8khz.wav';

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

AudioInfo = AudioInfo(fname);maxSamples = audioinfo.totalsamples;FS = AudioInfo.Samplate;

定义要使用的过滤器。

b = fir1(160,.15);

初始化过滤器状态。

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

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

frameSize = 1024; nIdx = 1;

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

而nidx <= maxSamples(1)-frameize+1 audio = audioread(fname,[nidx nidx+framesize-1]);[y,z] =滤波器(b,1,音频,z);声音(y,fs);nidx = nidx+frameize;结尾

循环使用显式的索引和状态管理nt, which can be a tedious and error-prone approach. You must have detailed knowledge of the states, such as, sizes and data types. Another issue with this MATLAB-only code is that the sound function is not designed to run in real time. The resulting audio is choppy and barely audible.

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

此示例显示了如何编写系统对象代码以读取音频数据。

该代码使用DSP System Toolbox™软件中的系统对象从文件中读取音频数据,过滤,然后播放过滤后的音频数据。该代码与前面显示的MATLAB代码产生相同的结果,从而可以比较方法。

找到源音频文件。

fname =“ speep_dft_8khz.wav”;

Define the System object™ to read the file.

audioin = dsp.audiofilereader(fname,'outputDatatype',,,,'single');

定义系统对象以过滤数据。

filtlp = dsp.firfilter('分子',FIR1(160,.15));

定义系统对象以播放过滤后的音频数据。

AudioOut = AudioDeviceWriter('采样率',audioin.mamplater);

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

尽管〜ISDONE(AUDIOIN)AUDIO = AUDIOIN();%读取音频源文件y = filtlp(音频);%过滤数据AudioOut(y);% Play the filtered data结尾

该系统对象代码避免了仅MATLAB代码中存在的问题。在不需要明确索引的情况下,文件读取器对象在过滤器管理状态时会管理数据框架大小。音频设备作者对象在处理时会播放每个音频框架。