前言

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


今天分享一个在 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 256static 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 表格对数据进行整理,绘制波形图:

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


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

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

  1. 算法学习笔记之滑动平均滤波算法

    滑动平均滤波算法只采样一次,将一次采样值和过去的若干次采样值一起求平均,得到的有效采样值即可投入使用.如果取N个采样值求平均,存储区中必须开辟N个数据的暂存区.每新采集一个数据便存入暂存区中,同时去掉 ...

  2. 滑动平均滤波算法——MATLAB实现

    算法原理 滑动平均滤波算法的基本思想是设定一个宽度固定的滑动窗口,该窗口沿着时间序列滑动,同时取窗内数据的算术平均值作为输出值,而由输出值组成另一个数字序列,也就是滤波后的序列.设N为滑动窗口的宽度, ...

  3. C 语言实现的滑动平均滤波算法,滑动平均滤波算法(递推平均滤波法)

    /// ///滑动平均滤波算法(递推平均滤波法) /// /// /// GN为数组value_buf[]的元素个数,该函数主要被调用,利用参数的数组传值 /// private const int ...

  4. 数字滤波算法(一)——滑动平均滤波算法

    一.数字滤波器简介 数字滤波器是指通过一定的数据逻辑构成的可以滤除输入信号中的特定的噪声的算法,这里所指的数字滤波器主要包括平均值滤波.FIR滤波.CIC滤波等,在之后的实验中,我们将介绍不同数字滤波 ...

  5. C语言实现的滑动平均滤波算法

    最近采集压力传感器的电压信号,采集到的数据波动挺大的,所以采用滤波的方法进行处理一下. 因为在matlab中依靠matlab的画图函数很容易看到滤波后的数据图像,进而验证滤波效果. 所以首先将采集到的 ...

  6. 嵌入式–滑动平均滤波算法

    嵌入式–滑动平均滤波 ​ 滑动平均值滤波是指先在RAM中建立一个数据缓冲区,依顺序存放N个采样数据,每采进一个新数据,就将最早采集的那个数据丢掉,而后求包括新数据在内的N个数据的算术平均值.这样,每进 ...

  7. MATLAB实现滑动平均滤波法的实例(移动平均滤波器)

    原始信号 0.03    -1.46    -0.26    -0.47    -1.46    -0.06    -0.47    -1.27    0.15    -0.47    -1.47   ...

  8. 利用FFT分析比较卡尔曼滤波算法、低通滤波算法、滑动平均滤波的频谱

    1 卡尔曼滤波 详见博客 https://blog.csdn.net/moge19/article/details/81750731 2 低通滤波 2.1 算法推导 一阶RC滤波器的硬件电路如图: 图 ...

  9. 【嵌入式算法】滑动平均滤波法

    算数平均滤波需要多次采样后才能得出一个有效值,如果被检测量变化较快,多次采样后才输出一次有效值,表现就是系统反应迟钝.将当前采样值与之前连续的历史采样值进行平均,这样每次采样结束即可得出有效值.因为参 ...

最新文章

  1. 你想要的宏基因组-微生物组知识全在这
  2. 设计模式第六课 单例模式
  3. Android构建流程——篇三
  4. LruCache在美团DSP系统中的应用演进
  5. Cloud Toolkit 应用部署、文件上传支持上传进度实时展示
  6. Mr.J--JS学习(闭包私有化)
  7. logging 模块 与 logging 固定模块
  8. asp.net的快捷实用分页类
  9. 谷歌云端语音识别服务软件
  10. 大数据分析平台如何选择
  11. 最大功率点跟踪测试软件,最大功率点跟踪(MPPT)
  12. 货币转换python代码_[Python3 练习] 003 货币转换
  13. Java常用软件下载地址
  14. 性能碾压Notepad++的文本编辑器UltraEdit,程序员必备
  15. SDN介绍(什么是SDN)
  16. 网易数帆王佰平:我的 Envoy Maintainer 之路
  17. Activiti,自定义表单,外置表单,工作流,微服务,子系统
  18. CSDN20181213博客黑板报
  19. 【渝粤教育】电大中专机械设计基础 (2)作业 题库
  20. 详细了解步进电机的最大静转矩以及矩频特性

热门文章

  1. swapidc不能连接到主机_swapidc 安装教程 安装/启动 插件教程
  2. 单片机按键设计的四个方案
  3. Java:Excel模板下载
  4. 计算机软件开发文档编写指南
  5. MAC 彻底卸载PARAGON NTFS
  6. Composer 的简介、安装及使用
  7. navicat12,使用自动完成代码,没有默认选中第1个,怎么设置?
  8. 统计学习:现代机器学习
  9. 如何把设计问题转化为数学问题,方法论
  10. Java自学基础 常用类