当前位置: 首页 > news >正文

STM32利用arm-dsp库进行FIR低通滤波【详细】

arm-dsp库官方已经封装好了,使用的时候需要把dsp库移植到工程里面,具体怎么移植网上可以找到教程

这里直接说怎么用FIR的流程:

一、Matlab里面生成所配置的阶数和系数

1、在Matlab命令窗口输入fdatool,回车,会弹出一个新窗口

1c8fcbb9ef9f44afbf4a1ee88837be8e.png

2、在新窗口中的响应类型选择【低通】,设计方法选择【 FIR里面的最平坦】,滤波器阶数选择【指定阶 80】(这里以80举例),频率设置选择【Hz,Fs3200,Fc200】(同样也是举例,后面自己按照需求改动),选择完后点击设计滤波器,并在上方【编辑】中点击【转换结构】选择【Direct-Form FIR】在点击确认

2f435abc56524f63a350a6e74a89396e.png

 5b765e952e0d430fbab72bc29760f216.png

3、在上方选择【目标】中的【生成C的头文件】 ,改变导出类型为【单精度浮点】,然后点击生成保存到文件夹中

209ab19dd5d64efba1d9f235d88e80fb.png

0fe9dd0262dd42e1af967eed6960493b.png

二、在keil 写相关程序

主要是用到了dsp库里面这两个函数

b82722abcadb451a8e5bb7a50b9e4ba6.png

我们先把要处理的数据放进一个数组,我自己使用的ADC采集信号发生器发出的基频为100Hz的信号。

将ADC采集的数据转换为电压存入一个数组中

uint32_t i=0;
for(i=0;i<256;i++)
{inbuf[i]=(float)(ADC1_ConvertedValue[i]*3.3/4096);
}

接下来就要配置上面用的函数了

//FIR实例化结构体arm_fir_instance_f32 * S;

 还记得刚刚Matlab生成的文件吗?打开这个文件,复制这些到工程里面去。

585be2016d5b4e29ba00f9cc0de68074.png

//FIR滤波器系数个数
uint16_t numTaps=81;
//FIR滤波器系数
float32_t  pCoeffs[81]={3.671998324e-22,2.631265729e-20,9.278031016e-19, 2.14557019e-17,3.659253801e-16,4.907191783e-15,5.387333849e-14, 4.97747839e-13,3.948472625e-12,2.730093235e-11,1.664632598e-10,9.033196413e-10,4.394613118e-09,1.927893756e-08,7.661567736e-08,2.767831404e-07,9.112107477e-07,2.737595878e-06,7.507435839e-06,1.876901842e-05,4.263511073e-05,8.741336933e-05,0.0001597262308,0.0002535805688,0.0003294369671,0.0002852701291,-6.710144226e-05,-0.0009913889226,-0.002741852077, -0.00537379086,-0.00846511405, -0.01084412821, -0.01049835142,-0.004857060499, 0.008461467922,0.03057124838,   0.0603001751,  0.09375944734,   0.1249034405,   0.1470876038,0.1551340818,   0.1470876038,   0.1249034405,  0.09375944734,   0.0603001751,0.03057124838, 0.008461467922,-0.004857060499, -0.01049835142, -0.01084412821,-0.00846511405, -0.00537379086,-0.002741852077,-0.0009913889226,-6.710144226e-05,0.0002852701291,0.0003294369671,0.0002535805688,0.0001597262308,8.741336933e-05,4.263511073e-05,1.876901842e-05,7.507435839e-06,2.737595878e-06,9.112107477e-07,2.767831404e-07,7.661567736e-08,1.927893756e-08,4.394613118e-09,9.033196413e-10,1.664632598e-10,2.730093235e-11,3.948472625e-12, 4.97747839e-13,5.387333849e-14,4.907191783e-15,3.659253801e-16, 2.14557019e-17,9.278031016e-19,2.631265729e-20,3.671998324e-22
};
//FIR滤波器状态变量暂存:数组的大小=numTaps+blocksize-1
float32_t  pState[336]={0.0f};
//块处理大小
uint32_t blockSize=256;
//输入数据
float32_t inbuf[256]={0};//输出数据
float32_t outbuf[256]=	{0};

 接下来就要调用上面说的函数了,不过我们先要为arm_fir_instance_f32这个结构体开辟一个空间

