Main Content

使用 System object 在 MATLAB 中进行系统设计

在 MATLAB 中进行系统设计和仿真

通过 System object,您可以在 MATLAB® 中进行系统设计和仿真。您可按下图所示在 MATLAB 中使用 System object。

The process of using System object. First create individual components, followed by configure components, then assemble components into system and finally run the system

  1. 创建单个组件 - 创建要在系统中使用的 System object。创建单个组件。除了工具箱提供的 System object 以外,您还可以创建您自己的 System object。请参阅创建 System object

  2. 配置组件 - 如有必要,可更改这些对象的属性值以便为您的特定系统建立模型。所有 System object™ 属性都具有默认值,您可以使用这些默认值而不必更改它们。请参阅配置组件

  3. 将组件组合到系统中 - 编写一个包含这些 System object 的 MATLAB 程序,并使用 MATLAB 变量作为输入和输出来连接这些对象以对系统进行仿真。请参阅连接 System object

  4. 运行系统 - 运行您的程序。当系统正在运行时,您可以更改可调属性。请参阅运行系统重新配置对象

创建单个组件

此部分中的示例说明如何使用软件中预定义的 System object。如果您使用某个函数来创建并使用 System object,请通过条件代码指定对象创建。条件化创建可以防止在循环中调用该函数时出现错误。您也可以创建您自己的 System object,请参阅创建 System object

此部分说明如何使用 DSP System Toolbox™ 和 Audio Toolbox™ 中的预定义组件来设置您的系统:

  • dsp.AudioFileReader - 读取音频数据文件

  • dsp.FIRFilter - 对音频数据进行滤波

  • audioDeviceWriter - 播放滤波后的音频数据

首先,使用默认的属性设置创建组件对象。

audioIn = dsp.AudioFileReader;
filtLP = dsp.FIRFilter;
audioOut = audioDeviceWriter;

配置组件

何时配置组件

如果您在创建对象时未设置其属性并且不想使用默认值,则必须显式设置这些属性。某些属性允许您在系统正在运行时更改其值。有关信息,请参阅重新配置对象

大多数属性都是相互独立的。但是,某些 System object 属性会启用或禁用其他属性,或者限制其他属性的值。为避免出现错误或警告,您应先设置控制属性,然后再设置从属属性。

显示组件属性值

要显示某个对象的当前属性值,请在命令行中键入该对象的句柄名称(如 audioIn)。要显示特定属性的值,请键入 objecthandle.propertyname(如 audioIn.FileName)。

配置组件属性值

此部分说明如何通过设置组件对象的属性来为您的系统配置组件。

如果您在配置组件之前已单独创建了组件,请按照此过程操作。您也可以同时创建和配置组件,如后面的示例所述。

对于文件读取器对象,指定要读取的文件并设置输出数据类型。

对于滤波器对象,使用 fir1 函数(用于指定低通滤波器阶数和截止频率)指定滤波器分子系数。

对于音频设备写入器对象,指定采样率。在本示例中,使用相同的采样率作为输入数据。

audioIn.Filename = "speech_dft_8kHz.wav";
audioIn.OutputDataType = "single";
filtLP.Numerator = fir1(160,.15);
audioOut.SampleRate = audioIn.SampleRate;

同时创建和配置组件

此示例说明如何同时创建 System object 组件和配置所需属性。使用 'Name', Value 对组参数指定每个属性。

创建文件读取器对象、指定要读取的文件并设置输出数据类型。

audioIn = dsp.AudioFileReader("speech_dft_8kHz.wav",...
                              'OutputDataType',"single");

创建滤波器对象,然后使用 fir1 函数指定滤波器分子。指定 fir1 函数的低通滤波器阶数和截止频率。

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

创建音频播放器对象,然后将采样率设置为与输入数据相同的采样率。

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

将组件组合到系统中

连接 System object

当您确定了所需组件并已创建和配置 System object 之后,请组装您的系统。您可以像其他 MATLAB 变量一样使用 System object,并将它们包含在 MATLAB 代码中。您可以在 System object 中传递 MATLAB 变量。

使用 System object 和使用函数的主要区别在于 System object 使用一个两步骤的过程。首先,创建相应对象并设置其参数,然后运行该对象。运行该对象会将其初始化并控制系统的数据流和状态管理。通常在代码循环中调用 System object。

您可以使用某个对象的输出作为另一个对象的输入。对于某些 System object,您可使用这些对象的属性来更改输入或输出。要验证是否正在使用合适数目的输入和输出,可以对任何 System object 使用 narginnargout。有关所有可用的 System object 函数的信息,请参阅System object 函数

连接系统中的组件

此部分演示了如何将组件连接在一起以读取、滤波和播放音频数据文件。while 循环使用 isDone 函数来完整读取整个文件。

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

运行系统

通过在命令行下直接键入或运行包含程序的文件来运行代码。当您运行系统代码时,数据是通过您的对象来处理的。

当系统正在运行时您无法更改的内容

首次调用 System object 时会初始化并运行该对象。当 System object 已开始处理数据时,您不能更改不可调属性。

根据 System object 的不同,其他设定也可能受到限制:

  • 输入大小

  • 输入复/实性

  • 输入数据类型

  • 可调属性数据类型

  • 离散状态数据类型

如果 System object 作者对这些设定进行了限制,则您在 System object 使用期间尝试更改这些设定会出错。

重新配置对象

更改属性

当 System object 已开始处理数据时,您不能更改不可调属性。您可以对任何 System object 使用 isLocked 以验证对象是否正在处理数据。处理完成后,您可以使用 release 函数释放资源并允许更改不可调属性。

某些对象属性为可调属性,这使您能够对它们进行更改,即使对象在使用中也是如此。大多数 System object 属性是不可调属性。请参阅对象的参考页以确定单个属性是否为可调属性。

更改输入复/实性、维度或数据类型

在对象使用期间,在您调用算法后,某些 System object 不允许更改输入复/实性、大小或数据类型。如果 System object 对这些设定进行了限制,您可以调用 release 来更改这些设定。调用 release 还会重置 System object 的其他方面,例如状态和离散状态。

更改系统中的可调属性

此示例说明如何在代码运行时通过修改滤波器对象的 Numerator 属性,将滤波器类型更改为高通滤波器。更改将在下次调用该对象时生效。

reset(audioIn);% Reset audio file
Wn = [0.05,0.1,0.15,0.2];
for x=1:4000
    Wn_X = ceil(x/1000);
    filtLP.Numerator = fir1(160,Wn(Wn_X),'high');
    audio = audioIn();    % Read audio source file
    y = filtLP(audio);    % Filter the data
    audioOut(y);          % Play the filtered data
end