【STM32系列】利用MATLAB配合ARM-DSP库设计FIR数字滤波器(保姆级教程)

ps.源码放在最后面

设计IIR数字滤波器可以看这里:利用MATLAB配合ARM-DSP库设计IIR数字滤波器(保姆级教程)


前言

本篇文章将介绍如何利用MATLAB与STM32的ARM-DSP库相结合,简明易懂地实现FIR低通滤波器的设计与应用。文章重点不在于理论深度,而是帮助初学者通过实际操作,掌握数字滤波器的实现流程,为后续深入学习打下基础。

理论基础

详看上一篇文章:数字滤波器的分类

设计FIR低通滤波器

MATLAB配置

filterDesigner滤波器设计工具

首先在命令行窗口输入"filterDesigner",接着就会跳出以下界面:

设计步骤

跟着下图步骤选择:

滤波器幅频响应图像

接着就可得到以下FIR滤波器及其幅频响应图像:

导出滤波器系数

根据以下步骤,导出MATLAB滤波器的系数(千万不要用"目标"->"生成C头文件"来导出,主要是为了后面操作方便):

最后得到的浮窗是这样的,选择一个合适的位置导出即可。

导出后系数转换

导出后大概率会出现这样一个MATLAB窗口(可知导出后的文件也可在MATLAB中打开,在打开这类文件的时候,记得选择文件类别为“全部文件”):

 那么多数字就是滤波器所需的参数了,接下来就是随便找一个AI,让它帮你将其整理为一个一行四个元素的数组就行。

STM32部分

DSP库添加

详细请看硬汉哥的这篇文章,讲的十分清晰:ARM DSP源码和库移植方法(MDK5的AC5和AC6)

FIR代码部分

变量参数定义

以下就是需要的变量参数定义,值得注意的是,图中圈起来的两个部分,在FIR滤波器发生变化的时候,即参数改变的时候需要修改的参数:

FIR滤波主要代码

代码部分没什么好说的,千篇一律,主要就是MATLAB中生成的滤波器参数不一样。更换不同的FIR滤波器的时候,将代码中的滤波器参数和数组大小改一下就行。

程序现象

使用串口打印到VOFA+这个软件上

信号频率:4500Hz
采样频率:48000Hz
通带频率:4000Hz
阻带频率:5000Hz
红色:原始信号波形
绿色:滤波后信号波形

源码

变量定义部分

