主要内容

使用音频信号滤波MATLAB代码

学习目标

在本教程中,您将学习如何:

  • 使用MATLAB函数MATLAB添加块®Simulink函数金宝app®用于建模、仿真和部署到嵌入式处理器的模型。

    这种功能对于用MATLAB的文本语言而不是Simulink的图形语言来编码算法很有用。金宝app

  • 使用coder.extrinsic调用MATLAB代码MATLAB函数块。

    此功能允许您从Simulink调用现有的MATLAB代码,而无需首先使这些代码适合于代码生成,从而允许快速原型化。金宝app

  • 检查现有的MATLAB代码是否适合代码生成。

  • 转换MATLAB算法从批处理到流。

  • 在适合代码生成的代码中使用持久变量。

    您需要使过滤器权重持久,以便过滤器算法不会在每次运行时重置它们的值。

教程的先决条件

你需要知道的

要完成本教程,您应该对MATLAB软件有基本的熟悉。您还应该了解如何创建基本的Simulink模型以及如何模拟该模型。金宝app有关更多信息,请参见创建一个简单的模型

所需的产品下载188bet金宝搏

要完成本教程,您必须安装以下产品:下载188bet金宝搏

  • MATLAB

  • MATLAB编码器™

  • 金宝app

  • 金宝app仿真软件编码器

  • DSP系统工具箱

  • C编译器

    有关受支持的编译器的列表,请金宝app参见金宝app支持编译器

有关安装MathWorks的说明®下载188bet金宝搏产品,请参考安装文档。如果您已经安装了MATLAB并想要检查安装了哪些MathWorks产品,请输入下载188bet金宝搏版本在MATLAB命令窗口中。有关安装和设置C编译器的说明,请参见设置C或c++编译器(MATLAB编码器)

示例:LMS Filter

描述

最小均方(LMS)滤波器是一种自适应滤波器,它根据优化算法调整其传递函数。您向过滤器提供所需信号的示例以及输入信号。然后滤波器计算滤波器权重或系数,产生输出信号和所需信号之间误差的最小均方。

本例使用LMS滤波器去除音乐录音中的噪声。有两个输入。第一个输入是失真的信号:音乐录音加上过滤后的噪音。第二个输入是需要的信号:未经滤波的噪声。滤波器的作用是消除输出信号和所需信号之间的差值,并输出差值,在这种情况下,就是干净的音乐录音。当你开始模拟时,你会同时听到噪音和音乐。随着时间的推移,自适应滤波器会去除噪音,所以你只听到音乐。

算法

本例使用最小均方(LMS)算法从输入信号中去除噪声。LMS算法计算滤波输出、滤波误差和给定失真和期望信号的滤波权重。

在本教程的开始,LMS算法使用批处理过程来过滤音频输入。该算法适用于MATLAB,在MATLAB中,您可能会加载整个信号并一次性处理它。但是,批处理不适合实时处理信号。在学习本教程的过程中,您将改进过滤器的设计,以将算法从基于批处理转换为基于流的处理。

该算法的基线函数签名为:

函数[signal_out, err, weights] =…lms_01 (signal_in所需)

过滤在以下循环中执行:

使用卷积计算输出样本:signal_out(n,ch) = weights' * signal_in(n:n+FilterLength-1,ch);%更新过滤器系数:err(n,ch) = desired(n,ch) - signal_out(n,ch);weights = weights + mu*err(n,ch)*signal_in(n:n+FilterLength-1,ch);结束
在哪里SignalLength是输入信号的长度,FilterLength是滤镜长度,和μ是自适应步长。

什么是适应步长?

过滤过程

过滤过程分为三个阶段:

  • 卷积

    滤波器的卷积是在:

    signal_out(n,ch) = weights' * signal_in(n:n+FilterLength-1,ch);

    什么是卷积?

  • 误差计算

    误差是期望信号和输出信号之间的差值:

    Err (n,ch) = desired(n,ch) - signal_out(n,ch);

  • 适应

    滤波器权重的新值是滤波器权重的旧值加上基于误差信号、失真信号和自适应步长的校正因子:

    weights = weights + mu*err(n,ch)*signal_in(n:n+FilterLength-1,ch);