// 为FIR实例分配内存  
S = (arm_fir_instance_f32 *)malloc(sizeof(arm_fir_instance_f32));  
if (S == NULL) 
{// 内存分配失败,处理错误  return;  
}

malloc和free这两个函数需要包含#include <stdlib.h>这个头文件,不然会报错

这行代码 S = (arm_fir_instance_f32 *)malloc(sizeof(arm_fir_instance_f32)); 是C语言中动态内存分配的一个常见用法。这行代码做了以下几件事情:

  1. sizeof(arm_fir_instance_f32):计算arm_fir_instance_f32结构体类型所占用的字节数。
  2. malloc(sizeof(arm_fir_instance_f32)):调用malloc函数,请求分配足够存储一个arm_fir_instance_f32结构体的内存空间。malloc返回的是一个指向所分配内存区域的void指针。
  3. (arm_fir_instance_f32 *):将void指针强制类型转换为arm_fir_instance_f32指针。这是因为malloc返回的是void指针,而我们需要一个指向arm_fir_instance_f32的指针来操作分配的内存。
  4. S = ...:将转换后的指针赋值给S,这样S现在就指向了一块新分配的内存,这块内存足够存储一个arm_fir_instance_f32实例。

重要的是要注意,在使用malloc分配内存之后,你有责任在不再需要这块内存时使用free函数来释放它,以避免内存泄漏。

另外,务必检查malloc的返回值是否为NULL。如果malloc无法分配所需的内存(例如,由于内存不足),它将返回NULL。在这种情况下,你应该处理这个错误情况,而不是尝试使用NULL指针,因为这会导致程序崩溃。

现在再调用那两个函数

arm_fir_init_f32(S,numTaps,pCoeffs,pState,blockSize);
arm_fir_f32(S,inbuf,outbuf,blockSize);

 这样在outbuf数组中就是低通滤波后的数据了

最后我们使用free函数释放内存,避免内存泄漏

free(S);      // 释放内存 
S = NULL; // 将指针设置为 NULL,以避免悬挂指针

OK,用串口打印出来看看效果

56edeb278e2c40b8aec7594fe80a0322.png

 蓝色的方波是原始信号,橙色的正弦波是经过低通滤波的信号,效果还是ok的

到此,就完成了软件滤波

 

 

 

 

相关文章:

STM32利用arm-dsp库进行FIR低通滤波【详细】

arm-dsp库官方已经封装好了&#xff0c;使用的时候需要把dsp库移植到工程里面&#xff0c;具体怎么移植网上可以找到教程 这里直接说怎么用FIR的流程&#xff1a; 一、Matlab里面生成所配置的阶数和系数 1、在Matlab命令窗口输入fdatool,回车&#xff0c;会弹出一个新窗口 2…...

Efficient-KAN 源码详解