/*********************** FIR ***********************/
/** 采样频率:48kHz 通带频率:4kHz 阻带频率:5kHz **/
#define FIR_LENGTH 256                         									/* FIR滤波器输入输出数据的长度 */
#define FIR_NUMTAPS_LENGTH 98                  									/* FIR滤波器的系数个数 */
#define FIR_PSTATE_LENGTH (FIR_LENGTH + FIR_NUMTAPS_LENGTH - 1) /* FIR滤波器状态变量的长度 */arm_fir_instance_f32 * fir_S;												/* FIR实例化结构体 */
float32_t FIR_InputBufer[FIR_LENGTH] = {0};					/* 输入数据缓冲区,长度为 FIR_LENGTH */
float32_t FIR_OutputBufer[FIR_LENGTH] = {0};				/* 输出数据缓冲区,长度为 FIR_LENGTH */
uint16_t fir_numTaps = FIR_NUMTAPS_LENGTH;					/* FIR滤波器系数个数 */
uint32_t fir_blockSize = FIR_LENGTH;								/* 块处理大小 */
float32_t fir_pState[FIR_PSTATE_LENGTH] = {0.0f};		/* FIR滤波器状态变量暂存数组:状态数组的大小为 fir_numTaps + fir_blockSize - 1 */
const float32_t fir_pCoeffs[FIR_NUMTAPS_LENGTH] = {	/* FIR滤波器系数数组,长度为 FIR_NUMTAPS_LENGTH */                                                      -0.00078254311335225067f, -0.00194089034910090554f, -0.00313185282559110684f, -0.00495539876517352672f,-0.00638956086602692451f, -0.00757987454003869986f, -0.00772155390280845032f, -0.00687095084055358400f,-0.00476900664053667676f, -0.00188692319952501889f,  0.00134417816349838314f,  0.00407555838576917698f,0.00566532906664842656f,  0.00556431360122016001f,  0.00374928839584976175f,  0.00060987014721678768f,-0.00296735404678587613f, -0.00591985213343452707f, -0.00723224215293890964f, -0.00632349600819474313f,-0.00323442690521178432f,  0.00127132144860143200f,  0.00589453667352991990f,  0.00912956175478252599f,0.00974387808929712967f,  0.00719961710314756358f,  0.00192723328839332114f, -0.00469422256804760251f,-0.01065481062891286343f, -0.01388627358340486194f, -0.01292296778433829618f, -0.00746430826262267644f,0.00136126826115418606f,  0.01114780347633200115f,  0.01879006594120128520f,  0.02136402303334635974f,0.01708251376049307185f,  0.00604552989247455347f, -0.00945856323233184963f, -0.02524803257338050638f,-0.03611715784341684721f, -0.03710298030813360959f, -0.02483745200229213815f,  0.00137548734160661008f,0.03906511682715284317f,  0.08285990139574969660f,  0.12549091009382731809f,  0.15931768100861251614f,0.17801724820473396882f,  0.17801724820473396882f,  0.15931768100861251614f,  0.12549091009382731809f,0.08285990139574969660f,  0.03906511682715284317f,  0.00137548734160661008f, -0.02483745200229213815f,-0.03710298030813360959f, -0.03611715784341684721f, -0.02524803257338050638f, -0.00945856323233184963f,0.00604552989247455347f,  0.01708251376049307185f,  0.02136402303334635974f,  0.01879006594120128520f,0.01114780347633200115f,  0.00136126826115418606f, -0.00746430826262267644f, -0.01292296778433829618f,-0.01388627358340486194f, -0.01065481062891286343f, -0.00469422256804760251f,  0.00192723328839332114f,0.00719961710314756358f,  0.00974387808929712967f,  0.00912956175478252599f,  0.00589453667352991990f,0.00127132144860143200f, -0.00323442690521178432f, -0.00632349600819474313f, -0.00723224215293890964f,-0.00591985213343452707f, -0.00296735404678587613f,  0.00060987014721678768f,  0.00374928839584976175f,0.00556431360122016001f,  0.00566532906664842656f,  0.00407555838576917698f,  0.00134417816349838314f,-0.00188692319952501889f, -0.00476900664053667676f, -0.00687095084055358400f, -0.00772155390280845032f,-0.00757987454003869986f, -0.00638956086602692451f, -0.00495539876517352672f, -0.00313185282559110684f,-0.00194089034910090554f, -0.00078254311335225067f
};

主要程序部分

/*********************** FIR滤波 ***********************/
if(filter_Flag == 0){for (uint16_t i = 0; i < FIR_LENGTH; i++) {FIR_InputBufer[i] = (float)ADC_DMA_ConvertedValue[i] * 3.3 / 65536.0;}/* 为FIR实例分配内存 */ fir_S = (arm_fir_instance_f32 *)malloc(sizeof(arm_fir_instance_f32));  if (fir_S == NULL) {return 0; /* 内存分配失败,处理错误 */}rm_fir_init_f32(fir_S,fir_numTaps,fir_pCoeffs,fir_pState,fir_blockSize);arm_fir_f32(fir_S,FIR_InputBufer,FIR_OutputBufer,fir_blockSize);		Set_Current_USART(USART1_IDX);/* 使用串口1 */for (uint16_t i = 49; i < FIR_LENGTH; i++){ printf("%d: %lf,%lf\r\n",i,FIR_InputBufer[i],FIR_OutputBufer[i]);}free(fir_S);    /* 释放内存 */fir_S = NULL; 	/* 将指针设置为 NULL,以避免悬挂指针 */
}
/*******************************************************/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/70771.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用mermaid画流程图