参考

微积分,西蒙。自适应滤波理论.上马鞍河,新泽西州:Prentice-Hall, Inc., 1996。

教程文件

关于教程文件

本教程使用以下文件:

  • 金宝app本教程的每个步骤的Simulink模型文件。

  • MATLAB代码文件的每一步的例子。

    在本教程中,您将使用Simulink模型,这些模型调用包含简单最小均方(LMS)金宝app滤波器算法的MATLAB文件。

文件位置

教程文件可以在以下文件夹中找到:docroot \工具箱\仿真软金宝app件\ \ lms例子.要运行本教程,必须将这些文件复制到本地文件夹。有关说明,请参见本地复制文件

文件的名称和描述

类型 的名字 描述
MATLAB文件 lms_01 基线MATLAB批量滤波器的实现。不适合代码生成。
lms_02 过滤器从批量修改为流。
lms_03 带有重置和适应控件的基于帧的流过滤器。
lms_04 带有重置和适应控件的基于帧的流过滤器。适合代码生成。
lms_05 禁用代码生成的内联。
lms_06 演示使用coder.nullcopy
金宝appSimulink模型文件 acoustic_environment 金宝appSimulink模型,提供了声环境的概述。
noise_cancel_00 金宝app没有Simulink模型MATLAB函数块。
noise_cancel_01 完整的noise_cancel_00模型,包括MATLAB函数块。
noise_cancel_02 金宝app使用的Simulink模型lms_02.m
noise_cancel_03 金宝app使用的Simulink模型lms_03.m
noise_cancel_04 金宝app使用的Simulink模型lms_04.m
noise_cancel_05 金宝app使用的Simulink模型lms_05.m
noise_cancel_06 金宝app使用的Simulink模型lms_06.m
design_templates 金宝app包含适应和重置控件的Simulink模型。

教程的步骤

本地复制文件

将教程文件复制到本地文件夹:

  1. 创建本地金宝搏官方网站文件夹,例如,c: \ \ lms \金宝搏官方网站测试解决方案

  2. 改为docroot \工具箱\仿真软金宝app件\例子文件夹中。在MATLAB命令行输入:

    Cd (fullfile(docroot, 'toolbox', 金宝app'simulink', 'examples'))

  3. 的内容lms子文件夹金宝搏官方网站目录的完整路径名金宝搏官方网站文件夹:

    拷贝文件(lms,金宝搏官方网站”)
    你的金宝搏官方网站文件夹现在包含了本教程的完整解决方案集。金宝搏官方网站如果您不想为每个任务执行这些步骤,您可以查看提供的解决方案,以查看代码的外观。

  4. 创建本地工作文件夹,例如,c: \ \ lms \测试工作

  5. 从您的金宝搏官方网站文件夹到您的工作文件夹中。

    • lms_01

    • lms_02

    • noise_cancel_00

    • acoustic_environment

    • design_templates

    你的工作文件夹现在包含启动所需的所有文件。

    现在可以设置C编译器了。

设置C编译器

建立你的MATLAB函数Block需要一个受支持的编译器。金宝appMATLAB自动选择一个作为默认编译器。如果您的系统上安装了多个支持matlab的编译器,则可以金宝app使用墨西哥人设置命令。看到更改默认编译器还有名单金宝app支持编译器

运行acoustic_environment模型

运行acoustic_environment模型提供的教程,以理解您正在尝试解决使用LMS过滤器的问题。该模型将带限白噪声添加到音频信号中,并将产生的信号输出到扬声器。