Efficient-KAN源码链接 Efficient-KAN (GitHub) 改进细节 1.内存效率提升 KAN网络的原始实现的性能问题主要在于它需要扩展所有中间变量以执行不同的激活函数。对于具有in_features个输入和out_features个输出的层,原始实现需要将输入扩展为shape为(batch_size, out_featur…...

Jlink commander使用方法(附指令大全)

Jlinkcmd它可以方便用户在非仿真的情况下&#xff0c;hold内核、单步、全速、设置断点、查看内核和外设寄存器、读取flash代码等等&#xff0c;方便大家拥有最高的权限查看在运行中的MCU情况&#xff0c;查找非IDE仿真情况下&#xff0c;MCU运行异常的原因。 目录 驱动安装 …...

Java SpringBoot实现PDF转图片

不是单页图片&#xff0c;是多页PDF转成一张图片的逻辑。 我这里的场景是PDF转成图片之后返回给前端&#xff0c;前端再在图片上实现签字&#xff0c;并且可拖拽的逻辑&#xff0c;就是签订合同的场景。 但是这里只写后端多页PDF转图片的逻辑。 先说逻辑&#xff0c;后面直接…...

elasticsearch SQL:在Elasticsearch中启用和使用SQL功能

❃博主首页 &#xff1a; 「码到三十五」 &#xff0c;同名公众号 :「码到三十五」&#xff0c;wx号 : 「liwu0213」 ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a…...

Java 并发编程:线程变量 ThreadLocal

大家好&#xff0c;我是栗筝i&#xff0c;这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 029 篇文章&#xff0c;在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验&#xff0c;并希望进…...

【OpenHarmony4.1 之 U-Boot 2024.07源码深度解析】018 - init_sequence_f 各函数源码分析(二)

【OpenHarmony4.1 之 U-Boot 2024.07源码深度解析】018 - init_sequence_f 各函数源码分析(二) 一、arch_cpu_init二、arch_cpu_init系列文章汇总:《【OpenHarmony4.1 之 U-Boot 源码深度解析】000 - 文章链接汇总》 本文链接:《【OpenHarmony4.1 之 U-Boot 2024.07源码深度…...

LVS原理——详细介绍

目录 介绍 lvs简介 LVS作用 LVS 的优势与不足 LVS概念与相关术语 LVS的3种工作模式 LVS调度算法 LVS-dr模式 LVS-tun模式 ipvsadm工具使用 实验 nat模式集群部署 实验环境 webserver1配置 webserver2配置 lvs配置 dr模式集群部署 实验环境 router 效果呈现…...

MYSQL 5.7.36 等保 建设记录

文章目录 前言一、开启审计日志1.1 查看当前状态1.2 开启方式1.3 查看开启后状态 二、密码有效期2.1 查看当前状态2.2 开启方式2.3 查看开启后状态 三、密码复杂度3.1 查看当前状态3.2 开启方式3.3 查看开启后状态 四、连接控制4.1 查看当前状态4.2 开启方式4.3 查看开启后状态…...

fatal: unable to access ‘https://github.com/xxxxx

ubuntu中git克隆项目异常 git clone https://github.com/xxx Cloning into ‘xxx’… fatal: unable to access ‘https://github.com/xxx/xx.git/’: Could not resolve host: github.com 解决办法使用命令&#xff1a; git config --global http.proxy git config --global…...

从零开始的CPP(38)——递归与动态规划

leetcode46 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2&#xff1a; 输入&#…...

从战略到系统架构:信息系统设计的全面解析

在当今数字化时代&#xff0c;信息系统已成为企业运营、管理和创新的核心驱动力。信息系统设计的重要性不仅关乎企业的技术实现&#xff0c;更直接影响到企业的战略执行和市场竞争能力。本文将从战略视角出发&#xff0c;深入探讨信息系统设计的全过程&#xff0c;包括从战略制…...

GEE调用中国(China Land Cover Dataset,简称CLCD)1990-2022年30米分辨率的土地分类数据

博客推荐 GEE土地分类&#xff1a;中国30米年度土地覆盖产品annual China Land Cover Dataset, CLCD&#xff08;面积提取&#xff09;_30米土地利用数据gee-CSDN博客 简介 中国陆地覆盖数据集&#xff08;China Land Cover Dataset&#xff0c;简称CLCD&#xff09;是一个用…...

三十八、大数据技术之Kafka(1)

&#x1f33b;&#x1f33b; 目录 一、Kafka 概述1.1 定义1.2 消息队列1.2.1 消息队列内部实现原理1.2.2 传统消息队列的应用场景1.2.3 消息队列的两种模式 1.3 Kafka 基础架构 二、 Kafka 快速入门2.1 安装前的准备2.2 安装部署2.2.1 集群规划2.2.2 单节点或集群部署2.2.3 集群…...

将 Tcpdump 输出内容重定向到 Wireshark

在 Linux 系统中使用 Tcpdump 抓包后分析数据包不是很方便。 通常 Wireshark 比 tcpdump 更容易分析应用层协议。 一般的做法是在远程主机上先使用 tcpdump 抓取数据并写入文件&#xff0c;然后再将文件拷贝到本地工作站上用 Wireshark 分析。 还有一种更高效的方法&#xf…...

【Python蓝屏程序(管理员)】

说明&#xff1a;该程序为临摹(&#x1f600;)作品&#xff0c;源地址C蓝屏程序(非管理员) 我试图使用Python调用 NtRaiseHardError API &#xff0c;实现类似的蓝屏效果。可惜我发现Python在普通权限下&#xff0c;直接调用 NtRaiseHardError API 是不被允许的&#xff0c;因为…...

OpenGL ES->GLSurfaceView绘制图形的流程

自定义View代码 class MyGLSurfaceView(context: Context, attrs: AttributeSet) : GLSurfaceView(context, attrs), GLSurfaceView.Renderer {var mProgrem 0init {// 设置 OpenGL ES 3.0 版本setEGLContextClientVersion(3)// 设置当前类为渲染器, 注册回调接口的实现类set…...

Linux OOM Killer详解

Linux OOM Killer详解 一、概述二、OOM Killer的技术原理1. 内存区域划分2. 内存耗尽与OOM Killer触发3. 选择被杀进程的策略4. 内存回收机制5. 内存分配策略 三、OOM Killer的工作机制1. 内存压力监测2. 触发条件3. 选择被杀进程4. 终止进程 四、实际场景举例场景一&#xff1…...

2024rk(案例二)

试题二(25分) 阅读以下关于数据库缓存的叙述,在答题纸上回答问题1至问题3。 【说明】 某大型电商平台建立了一个在线 B2B 商店系统,并在全国多地建设了货物仓储中心,通过提前备货的方式来提高货物的运送效率。但是在运营过程中,发现会出现很多跨仓储中心调货从而延误货物…...

小红书爆文秘籍:ChatGPT助你从0到1创造热门内容!

在小红书打造爆款文案的策略中&#xff0c;以下是一些调整和同义词替换的建议&#xff0c;以便达到文章去重的要求&#xff1a; 了解目标受众&#xff1a; 在撰写文案前&#xff0c;先深入分析目标读者的属性&#xff0c;如年龄层次、性别、爱好和购买行为。通过ChatGPT, 你能迅…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

企业如何增强终端安全?

在数字化转型加速的今天&#xff0c;企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机&#xff0c;到工厂里的物联网设备、智能传感器&#xff0c;这些终端构成了企业与外部世界连接的 “神经末梢”。然而&#xff0c;随着远程办公的常态化和设备接入的爆炸式…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

Bean 作用域有哪些?如何答出技术深度?

导语&#xff1a; Spring 面试绕不开 Bean 的作用域问题&#xff0c;这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开&#xff0c;结合典型面试题及实战场景&#xff0c;帮你厘清重点&#xff0c;打破模板式回答&#xff0c…...

手机平板能效生态设计指令EU 2023/1670标准解读

手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读&#xff0c;综合法规核心要求、最新修正及企业合规要点&#xff1a; 一、法规背景与目标 生效与强制时间 发布于2023年8月31日&#xff08;OJ公报&…...

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态

前言 在人工智能技术飞速发展的今天&#xff0c;深度学习与大模型技术已成为推动行业变革的核心驱动力&#xff0c;而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心&#xff0c;系统性地呈现了两部深度技术著作的精华&#xff1a;…...

xmind转换为markdown

文章目录 解锁思维导图新姿势&#xff1a;将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件&#xff08;ZIP处理&#xff09;2.解析JSON数据结构3&#xff1a;递归转换树形结构4&#xff1a;Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...