本文介绍使用mermaid画流程图&#xff0c;并给出几个示例。 背景 目前&#xff0c;除有明确格式要求的文档外&#xff0c;笔者一般使用markdown写文档、笔记。当文档有图片时&#xff0c;使用Typora等软件可实时渲染&#xff0c;所见即所得。但如果文档接收方没有安装相关工具…

C# ASP.NET核心特性介绍

.NET学习资料 .NET学习资料 .NET学习资料 在当今的软件开发领域中&#xff0c;C# ASP.NET凭借其强大的功能和丰富的特性&#xff0c;成为构建 Web 应用程序的重要技术之一。以下将详细介绍 C# ASP.NET的核心特性。 多语言支持 ASP.NET 支持多种语言进行开发&#xff0c;这使…

使用Hexo部署NexT主体网站

一.使用git提交文件 参考&#xff1a; 从零开始搭建个人博客&#xff08;超详细&#xff09; - 知乎 致谢&#xff01; 第一种&#xff1a;本地没有 git 仓库 直接将远程仓库 clone 到本地&#xff1b;将文件添加并 commit 到本地仓库&#xff1b;将本地仓库的内容push到远程仓…

12.项目结构

后端结构 ruoyi-admin 项目启动的入口 提供了两种启动方式 1.RuoYiApplication基于springboot,内置tomcat,直接运行。 2.RuoYiServletInitializer将springboot项目打成一个war包,用外置的servlet容器来运行。 通用功能的controller 后台登录相关的、权限控制相关的、数据字…

cursor如何使用到150次以及解决cursor限制问题

cursor白嫖免费版限制问题解决以后经常遇到只使用了50次额度就被限制了&#xff0c;软件提示you reached your trial。 解决方法 使用cursor的老版本&#xff0c;因为老版本有agent和normal可以切换&#xff0c;通过切换通往世界的IP&#xff0c;重启软件或者切换点几次agent和…

mmdetection3d环境部署

安装python库 pip install torch1.9.1cu111 torchvision0.10.1cu111 torchaudio0.9.1 -f https://download.pytorch.org/whl/torch_stable.html pip install mmengine pip install mmcv-2.0.0rc4-cp38-cp38-manylinux1_x86_64.whl pip install mmdet>3.0.0,<3.1.0 cd m…

基于springboot+vue的游戏创意工坊与推广平台的设计与实现

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

25自动化考研复试面试常见核心问题真题汇总,自动化考研复试面试有哪些经典问题?自动化考研复试难不难啊?

你是不是正在为考研自动化专业的复试发愁&#xff1f;担心准备不充分、表现不好&#xff1f;别慌&#xff01;今天&#xff0c;学姐——复试面试拿下90分、成功上岸的学姐&#xff0c;来给大家分享备考秘诀。复试没那么可怕&#xff0c;只要掌握正确的方法&#xff0c;你也可以…

用Kibana实现Elasticsearch索引的增删改查:实战指南

在大数据时代&#xff0c;Elasticsearch&#xff08;简称 ES&#xff09;和 Kibana 作为强大的数据搜索与可视化工具&#xff0c;受到了众多开发者的青睐。Kibana 提供了一个直观的界面&#xff0c;可以方便地对 Elasticsearch 中的数据进行操作。本文将详细介绍如何使用 Kiban…

【HarmonyOS Next 自定义可拖拽image】

效果图&#xff1a; 代码&#xff1a; import display from "ohos.display" import { AppUtil } from "pura/harmony-utils"/*** 自定义可拖拽图标组件*/ Component export default struct DraggableImage {imageResource?: ResourceimageHeight: numbe…

从0搭建卷积神经网络(CNN)--详细教学

