| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> Matlab/Simulink自动生成C代码实验(基于一个简单信号滤波例子) -> 正文阅读 |
|
[C++知识库]Matlab/Simulink自动生成C代码实验(基于一个简单信号滤波例子) |
目录 1. Matlab /Simulink/Embedded Coder关系与区别 0. 概要????????Matlab网站提供了很多关于如何使用Coder自动生成代码的教程,也有很多相关的博客或者视频,但是“纸上得来终觉浅,绝知此事要躬行”,光看不练终究是如隔靴搔痒,不知所云。 ????????本文从搭建一个simulink模型开始,到生成代码并进行生成的C模型与原simulink模型的一致性验证,走完一个最小完整流程。希望对基于simulink模型自动生成C代码感兴趣的小伙伴们能有所帮助。 ? ? ? ? 以下实验用的Matlab-2021b版本。 1. Matlab /Simulink/Embedded Coder关系与区别ref1:?Difference between Simulink Coder and Embedded Coder - (mathworks.cn) ref2:?Difference between Simulink Coder, Embedded Coder and Matlab Coder - (mathworks.cn)? ref3:?Welcome to the Coders! ? Guy on Simulink - MATLAB & Simulink (mathworks.com)? MATLAB Coder is used to generate ANSI C/C++ code from MATLAB and is a pre-requisite for Simulink Coder and Embedded Coder. Simulink Coder does the same thing, but from Simulink. Embedded Coder allows to optimize/customize the code generated by MATLAB Coder and Simulink Coder for production use. 首先,MATLAB Coder是Simulink Coder和Embedded Coder的基础。 Simulink Coder以前称为Real-Time Workshop,所以生成的代码存放目录等名称中可以看到的_rtw后缀名就源于此。 Both Simulink Coder generate C code from Simulink models, and both of them can put that C code in a C++ wrapper to be effectively integrated with other C++ code. The main difference between these products is:
????????Simulink Coder和Embedded Coder都是用于将simulink模型自动转换成C代码。Simulink Coder生成的代码可以独立于matlab进行运行,这样可以在主机上运行以验证所生成的代码。而Embedded Coder生成的代码,一言以蔽之,就是更加优化、简洁,并且支持面向目标嵌入式平台生成代码,并因此得名。从实际实验生成的代码量也可以看出,同样的Simulink模型,Embedded Coder生成的代码量要比Simulink Coder生成的代码量更小一些。而且,根据以上描述,Embedded Coder生成的代码的可读性更好一些(?这个有待亲测确认) 2. 搭建Simulink模型及仿真2.1 搭建模型????????本实验用的模型如下图所示,实现的功能是两个正弦波信号相加后灌入一个用低通滤波器。 ? ? ? ?两个正弦波信号的频率分别为1kHz,和5kHz,本实验中采样率统一为44.1kHz。其中第一个正弦波信号模块的参数设置如下: ????????滤波器系数是通过BL1和AL1设置,这两个参数分别表示IIR滤波器传输函数的分子和分母,我们在matlab命令行输入命令进行设置,如下以下代码所示。
????????这条语句设计了一个采样率为44.1kHz、通带频率为3kHz的4阶巴特沃斯低通滤波器。这样的话可以将5kHz的正弦波率除掉,保留1kHz的正弦波信号。这个变化可以通过观测各节点频谱很容易确认。 ? ? ? ? 除了输入正弦波信号、低通滤波器模块,其它还有存储各滤波器输入输出数据的数据缓存模块,TimeScope用于观测时域波形,以及几个频谱分析仪(Spectrum Analyzer)模块。 ?2.2 仿真????????设置仿真时长1秒钟(由于是44.1kHz采样率,1kHz和5kHz的正弦波,1秒钟的仿真时间足够了),仿真结果如下所示。 ????????四个节点的信号频谱,从左到右分别是1kHz的输入信号,5kHz的输入信号,滤波器输入信号(即两者相加的结果),滤波器输出结果。结果符合预期,从滤波器输出端频谱可以看出5kHz的信号分量收到了抑制。 ????????TimeScope输出的时域波形如下(中间两个顺序颠倒了,各波形的title请忽视),同样可以看出最后滤波器输出信号只剩下了1kHz的低频成分。 ????????由于有两个out(To WorkSpace)模块,所以仿真还生成了一个存储这些数据的结构体out,其中所包含的信息如下: ? ? ? ? 执行命令“save('ex_lpf_ref.mat','out')”将这个数据存储下来用于后与生成的代码运行结果做对比。用plot语句同样可以画出以上TimeScope相同的波形,如下所示。
? ? ? ? 其中out.tout代表的是采样时间序列。? 3. 生成代码?3.1 求解器设置为定步长????????在Simulink模型窗口的最上面的菜单Tab中选择“建模”-->"模型设置"后弹出“配置参数”对话窗,将“求解器选择”下面的“类型”改为“定步长”,其它不用管。只有定步长设置才能正确地生成C代码。 3.2?安装?MinGW-w64 编译器? ? ? ? 执行mex -setup检查是否为matlab配置了C编译器。如果没有的话,可以使用“附加功能”菜单安装,比如说我安装的是MinGW-w64:
????????然后遵照指令一步一步往前走即可。 ????????注意,MinGW?安装文件夹名称不能包含空格。例如,以下这样的的缺省安装路径是不行。 ????????C:\Program Files\mingw-64 ? ? ? ? 工具不能正确识别这种路径。 ?3.3 调出Simulink Coder? ? ? ? 在Simulink模型窗口的“APP”,缺省地有“Embedded Coder”,但是没有“Simulink Coder”。本实验要生成可以独立运行的C程序,所以要用Simulink Coder。 点击最右端的下拉标志: ????????在弹出的窗口中下拉到“代码生成”部分,选中“Simulink Coder”即可。 ????????这样会在原来APP旁边出现一个“C CODE”的TAB。 ?? ? ? ? 可以从“Quick Start”出发去生成代码,Matlab内置例子通常是走这个流程,不过我走了一遍后没有感受到什么好处,所以以下实验不走这个流程。此处的Settings以下的内容,其实和上一层的“建模”-->"模型设置"相同,点进去再确认一下代码生成的设置: ????????如果只想生成代码,可以勾选“仅生成代码”,但是本实验想让matlab走完编译的全过程。其它选项暂时就缺省就好了。万事俱备,点击“Build”按钮即可。顺利的话,可以看到在matlab的当前工作目录下生成了:ex_lpf.exe,ex_lpf.slxc以及存放所生成的代码的目录ex_lpf_grt_rtw。 ? ? ? ? 接下来我们先不管它生成了啥,先看看所生成的exe文件是否正确。在matlab命令行执行命令"! ex_lpf.exe"(用“!”后接exe文件名可以运行exe可执行文件),可以看到执行结果生成了一个ex_lpf.mat。 ????????将ex_lpf.mat加载进来(load ex_lpf.mat),里面包含rt_flt_din,rt_flt_dout,rt_tout,分别上面提到的out中的三个变量对应,只不过多了个rt_的前缀名(表示real-time?)。 对比这些数据与上面simulink模型运行所得到的数据结果可以确认它们的确是一致的。这就表明所生成的C代码模型与原simulink模型的确是等价的。 ?4. 工具都生成了啥呢?????????是时候看看Coder都给我们生成了啥了。在以上代码生成完后会弹出一个“Code Generation Report”对话窗口,如下所示: ????????点击左边各文件可以查看各代码文件的内容。 第一印象一定是,哇,这么简单的一个模型,居然生成了这么多东西。需要花一些时间来看看:
等等等等。不过,现在我写累了,等我歇一歇再回来。。。 ???????? |
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 3:06:42- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |