主要内容

生成代码的平均滤波器

这个例子显示了推荐工作流从MATLAB®函数生成C代码使用codegen命令。这些步骤:

1。添加% # codegen指令MATLAB函数表明,它是用于代码生成。这个指令还使MATLAB代码分析器来识别特定于MATLAB代码生成的警告和错误。

2。生成一个墨西哥人函数来检查MATLAB代码适用于代码生成。如果出现错误,您应该在生成C代码之前修复它们。

3所示。在MATLAB中测试墨西哥人的功能,以确保它的功能相当于原来的MATLAB代码并没有运行时错误发生。

4所示。生成C代码。

5。检查C代码。

先决条件

这个例子没有先决条件。

关于averaging_filter函数

averaging_filter.m函数作为一个平均滤波器输入信号;需要一个输入向量的值和计算平均每个值的向量。输出向量是相同的大小和形状作为输入向量。

类型averaging_filter
% y = averaging_filter (x) %取一个输入矢量信号“x”和生成一个输出向量信号y %相同类型和形状为“x”,但过滤。函数y = averaging_filter (x) % # codegen %使用持久变量“缓冲区”,代表了一种滑动窗口% 16个样本。持久的缓冲;如果isempty(缓冲)缓冲= 0(16日1);结束y = 0(大小(x)类(x));i = 1:元素个数(x) %滚动缓冲缓冲区(2:结束)=缓冲区(1:end-1);%添加一个新的样本值缓冲区缓冲(1)= x(我);%计算当前窗口的平均值和%写结果y (i) =(缓冲)/元素个数之和(缓冲);结束

% # codegen编译指令表明MATLAB代码是用于代码生成。

创建一些样例数据

生成一个嘈杂的正弦波和策划的结果。

v = 0:0.00614:2 *π;x =罪(v) + 0.3 *兰德(1,元素个数(v));情节(x,“红色”);

图包含一个坐标轴对象。坐标轴对象包含一个类型的对象。

生成一个墨西哥人功能进行测试

生成一个墨西哥人使用的函数codegen命令。的codegen命令检查MATLAB函数适用于代码生成和生成一个墨西哥人功能,您可以测试之前在MATLAB生成C代码。

codegenaveraging_filterarg游戏{x}
代码生成成功。

因为C使用静态类型,codegen必须确定所有变量的属性在MATLAB文件在编译时。在这里,arg游戏命令行选项提供输入,这样一个例子codegen可以推断出新的类型根据输入类型。使用上面创建的样本信号为例输入确保墨西哥人函数可以使用相同的输入。

默认情况下,codegen生成一个墨西哥人命名函数averaging_filter_mex在当前文件夹。这允许您测试MATLAB代码和墨西哥人功能和比较结果。

测试墨西哥人在MATLAB函数

运行墨西哥人在MATLAB函数

y = averaging_filter_mex (x);%的阴谋的结果时,墨西哥人函数应用于嘈杂的正弦波。% '坚持'命令确保情节使用相同的图窗口%前面情节的命令。持有;情节(y,“蓝”);

图包含一个坐标轴对象。坐标轴对象包含2线类型的对象。

生成C代码

codegen配置coder.config(自由的)averaging_filterarg游戏{x}
代码生成成功。

检查生成的代码

codegen命令配置coder.config(自由的)选项生成C代码打包为一个独立的C库。生成的C代码codegen / lib / averaging_filter /文件夹中。的文件是:

dircodegen / lib / averaging_filter /
,. ._clang-format averaging_filter。averaging_filter。c averaging_filter。h averaging_filter。o averaging_filter_data。c averaging_filter_data。h averaging_filter_data。o averaging_filter_initialize。c averaging_filter_initialize。h averaging_filter_initialize。o averaging_filter_rtw。可averaging_filter_terminate。c averaging_filter_terminate。h averaging_filter_terminate。o averaging_filter_types。h buildInfo。垫codeInfo。垫codedescriptor。dmr compileInfo。垫接口rtw_proj例子。tmw rtwtypes.h

检查的C代码averaging_filter.c函数

类型codegen / lib / averaging_filter / averaging_filter.c
/ * *文件:averaging_filter。c * * MATLAB编码器版本:5.6 * c / c++源代码生成:03 - mar - 2023 04:56:44 * / / *包含文件* / # Include " averaging_filter。h averaging_filter_data # include。h averaging_filter_initialize # include。h”# include <字符串。h > / *变量定义* /静态双缓冲[16];/ *函数定义* / / * *使用持久变量“缓冲区”,代表了一种滑动窗口* 16个样本。* *参数:const双x双y[1024][1024] * *返回类型:void * /空白averaging_filter (const双x[1024],双y[1024]){双dv [15];int我;int k;如果(! isInitialized_averaging_filter) {averaging_filter_initialize ();}/ * y = averaging_filter (x) * / / *取一个输入矢量信号“x”和生成一个输出向量信号y * * / / *相同类型和形状为“x”,但过滤。 */ for (i = 0; i < 1024; i++) { double b_y; /* Scroll the buffer */ memcpy(&dv[0], &buffer[0], 15U * sizeof(double)); /* Add a new sample value to the buffer */ b_y = x[i]; buffer[0] = b_y; /* Compute the current average value of the window and */ /* write result */ for (k = 0; k < 15; k++) { double d; d = dv[k]; buffer[k + 1] = d; b_y += d; } y[i] = b_y / 16.0; } } /* * Use a persistent variable 'buffer' that represents a sliding window of * 16 samples at a time. * * Arguments : void * Return Type : void */ void averaging_filter_init(void) { memset(&buffer[0], 0, 16U * sizeof(double)); } /* * File trailer for averaging_filter.c * * [EOF] */