目录 一、卷积神经网络介绍 1、简介 经典CNN架构 2、与传统神经网络区别 3、卷积神经网络的结构 (1) 卷积层&#xff08;Convolutional Layer&#xff09; (2) 激活函数&#xff08;Activation Function&#xff09; (3) 池化层&#xff08;Pooling Layer&#xff09; …

Jmeter对图片验证码的处理

Jmeter对图片验证码的处理 在web端的登录接口经常会有图片验证码的输入&#xff0c;而且每次登录时图片验证码都是随机的&#xff1b;当通过jmeter做接口登录的时候要对图片验证码进行识别出图片中的字段&#xff0c;然后再登录接口中使用&#xff1b; 通过jmeter对图片验证码…

深入理解指针初阶:从概念到实践

一、引言 在 C 语言的学习旅程中&#xff0c;指针无疑是一座必须翻越的高峰。它强大而灵活&#xff0c;掌握指针&#xff0c;能让我们更高效地操作内存&#xff0c;编写出更优化的代码。但指针也常常让初学者望而生畏&#xff0c;觉得它复杂难懂。别担心&#xff0c;本文将用通…

【CubeMX-HAL库】STM32F407—无刷电机学习笔记

目录 简介&#xff1a; 学习资料&#xff1a; 跳转目录&#xff1a; 一、工程创建 二、板载LED 三、用户按键 四、蜂鸣器 1.完整IO控制代码 五、TFT彩屏驱动 六、ADC多通道 1.通道确认 2.CubeMX配置 ①开启对应的ADC通道 ②选择规则组通道 ③开启DMA ④开启ADC…

在 C# 中,处理 Excel 和 PDF 文件的库有很多。以下是一些比较常用的选择

读取 Excel 文件的库 NPOI 用途&#xff1a;可以读取和写入 .xls 和 .xlsx 文件。特点&#xff1a;无需安装 Microsoft Office&#xff0c;支持简单的 Excel 操作&#xff0c;如格式化、公式、图表等。 EPPlus 用途&#xff1a;主要用于 .xlsx 格式&#xff08;Excel 2007 及以…

java配置api,vue网页调用api从oracle数据库读取数据

一、主入口文件 1&#xff1a;java后端端口号 2&#xff1a;数据库类型 和 数据库所在服务器ip地址 3&#xff1a;服务器用户名和密码 二、映射数据库表中的数据 resources/mapper/.xml文件 1&#xff1a;column后变量名是数据库中存储的变量名 property的值是column值的…

Python——批量图片转PDF(GUI版本)

目录 专栏导读1、背景介绍2、库的安装3、核心代码4、完整代码总结专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️‍🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注 👍 该系列文章专栏:请点击——>Python办公自动化专…

云原生周刊:DeepSeek 颠覆人工智能

开源项目推荐 Ollama Ollama 是一个开源的 AI 工具&#xff0c;旨在为用户提供简单而强大的本地部署语言模型解决方案。它支持直接在本地计算机上运行多个预训练的语言模型&#xff0c;能够提供与云端类似的体验&#xff0c;但无需依赖外部服务器或网络连接。 Ollama 的主要…

vue3获取页面跳转携带的参数

获取页面跳转携带的参数 在 Vue 3 中&#xff0c;使用 Vue Router 进行页面跳转并携带参数后&#xff0c;在目标页面获取这些参数的方式会因参数类型&#xff08;路径参数、查询参数&#xff09;而有所不同&#xff0c;以下为你详细介绍获取参数的方法。 前置准备 确保你已经…

Docker 部署 MongoDB | 国内阿里镜像

一、简易单机版 1、镜像拉取 docker pull registry.cn-hangzhou.aliyuncs.com/farerboy/mongo:8.0.5-rc1 2、运行镜像 docker run -it --name mongodb \ -e MONGO_INITDB_ROOT_USERNAMEmongoroot \ -e MONGO_INITDB_ROOT_PASSWORDmongoroot \ -v /wwwroot/opt/docker/mong…