模拟模型:

  1. 打开acoustic_environment在Simulink金宝app中的模型:

    1. 将MATLAB当前文件夹设置为包含本教程工作文件的文件夹。在MATLAB命令行输入:

      cd工作
      在哪里工作包含文件的文件夹的完整路径名称。看到查找文件和文件夹获取更多信息。

    2. 在MATLAB命令行输入:

      acoustic_environment

  2. 确保扬声器开着。

  3. 若要模拟模型,请在Simulink模型窗口中单击金宝app运行

    当Si金宝appmulink运行模型时,你会听到被噪声扭曲的音频信号。

  4. 在模拟运行时,双击手动开关选择音频源。

    现在您可以听到所需的音频输入,没有任何噪音。

本教程的目标是使用MATLAB的LMS滤波算法从有噪声的音频信号中去除噪声。你可以加上aMATLAB函数块到模型中,并从该块调用MATLAB代码。

添加MATLAB函数块到您的模型

要自己修改模型和代码,请完成本节中的练习。否则,打开提供的模型noise_cancel_01在你的金宝搏官方网站子文件夹查看修改后的模型。

对于本教程,您将添加MATLAB函数块到noise_cancel_00随教程提供的模型。在实践中,您必须从一个空的Simulink模型开始开发自己的测试平台。金宝app

要添加MATLAB函数块到noise_cancel_00模型:

  1. 开放noise_cancel_00在仿真金宝app软件。

    noise_cancel_00

  2. 添加一个MATLAB函数块到模型:

    1. 在MATLAB命令行中,键入slLibraryBrowser打开Simulink L金宝appibrary浏览器。

    2. 从Simulink库列表中,选择金宝app用户定义函数图书馆。

    3. 单击MATLAB函数块并将其拖到noise_cancel_00模型。将该块放在红色文本注释的上方在这里放置MATLAB函数块

    4. 从模型中删除红色文本注释。

    5. 在当前文件夹中保存模型为noise_cancel_01

      最佳实践-保存增量代码更新

打电话给你的MATLAB代码作为快速原型的外部函数

在本部分教程中,您将使用coder.extrinsic函数调用MATLAB代码MATLAB函数块快速原型。

为什么叫MATLAB作为外部函数的代码?将MATLAB代码作为外部函数调用可以提供以下好处:

  • 对于快速原型,您不必使MATLAB代码适合代码生成。

  • 使用coder.extrinsic使您能够在MATLAB中调试MATLAB代码。属性中添加一个或多个断点lms_01.m文件,然后在Simulink中启动仿真。金宝app当MATLAB执行引擎遇到断点时,它会暂时停止执行,以便您可以检查MATLAB工作空间并查看内存中所有变量的当前值。有关调试MATLAB代码的更多信息,请参见调试MATLAB程序

如何拨打电话MATLAB作为外部函数的代码。调用您的MATLAB代码从MATLAB函数布洛克:

  1. 双击MATLAB函数块,打开MATLAB函数块编辑器。

  2. 删除MATLAB函数块编辑器中显示的默认代码。

  3. 将以下代码复制到MATLAB函数块。

    函数[Signal_Out, Weights] = LMS(Noise_In, Signal_In) %#codegen %外部变量:code . Extrinsic ('lms_01');%计算LMS: [~, Signal_Out, Weights] = lms_01(Noise_In, Signal_In);结束

    为什么使用波浪号(~)操作符?

  4. 保存模型。

    lms_01函数的输入Noise_In而且Signal_In现在显示为块的输入端口和函数的输出Signal_Out而且权重显示为输出端口。

连接MATLAB函数块输入输出

  1. 连接MATLAB函数阻塞输入和输出,使您的模型看起来像这样。

  2. MATLAB函数块代码,通过在外部调用后添加以下代码预分配输出:

    %输出:Signal_Out =零(大小(Signal_In));权重= 0 (32,1);
    的大小权重设置为与声环境子系统中数字滤波器的分子系数相匹配。

    为什么要预分配输出?

    修改MATLAB函数块代码

  3. 保存模型。

    现在可以检查模型中的错误了。

模拟noise_cancel_01模型

