[MATLAB学习]:Matlab生成滑动平均滤波算法文件并移植到STM32单片机上运行——基于CubeMX

前言

人生如逆旅,我亦是行人。


今天分享一个在 MATLAB 上生成C算法文件,并将其移植到 keil5上,运行至 STM32 单片机,一个很有用的方法。


  • 准备工作:

    • 已安装 MATLAB 的软件(注意:matlab 安装路径不可以有空格的问题)
    • Keil IDE 开发环境
    • STM32CubeMX
    • STM32H750VBT6 开发板
  • 需要移植的头文件路径:F:\MATLAB\extern\include(在我们安装的 MATLAB 软件的文件夹的路径下)
    在这里插入图片描述


一、MATLAB 的生成算法脚本

1、新建一个 filter.m (滤波算法)脚本文件

在这里插入图片描述
在这里插入图片描述

  • 编写 averaging_filter.m 脚本文件

在这里插入图片描述

%% 滑动平均滤波
function y=averaging_filter(x)
persistent buffer;
if isempty(buffer)
    buffer = zeros(16,1);	%每次平均采样16个采样值,每挪动一次,求16次采样值
end
y=zeros(size(x),class(x));
for i = 1:numel(x)
    buffer(2:end)=buffer(1:end-1);
    buffer(1) = x(i);
    y(i) = sum(buffer)/numel(buffer);
end
  • 验证 .m 脚本文件的算法函数是否正常:

在这里插入图片描述

type averaging_filter

2、新建一个生成波形且可调用滤波函数的脚本文件

在这里插入图片描述

  • 在编辑器中编写 wave.m 代码:

在这里插入图片描述

%%%%%%%%%%%%%1步:噪声波形 %%%%%%%%%%%%%%%
v = 0:0.00614:2*pi;
x = sin(v) + 0.3*rand(1,numel(v));
plot(x,'red');

fid=fopen('F:\MATLAB\bin\data.c','wt');     %写入文件路径
for i=1:1:1024                              %MATLAB的下标是从1开始的
    fprintf(fid,'%f,\n',x(i));
end
%%%%%%%%%%%%2步:生成 mex 函数,先在 matlab 上测试下 %%%%%
% codegen :命令会检查 matlab 函数是否适用于代码生成,并生成 MEX 函数
codegen averaging_filter -args {x}      %将滑动平均滤波的脚本文件专门生成一个mex函数供我们使用

%%%%%%%%%%%3步:在 MATLAB 中运行 MEX 函数
y = averaging_filter_mex(x);
hold on;
plot(y,'blue');

% grid on      %限制作用,在幕布中加了一些网格线
% axis square  %限制作用

%%%%%%%%%%4步:生成C代码 %%%%%%%%%%%%%
codegen -config coder.config('lib') averaging_filter -args {x}
  • 编写完成代码后,点击运行:

在这里插入图片描述
在这里插入图片描述

  • data.c 中存储着噪声波形的数据

在这里插入图片描述

  • 运行后,还会产生如下的波形图像:

    其中红色表示的原始的噪声波形,会带有很多的毛刺,数据干扰较大;而蓝色表示的则是经过滑动平均滤波之后的波形,变得则相对平滑了一些。

    可以看出其滤波的效果还是十分不错的。

在这里插入图片描述

上述展示的是利用 MATLAB 编写滤波算法,并显示出它的效果,接下来我们学习如何将它移植到 Keil 中,并运行到我们的单片机上。


二、新建一个普通的 Keil 工程

  • 利用 STM32CubeMX 新建一个工程,可以参考:STM32H750VBT6的DSP使用的学习——基于CubeMX
  • 新建工程完成之后,找到我们的工程文件夹,再新建两个文件夹:
    在这里插入图片描述
  • 找到需要移植的头文件路径:F:\MATLAB\extern\include,将里面所有的内容复制到我们新建的 Include 文件夹中

在这里插入图片描述

  • 同样,找到我们生成的滤波算法文件:F:\MATLAB\bin\ codegen\lib\averaging_filter,将其全部复制到我们新建的 MATLAB 文件夹中:

在这里插入图片描述


三、进行 KEIL 工程的配置

在这里插入图片描述

  • 接下来,点击仙女棒图标,添加两个文件夹路径:

在这里插入图片描述

  • 上述就差不多完成了整个移植的过程,接下来就是编写代码,调用我们生成的算法函数。

四、编写代码

  • 因为我所使用的是 STM32H7 的最小系统板:STM32H750VBT6,对串口进行重定向:
#include "stdarg.h"

#define CONSOLEBUF_SIZE 256

static char Uart_buf[CONSOLEBUF_SIZE];

void PrintfDebugUart(const char *fmt, ...)
{
	va_list args;
	va_start(args, fmt);
	int length = vsnprintf(Uart_buf, sizeof(Uart_buf) - 1, fmt, args);
	va_end(args);
	
	HAL_UART_Transmit(&huart1, (uint8_t *)&Uart_buf, length, 0xffff);
}

注:这样就可以直接调用 PrintfDebugUart 进行串口打印。

  • main.c 文件中添加滤波函数的头文件:
#include "averaging_filter.h"
#include "averaging_filter_initialize.h"
  • 定义两个数组:

在这里插入图片描述
在这里插入图片描述

  • 输入数组中的元素就是我们之前生成的 data.c 中的数据;输出数组直接全部初始化为零即可。

  • 接下来在 main 函数中添加:

  /* USER CODE BEGIN 2 */

	averaging_filter_initialize();				//滤波函数初始化
	
	averaging_filter(inputdata,outputdata);		//对原始噪声函数进行滤波	
	
	for(int i=0; i<1024; i++)
	{
		PrintfDebugUart("%f\r\n",inputdata[i]);
	}
	for(int i=0; i<1024; i++)
	{
		PrintfDebugUart("%f\r\n",outputdata[i]);
	}
	
  /* USER CODE END 2 */
  • 编译,烧录:
    在这里插入图片描述

  • 烧录方式是直接的固件的烧录,其他烧录都可以:
    在这里插入图片描述


五、实验结果

  • 利用串口打印结果,并接收打印数据:
    在这里插入图片描述

  • 最后利用 excel 表格对数据进行整理,绘制波形图:
    在这里插入图片描述

注: 蓝色表示的是原始的数据;红色的表示经过滑动平均滤波算法之后的数据,相对变得平滑了许多。


以上就是本篇博文的分享内容,如果对你有帮助的话,麻烦帮忙点个小赞,谢谢!!!

  • 21
    点赞
  • 100
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

W_oilpicture

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值