主要内容

插值 FIR 滤波器的代码生成

使用多速率多级滤波器级联高效设计实现高阶 FIR 滤波器。生成并自定义从滤波器生成的 C 代码。

必需的 MathWorks™ 产品:

  • MATLAB®

  • DSP System Toolbox™

  • Simulink®

  • MATLAB® Coder™

  • Simulink® Coder™

  • Embedded Coder™

简介

您可以使用多速率多级方法高效实现高阶 FIR 滤波器。要降低实现成本,您可以将一个单级高阶滤波器拆分为若干低阶多速率滤波器的级联。

此示例中的插值 FIR (ifir) 使用系数可调的 FIR 抽取器、FIR 滤波器和 FIR 插值器的级联来实现所需频率响应。要进行代码生成,请指定系数变量并将其放置在文件中,以便在目标处理器上运行时动态更改系数的其他软件组件可以访问这些系数变量。

以下各节描述如何指定插值 FIR 设计、如何通过仿真探索行为以及如何生成代码与自定义生成的代码。

指定设计

插值 FIR 设计与实现算法的设定分为两部分:模型设定和参数化数据设定。模型设定是指定算法信号流的 Simulink 子系统。模型设定还会访问 MATLAB 工作区中存在的参数化数据。参数化数据设定是创建 Simulink 模型所访问数据的 MATLAB 脚本。

对于此示例,模型设定是 Simulink 模型 dspifircodegen 的 InterpolatedFIR 子系统。在此子系统中,输入信号通过 FIR 抽取、FIR 滤波和 FIR 插值的级联传递。

对于此示例,参数化数据设定是 MATLAB 脚本 dapifirdata.m。此 MATLAB 脚本指定初始滤波器系数及代码生成属性。打开模型 dspifircodegen 时,模型的 PreLoadFcn 回调会配置为运行 dspifirdata.m 脚本以在 MATLAB 工作区中创建参数数据。

通过仿真探索行为

您可以对模型进行仿真以探索插值 FIR 设计与实现的行为。模型使用 Spectrum Analyzer 模块查看幅值响应。点击仿真选项卡中的运行来运行模型。仿真时间设置为 1000 秒。

为插值 FIR 子系统生成 C 代码

在获得所需的仿真行为后,您可以基于设计设定为 InterpolatedFIR 子系统生成 C 代码。此示例中使用的模型配置为显示可从 Embedded Coder 产品访问的常见代码生成自定义选项。这些自定义选项可简化代码审查与集成流程。以下各节说明如何对此模型应用部分代码自定义,并提供详细描述这些自定义的文档链接。

要生成 C 代码,请右键点击 InterpolatedFIR 子系统,选择 C/C++ 代码 > 编译此子系统。您也可以通过点击以下超链接来生成代码:为 InterpolatedIFIR 子系统生成代码

带双向链接的代码生成报告

模型配置为生成 HTML 报告,您可使用该报告来导航生成的源文件和头文件。该报告还支持生成代码与模型之间的双向链接。

有关模型与代码之间可追溯性的详细信息,请参阅Trace Simulink Model Elements in Generated Code (Embedded Coder)

调用生成的代码

您可以通过调用模型初始化函数和模型单步函数将生成的代码集成到应用程序中。您可以通过查看生成的示例 ert_main.c 文件,了解如何调用生成的代码。请注意,ert_main.c 中的示例 main() 调用 InterpolatedFIR_initialize() 来初始化状态,而 ert_main.c 中的示例代码 rt_OneStep() 显示中断等周期机制如何从 InterpolatedFIR.c 文件调用 InterpolatedFIR_step()

有关如何将生成的代码集成到其他应用程序的详细信息,请参阅Deploy Applications to Target Hardware (Embedded Coder)

输入和输出数据接口

参数化数据设定文件 dspifirdata.m 在 MATLAB 工作区中创建 inout 信号数据对象。这些数据对象与模型中的信号线相关联,用于指定生成代码中对应变量的描述和存储类。例如,信号 inoutInterpolatedFIR.c 中声明为全局变量。要运行模型单步函数,应用程序需要将数据写入 in、调用 InterpolatedFIR_step() 函数,然后从 out 读取结果。

有关数据对象的详细信息,请参阅Create Data Objects for Code Generation with Data Object Wizard (Embedded Coder)

代码注释中的文本注解

您可以将模型中作为文本输入的设计文档作为注释插入生成代码中。InterpolatedFIR 子系统包含带关键字 S:Description 的注解文本。代码生成器识别以该关键字开头的文本并将后续文本作为注释插入生成代码中。

有关将注解文本插入到代码注释的详细信息,请参阅Add Global Comments in the Generated Code (Embedded Coder)

系数文件放置

参数化数据设定文件 dspifirdata.m 在 MATLAB 工作区中为系数创建参数数据对象。这些数据对象配置为在单独的文件 ifir_coeffs.cifir_coeffs.h 中分别定义和声明系数变量。在单独的文件中对系数进行分区处理使其他软件组件能够访问此数据。例如,在部署的应用程序中,您可以调度其他软件组件,以便在运行时修改这些变量,然后供 InterpolatedFIR_step() 使用。

有关数据对象的文件放置的详细信息,请参阅Control Placement of Global Data Definitions and Declarations in Generated Files (Embedded Coder)

系数变量注释中的滤波器设计参数

在计算系数时(在参数化数据文件中),滤波器设计参数存储在系数参数数据对象的 Description 字段中。模型配置为将设计参数作为注释插入生成代码中。这样,代码审查人员就能够轻松识别用于设计滤波器的设计参数。

有关自定义生成代码中数据对象的注释的详细信息,请参阅Add Custom Comments for Variables in the Generated Code (Embedded Coder)

打包生成的文件

HTML 报告引用的生成文件存在于 InterpolatedFIR_ert_rtw 目录中。除了此目录中的文件之外,可能还需要将 MATLAB 应用程序安装目录中的其他文件集成到工程中。为了方便将生成的代码移植到其他环境,此模型配置为使用 PackNGo 功能,该功能将所有必需的文件打包到 zip 文件 InterpolatedFIR.zip 中。请注意,该 zip 文件包含所有必需的文件,但还可能包含非必需的其他文件。

有关打包文件以集成到其他环境中的详细信息,请参阅转移或共享生成的代码 (Simulink Coder)

另请参阅

| | (Simulink) | |

主题