news 2026/5/1 5:12:14

最近在折腾一个传感器信号处理的项目,发现原始数据里总有些低频干扰挥之不去。得嘞,撸起袖子给STM32整了个FIR高通滤波器。咱不整那些虚的,直接上干货

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
最近在折腾一个传感器信号处理的项目,发现原始数据里总有些低频干扰挥之不去。得嘞,撸起袖子给STM32整了个FIR高通滤波器。咱不整那些虚的,直接上干货

STM32开发 FIR高通滤波器 STM32实现FIR有限冲击响应高通滤波器,自编代码,汉明窗,送MATLAB程序,代码注释详细

先别急着写代码,咱们得先搞定滤波器系数。掏出MATLAB,20阶高通滤波器走起:

order = 20; cutoff = 0.4; % 归一化截止频率 h = fir1(order, cutoff, 'high', hamming(order+1)); fprintf('{%.8ff, ', h(1:end-1)); fprintf('%.8ff}', h(end));

这段脚本直接生成汉明窗加权的滤波器系数,打印成C数组格式。注意这里截止频率别设太高,0.4对应实际采样频率的40%。比如采样率1kHz的话,截止就是200Hz。

接下来STM32这边,直接上硬核代码。先整个环形缓冲区管理输入数据:

#define FILTER_ORDER 20 float buffer[FILTER_ORDER+1]; uint8_t buf_index = 0; void push_sample(float new_sample) { buffer[buf_index] = new_sample; buf_index = (buf_index + 1) % (FILTER_ORDER+1); }

这个环形缓冲区的骚操作在于,每次新数据覆盖最老的数据,省去了数组整体移动的开销。注意FILTER_ORDER+1的缓冲区长度,刚好装下当前窗口的所有采样点。

卷积运算才是重头戏,直接手撸:

float fir_filter(float *coeffs) { float output = 0.0f; uint8_t index = buf_index; for(int i=0; i<=FILTER_ORDER; i++){ if(index == 0) index = FILTER_ORDER; output += coeffs[i] * buffer[index]; index--; } return output; }

这里倒着取缓冲区数据的操作是关键,因为新数据总在buf_index位置,老数据顺时针排列。用if判断代替取模运算,实测能省20%计算时间。

实际工程里记得把系数转成Q15格式,上ARM的DSP库加速:

#include "arm_math.h" arm_fir_instance_f32 fir; float fir_state[FILTER_ORDER + BLOCK_SIZE -1]; void filter_init() { arm_fir_init_f32(&fir, FILTER_ORDER+1, hamming_coeffs, fir_state, BLOCK_SIZE); } void process_block(float *input, float *output) { arm_fir_f32(&fir, input, output, BLOCK_SIZE); }

用DSP库的批处理模式,一次处理一个数据块,比单点处理快3倍不止。注意state数组要足够大,别溢出。

调试时遇到过坑:直接浮点运算在F103上慢成狗,后来切到CMSIS-DSP的定点库,Q15格式配合armfirq15,速度直接起飞。不过要小心系数缩放,搞不好就溢出。建议先用MATLAB验证定点化的误差:

q15_coeffs = int16(h * 32767);

最后在main函数里这么用:

while(1) { float raw = read_adc(); push_sample(raw); float filtered = fir_filter(coeffs); printf("%f\t%f\n", raw, filtered); }

实测效果拔群,50Hz工频干扰被干得服服帖帖。完整工程丢在Github了,需要自取。记住滤波器阶数不是越高越好,够用就行,STM32F4跑100阶滤波器照样轻松。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 18:55:22

AI开发者必备:PyTorch-CUDA-v2.8镜像助力大模型训练加速

PyTorch-CUDA-v2.8 镜像&#xff1a;大模型训练的“开箱即用”利器 在大模型时代&#xff0c;AI 开发者最熟悉的日常是什么&#xff1f;不是调参&#xff0c;也不是写模型结构——而是花几个小时甚至一整天&#xff0c;只为让 import torch 不报错。环境依赖、CUDA 版本不匹配…

作者头像 李华
网站建设 2026/4/25 11:08:28

华为云国际站代理商WeLink的资源与工具支持具体有哪些?

华为云国际站 WeLink 的代理商资源与工具支持&#xff0c;核心覆盖销售与商机、开发与集成、交付与运维、培训与认证、合规与本地化五大模块&#xff0c;以可直接落地的工具、模板、配额与专属团队&#xff0c;降低代理商获客、交付、运维与合规成本&#xff0c;提升客户转化与…

作者头像 李华
网站建设 2026/4/28 9:10:57

华为云国际站WeLink的成本可控优势体现在哪些方面?

华为云国际站 WeLink 的成本可控优势&#xff0c;核心体现在计费灵活无浪费、方案一体化省投入、运维与效率降本、代理商渠道优惠与 SLA 兜底&#xff0c;覆盖从初始部署到长期运营的全流程成本优化&#xff0c;适配跨国客户不同规模与负载需求。以下从核心维度、落地路径与代理…

作者头像 李华
网站建设 2026/4/24 9:23:35

git diff比较代码差异:追踪PyTorch-CUDA-v2.8配置变更

git diff比较代码差异&#xff1a;追踪PyTorch-CUDA-v2.8配置变更 在深度学习项目迭代中&#xff0c;一个常见的场景是&#xff1a;昨天还能正常训练的模型&#xff0c;今天却因为“CUDA版本不匹配”或“某个依赖突然报错”而无法运行。这类问题往往不是代码本身的缺陷&#xf…

作者头像 李华
网站建设 2026/4/26 21:09:59

模型压缩与量化:让AI更轻更快

模型压缩与量化的必要性现代深度学习模型参数量庞大&#xff0c;计算复杂度高&#xff0c;难以直接部署在资源受限的设备&#xff08;如移动端、嵌入式设备&#xff09;上。模型压缩与量化技术通过减少模型体积和计算量&#xff0c;提升推理速度&#xff0c;降低功耗&#xff0…

作者头像 李华
网站建设 2026/4/4 22:42:30

【计算机毕业设计案例】基于SpringBoot财务管理系统的设计与实现基于springboot的中小企业财务管理系统的设计与实现(程序+文档+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华