模拟模型:

  1. 确保你能看到时间域情节。

    要查看图,请在noise_cancel_01模型,打开分析与可视化块,然后打开时间域块。

  2. 2 .在Sim金宝appulink模型窗口中,单击运行

    当Si金宝appmulink运行模型时,您可以看到和听到输出。最初,你听到的音频信号被噪音扭曲了。然后滤光片逐渐减弱噪音,直到你只听到音乐播放,几乎没有噪音残留。两秒钟后,你再次听到失真的噪声信号,滤波器再次减弱了噪声。这个循环不断重复。

    下面的MATLAB图显示了这个循环。

  3. 停止模拟。

为什么滤镜每2秒重置一次?

修改过滤器以使用流

什么是流媒体?流过滤器被反复调用,以处理固定大小的输入数据块,直到它处理完整个输入信号。帧大小可以小到单个样本,在这种情况下,过滤器将在基于样本的模式下运行,或者高达几千个样本,用于基于帧的处理。

为什么使用流媒体?滤波算法的设计lms_01具有以下缺点:

  • 该算法没有有效地使用内存。

    在程序的生命周期内为每个输入信号预分配固定数量的内存量意味着分配的内存量大于使用的内存量。

  • 在调用函数时,必须知道输入信号的大小。

    如果输入信号是实时到达的,或者是作为样本流到达的,那么在将整个信号作为批处理传递给滤波器之前,您必须等待累积整个信号。

  • 信号大小限制为最大大小。

在嵌入式应用程序中,过滤器可能正在处理连续的输入流。因此,输入信号可以大大超过在批处理模式下工作的滤波器可能处理的最大长度。为了使滤波器适用于任何长度的信号,它必须实时运行。一个解决方案是将过滤器从基于批处理转换为基于流的处理。

查看修改后的内容MATLAB代码。向流媒体的转换包括:

  • 引入先进先出(FIFO)队列

    FIFO队列充当临时存储缓冲区,用于保存来自输入数据流的少量样本。FIFO队列所持有的采样数必须与滤波器脉冲响应中的采样数完全相同,这样函数才能在滤波器系数与输入信号之间进行卷积运算。

  • 使FIFO队列和过滤器权重持久

    该滤波器被反复调用,直到它处理完整个输入信号。因此,FIFO队列和过滤器权重需要保持不变,以便适应过程不必在每次后续调用函数之后重新开始。

打开提供的文件lms_02.m在你的工作子文件夹查看修改后的算法。

lms_02.m的内容

过滤算法更改摘要。注意以下对过滤算法的重要更改:

  • 过滤器权重和FIFO队列被声明为持久:

    持续的权重;坚持先进先出;

  • FIFO队列初始化:

    fifo = 0 (FilterLength,ChannelCount);

  • FIFO队列用于过滤器更新循环:

    % For每个通道:For ch = 1:ChannelCount % For每个采样时间:For n = 1:FrameSize %更新FIFO移位寄存器:FIFO (1:FilterLength-1,ch) = FIFO (2:FilterLength,ch);fifo(FilterLength,ch) = signal_in(n,ch);使用卷积计算输出样本:signal_out(n,ch) = weights' * fifo(:,ch);%更新过滤器系数:err(n,ch) = desired(n,ch) - signal_out(n,ch);权重=权重+ mu*err(n,ch)*fifo(:,ch);结束结束

  • 不能输出持久变量。因此,一个新的变量,weights_out,用于输出过滤器权重:

    函数[signal_out, err, weights_out] =…lms_02(扭曲,想要)
    Weights_out =权重;

修改您的模型以调用更新的算法。要自己修改模型,请完成本节中的练习。否则,打开提供的模型noise_cancel_02在你的金宝搏官方网站子文件夹查看修改后的模型。

  1. noise_cancel_01模型,双击MATLAB函数块,打开MATLAB函数块编辑器。

  2. 修改MATLAB函数要调用的块代码lms_02

    1. 修改外部调用。

      % external: code . Extrinsic ('lms_02');

    2. 修改对筛选算法的调用。

      %计算LMS: [~, Signal_Out, Weights] = lms_02(Noise_In, Signal_In);

      修改MATLAB函数块代码

  3. 改变帧大小1638464,表示更现实的值。

    1. 在模型窗口内右键单击并选择模型属性

    2. 选择回调选项卡。

    3. 模型的回调列表中,选择InitFcn

    4. 更改的值FrameSize64

    5. 点击应用并关闭对话框。

  4. 将模型另存为noise_cancel_02

