完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
众所周知,matlab的功能是非常强大的,简便易于操作的工具包更是非常的方便。为机器学习,深度学习,图像处理,语音识别等提供了很大的帮助。但是,在今天万物嵌入的社会,一个独立的个体有着独立的mcu。众多单片机,嵌入式设备都支持C/C++代码,而不支持matlab代码,因此,我们若想把在matlab中编写的程序下载到单片机中,就必须转换成C/C++代码。
matlab恰好个我们提供了工具包——matlab coder。它的诞生,让我们愿望成了现实。下面我就 将matlab 中的程序转换成C做详细介绍。 matlab函数如下 这段函数的功能是计算高斯核(参数是标准差的大小) 计算高斯核是高斯模糊滤波必不可少的一步 function result = count_gaosi( d ) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% 计算高斯核 %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% C=zeros(5,5); D=zeros(5,5); E=zeros(5,5); pi=3.1415926;%高斯公式中Π的值 sum1=0;%计算累计权重的值 % d=1.5;%高斯核标准差 c=5;%高斯核大小 center=(c/2)+0.5;%模板的中心,这里取整 A=1/(2*pi*d*d);%高斯公式指数前面的系数 for i=1:c x2=(i-center)*(i-center); for j=1:c y2=(j-center)*(j-center); B=exp(-(x2+y2)/(2*d*d)); C(i,j)=A.*B; sum1=sum1+C(i,j); end end %整数形式的高斯核,需要进行归一化,即把左上角的值化为1 %下面进行归一化 k=1/C(1,1); for i=1:c for j=1:c D(i,j)=C(i,j)*k;%进行归一化后整数形式的高斯核,有小数可以取整 sum1=sum1+D(i,j); end end %若需要小数形式的高斯核,则在不需要归一化,而需要进权重分配,高斯核的每个系数要除以所有系数的和。 %下面进行权重分配 for i=1:c for j=1:c E(i,j)=C(i,j)/sum1;%进行权重分配后小数形式的高斯核 end end result= E; %%%%%%%%%%%%%%%%%%%%%%%%%%%%截至这里,高斯核以计算完毕%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 高斯滤波器模板的生成最重要的参数就是高斯分布的标准差。 % 标准差代表着数据的离散程度,如果较小,那么生成的模板的中心系数较大, % 而周围的系数较小,这样对图像的平滑效果就不是很明显; % 反之,较大,则生成的模板的各个系数相差就不是很大,比较类似均值模板,对图像的平滑效果比较明显。 %%%%%%%%%%%%%%%%%%%%%%%%%%%%截至这里,高斯核以计算完毕%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 测试代码 clc close all d=1.5; result=count_gaosi(d) 输出如下 具体转换 第一步 命令框输入coder,回车键 第二步 选中要转换的函数 第三步 选中测试函数,识别参数数据类型,这里如果没有测试函数,可以手动选择。 第四步 检测生成MEX文件中的问题 检测通过 第五步 选择需要生成的代码(C/C++),点击Generate,生成代码 上述代码生成的代码如下 /* * File: count_gaosi.c * * MATLAB Coder version : 4.1 * C/C++ source code generated on : 15-Feb-2020 14:02:19 */ /* Include Files */ #include #include "count_gaosi.h" /* Function Definitions */ /* * %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% * 计算高斯核 %% * %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% * Arguments : double d * double result[25] * Return Type : void */ void count_gaosi(double d, double result[25]) { double sum1; double A; int i; int x2; int j; double C[25]; double d0; /* 高斯公式中Π的值 */ sum1 = 0.0; /* 计算累计权重的值 */ /* d=1.5;%高斯核标准差 */ /* 高斯核大小 */ /* 模板的中心,这里取整 */ A = 1.0 / (6.2831852 * d * d); /* 高斯公式指数前面的系数 */ for (i = 0; i < 5; i++) { x2 = (i - 2) * (i - 2); for (j = 0; j < 5; j++) { d0 = A * exp(-(double)(x2 + (j - 2) * (j - 2)) / (2.0 * d * d)); C[i + 5 * j] = d0; sum1 += d0; } } /* 整数形式的高斯核,需要进行归一化,即把左上角的值化为1 */ /* 下面进行归一化 */ A = 1.0 / C[0]; for (i = 0; i < 5; i++) { for (j = 0; j < 5; j++) { /* 进行归一化后整数形式的高斯核,有小数可以取整 */ sum1 += C[i + 5 * j] * A; } } /* 若需要小数形式的高斯核,则在不需要归一化,而需要进权重分配,高斯核的每个系数要除以所有系数的和。 */ /* 下面进行权重分配 */ for (i = 0; i < 5; i++) { for (j = 0; j < 5; j++) { x2 = i + 5 * j; result[x2] = C[x2] / sum1; /* 进行权重分配后小数形式的高斯核 */ } } /* %%%%%%%%%%%%%%%%%%%%%%%%%%%截至这里,高斯核以计算完毕%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */ /* 高斯滤波器模板的生成最重要的参数就是高斯分布的标准差。 */ /* 标准差代表着数据的离散程度,如果较小,那么生成的模板的中心系数较大, */ /* 而周围的系数较小,这样对图像的平滑效果就不是很明显; */ /* 反之,较大,则生成的模板的各个系数相差就不是很大,比较类似均值模板,对图像的平滑效果比较明显。 */ /* %%%%%%%%%%%%%%%%%%%%%%%%%%%截至这里,高斯核以计算完毕%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */ } /* * File trailer for count_gaosi.c * * [EOF] */ |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1618 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1545 浏览 1 评论
979 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
683 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1597 浏览 2 评论
1863浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
645浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
516浏览 3评论
532浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
505浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 15:25 , Processed in 0.809083 second(s), Total 77, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号