news 2026/5/12 0:10:30

最近在折腾一个传感器信号处理的项目,发现原始数据里总有些低频干扰挥之不去。得嘞,撸起袖子给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/5/11 13:04:19

大模型训练Token成本太高?用GPU镜像优化推理效率

大模型训练Token成本太高&#xff1f;用GPU镜像优化推理效率 在大模型时代&#xff0c;一个现实问题正困扰着越来越多的AI团队&#xff1a;为什么每次推理都这么贵&#xff1f; 尤其是在处理长文本生成、批量问答或实时对话系统时&#xff0c;每多一个Token&#xff0c;服务…

作者头像 李华
网站建设 2026/5/4 22:18:02

基于双虚拟领航员+人工势场APF+数据驱动神经网络控制的4艘欠驱动水面船舶USV 包容控制+障碍规避+事件触发” 一体化仿真系统,解决强扰动+单障碍场景下的分布式协同控制问题附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 &#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知,完整Matlab代码获取及仿…

作者头像 李华
网站建设 2026/5/11 13:51:22

芒格的“反向思考“在市场分析中的应用:避免从众误区

芒格的"反向思考"在市场分析中的应用&#xff1a;避免从众误区关键词&#xff1a;芒格、反向思考、市场分析、从众误区、投资决策摘要&#xff1a;本文深入探讨了芒格的反向思考方法在市场分析中的应用。首先介绍了背景信息&#xff0c;包括目的范围、预期读者等内容…

作者头像 李华
网站建设 2026/5/9 1:00:34

PyTorch-CUDA环境 vs 传统Anaconda:谁更适合深度学习?

PyTorch-CUDA环境 vs 传统Anaconda&#xff1a;谁更适合深度学习&#xff1f; 在现代深度学习项目中&#xff0c;一个稳定、高效的开发环境往往决定了从实验到部署的成败。许多开发者都曾经历过这样的场景&#xff1a;代码写好了&#xff0c;模型结构也没问题&#xff0c;结果…

作者头像 李华
网站建设 2026/5/6 13:37:02

华为云国际站代理商如何使用EDCM进行跨账号代维?

华为云国际站代理商使用 EDCM 进行跨账号代维&#xff0c;核心是 “伙伴中心 EDCMIAM 委托” 三端联动&#xff0c;流程分 “前置授权准备→EDCM 接入与授权→跨账号切换与运维→权限 / 日志管理” 四步&#xff0c;全程可视化、可批量操作&#xff0c;单客户约 15 分钟完成&a…

作者头像 李华
网站建设 2026/4/30 20:25:52

GitHub热门项目都在用的PyTorch环境,现在一键就能部署

GitHub热门项目都在用的PyTorch环境&#xff0c;现在一键就能部署 在AI研发一线摸爬滚打过的人都知道&#xff0c;最让人头疼的往往不是模型调参、也不是数据清洗&#xff0c;而是——环境配不起来。 明明代码是从GitHub上拉下来的开源项目&#xff0c;文档写得清清楚楚“依赖&…

作者头像 李华