模拟流算法。模拟模型:

  1. 确保你能看到时间域情节。

  2. 开始模拟。

    当Si金宝appmulink运行模型时,您可以看到和听到输出。最初,你听到的音频信号被噪音扭曲了。然后,在最初的几秒钟内,过滤器逐渐减弱噪音,直到你只听到音乐播放,几乎没有噪音残留。MATLAB显示了下面的图,显示了滤波器在几秒钟后的收敛。

  3. 停止模拟。

滤波器算法现在适用于Simulink。金宝app您已经准备好详细说明要使用的模型适应而且重置控制。

添加适应和重置控件

为什么添加适应和重置控制?在本部分教程中,您将向筛选器添加Adapt和Reset控件。使用这些控件,您可以打开和关闭过滤。当适应启用时,筛选器将不断更新筛选器权重。当适应禁用时,筛选器权重保持其当前值。如果重置设置时,过滤器将重置过滤器权重。

修改你的MATLAB代码。要自己修改代码,请完成本节中的练习。否则,打开提供的文件lms_03.m在你的金宝搏官方网站子文件夹查看修改后的算法。

修改过滤器代码:

  1. 开放lms_02.m

  2. 设置部分,取代

    If (isempty(weights))
    If (reset || isempty(weights))

  3. 在过滤器循环中,仅当适应

    If adapt weights = weights + mu*err(n,ch)*fifo(:,ch);结束

  4. 方法更改函数签名以使用适应而且重置输入并将函数名更改为lms_03

    函数[signal_out, err, weights_out] =…Lms_03 (signal_in, desired, reset, adapt)

  5. 将文件保存在当前文件夹为lms_03.m

lms_03.m的内容

过滤算法更改摘要

修改您的模型以使用重置和适应控件。要自己修改模型,请完成本节中的练习。否则,打开提供的模型noise_cancel_03在你的金宝搏官方网站子文件夹查看修改后的模型。

  1. 打开noise_cancel_02模型。

  2. 双击MATLAB函数块,打开MATLAB函数块编辑器。

  3. 修改MATLAB函数块代码:

    1. 更新函数声明。

      函数[Signal_Out, Weights] =…LMS(Adapt, Reset, Noise_In, Signal_In)
    2. 更新外部调用。

      coder.extrinsic(“lms_03”);

    3. 更新对LMS算法的调用。

      %计算LMS: [~, Signal_Out, Weights] =…lms_03(Noise_In, Signal_In, Reset, Adapt);

    4. 关闭MATLAB函数块编辑器。

      lms_03函数的输入重置而且适应的输入端口MATLAB函数块。

  4. 打开design_templates模型。

  5. 复制设置块从这个模型到您的noise_cancel_02模型:

    1. design_templates模型菜单,选择编辑>选择所有

    2. 选择编辑>复制

    3. noise_cancel_02模型菜单,选择编辑>粘贴

  6. 将设置子系统的适应和重置输出连接到MATLAB函数块。您的模型现在应该如下所示。

  7. 将模型另存为noise_cancel_03

采用自适应和复位控制的模型仿真。要模拟模型并查看Adapt和Reset控件的效果:

  1. noise_cancel_03模型,查看收敛范围:

    1. 双击分析和可视化子系统。

    2. 双击收敛范围。

  2. 2 .在Sim金宝appulink模型窗口中,单击运行

    金宝appSimulink像以前一样运行模型。在模型运行时,切换Adapt和Reset控件并查看收敛范围,以查看它们对筛选器的影响。

    滤波器收敛于适应而且重置,然后在切换时重置重置.结果可能是这样的:

  3. 停止模拟。

生成代码

你已经证明了你的算法可以在Simulink中工作。金宝app接下来为模型生成代码。在生成代码之前,必须确保您的MATLAB代码适合代码生成。对于代码生成,必须删除对代码的外部调用。

让你的代码适合代码生成。要自己修改模型和代码,请完成本节中的练习。否则,打开提供的模型noise_cancel_04和文件lms_04.m在你的金宝搏官方网站子文件夹查看修改。

  1. 重命名MATLAB函数LMS_Filter.选择注释MATLAB函数以下MATLAB函数将文本替换为LMS_Filter

    的代码生成时MATLAB函数块,金宝app仿真软件编码器使用生成代码中的块的名称。使用一个有意义的名字是很好的习惯。

  2. 在你的noise_cancel_03模型,双击MATLAB函数块。

    打开MATLAB函数块编辑器。

  3. 删除外部声明。

    % external: code . Extrinsic ('lms_03');

  4. 删除输出预分配。

    %输出:Signal_Out =零(大小(Signal_In));权重= 0 (32,1);

  5. 修改对筛选算法的调用。

    %计算LMS: [~, Signal_Out, Weights] =…lms_04(Noise_In, Signal_In, Reset, Adapt);

  6. 将模型另存为noise_cancel_04

  7. 开放lms_03.m

    1. 将函数名修改为lms_04

    2. 属性打开特定于代码生成的错误检查% # codegen函数声明后的编译指令。

      函数[signal_out, err, weights_out] =…Lms_04 (signal_in, desired, reset, adapt) %#代码原

      右上方的代码分析器消息指示器变成红色,表示代码分析器检测到代码生成问题。代码分析器用红色强调违规代码,并在其右侧放置一个红色标记。

  8. 将指针移到第一个红色标记上以查看错误信息。

    代码分析器检测代码生成所需的内容signal_out在下标之前完全定义,不支持通过索引增长可变大小的数据。金宝app

  9. 将指针移到第二个红色标记上,并注意代码分析器检测到相同的错误犯错

  10. 要解决这些错误,可以预先分配输出signal_out而且犯错.在过滤器设置之后添加此代码。

    预分配输出和错误信号:signal_out = 0 (FrameSize,ChannelCount);err = 0 (FrameSize,ChannelCount);

    为什么要预分配输出?

    这两行代码的红色错误标记消失了。代码右上方的代码分析器消息指示器变成绿色,这表明您已经修复了代码分析器检测到的所有错误和警告。

    lms_04.m的内容

  11. 将文件另存为lms_04.m

为noise_cancel_04生成代码

  1. 在生成代码之前,请确保金宝app仿真软件编码器创建代码生成报告。此HTML报告提供了对生成文件列表的轻松访问,其中包含用于生成代码的配置设置的摘要。

    1. 在Simuli金宝appnk模型窗口中建模选项卡上,单击模型设置

    2. 在“配置参数”对话框的左侧窗格中,选择代码生成>报告

    3. 在右侧窗格中,选择创建代码生成报告而且自动打开报表

    4. 点击应用并关闭“配置参数”对话框。

    5. 保存您的模型。

  2. 为LMS Filter子系统生成代码:

    1. 在您的模型中,选择LMS Filter子系统。

    2. 从构建模型工具菜单中,选择构建选定的子系统

      为子系统构建代码对话框。单击构建按钮。

      金宝app仿真软件编码器软件为子系统生成C代码,并打开代码生成报告。

      有关使用代码生成报告的更多信息,请参见生成一个代码生成报告(金宝app仿真软件编码器)

    3. 在代码生成报告的左窗格中,单击LMS_Filter.c链接查看生成的C代码。注意lms_04函数没有代码,因为默认情况下启用了内联。

  3. 修改你的过滤算法禁用内联:

    1. lms_04.m,在函数声明后,添加:

      coder.inline(“不”)

    2. 将函数名更改为lms_05并将文件另存为lms_05.m在当前文件夹中。

    3. 在你的noise_cancel_04模型,双击MATLAB函数块。

      打开MATLAB函数块编辑器。

    4. 修改对要调用的筛选算法的调用lms_05

      %计算LMS: [~, Signal_Out, Weights] =…lms_05(Noise_In, Signal_In, Reset, Adapt);

    5. 将模型另存为noise_cancel_05

  4. 为更新的模型生成代码。

    1. 在模型中,选择LMS Filter子系统。

    2. 从构建模型工具菜单中,选择构建选定的子系统

      为子系统构建代码对话框。

    3. 单击构建按钮。

      金宝app仿真软件编码器软件为子系统生成C代码,并打开代码生成报告。

    4. 在代码生成报告的左窗格中,单击LMS_Filter.c链接查看生成的C代码。

      这一次lms_05函数因为禁用内联而有代码。

      /*本地函数的正向声明*/ static void LMS_Filter_lms_05…(const real_T signal_in[64],const real_T…desired[64], real_T reset, real_T adapt,…real_T signal_out[64],…real_T err[64], real_T weights_out[32]);/* MATLAB函数块:'root/LMS_Filter' */静态void LMS_Filter_lms_05…(const real_T signal_in[64], const real_T…desired[64], real_T reset, real_T adapt,…real_T signal_out[64],…real_T err[64], real_T weights_out[32])

优化LMS滤波算法

本教程的这一部分演示了何时以及如何为变量预分配内存,而不会在生成的代码中初始化内存。

lms_05.m, MATLAB代码不仅声明signal_out而且犯错成为一名FrameSize——- - - - - -ChannelCount向量的实双精度,同时也初始化的每个元素signal_out而且犯错为零。这些信号在生成的C代码中初始化为零。

MATLAB代码 生成的C代码
预分配输出和错误信号:
signal_out = 0 (FrameSize,ChannelCount);
err = 0 (FrameSize,ChannelCount);
/*预分配输出和错误信号:*/
79 for (i = 0;I < 64;我+ +){
80 signal_out[i] = 0.0;
81 err[i] = 0.0;
82}

这种强制初始化是不必要的,因为两者都是signal_out而且犯错在读取之前在MATLAB代码中显式初始化。

请注意

你不应该使用coder.nullcopy在声明变量时权重而且先进先出因为这些变量需要在生成的代码中初始化。这两个变量在读取之前都没有在MATLAB代码中显式初始化。

使用coder.nullcopy在声明中signal_out而且犯错在生成的代码中消除不必要的内存初始化:

  1. lms_05.m, preallocatesignal_out而且犯错使用coder.nullcopy

    预分配输出和错误信号:signal_out =编码器。nullcopy (0 (FrameSize ChannelCount));Err =编码器。nullcopy (0 (FrameSize ChannelCount));

    谨慎

    声明变量后使用coder.nullcopy,在阅读该变量之前,必须在MATLAB代码中显式地初始化该变量。否则,你可能会得到不可预知的结果。

  2. 将函数名更改为lms_06并将文件另存为lms_06.m在当前文件夹中。

  3. 在你的noise_cancel_05模型,双击MATLAB函数块。

    MATLAB函数块编辑器打开。

  4. 修改对筛选算法的调用。

    %计算LMS: [~, Signal_Out, Weights] =…lms_06(Noise_In, Signal_In, Reset, Adapt);

  5. 将模型另存为noise_cancel_06

为更新的模型生成代码。

  1. 选择LMS Filter子系统。

  2. 从构建模型工具菜单中,选择构建选定的子系统

    为子系统构建代码对话框。单击构建按钮。

    金宝app仿真软件编码器软件,为子系统生成C代码,并打开代码生成报告。

  3. 在代码生成报告的左窗格中,单击LMS_Filter.c链接查看生成的C代码。

    在生成的C代码中,没有初始化到0signal_out而且犯错

另请参阅

相关的例子

更多关于