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

最近在折腾一个传感器信号处理的项目,发现原始数据里总有些低频干扰挥之不去。得嘞,撸起袖子给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阶滤波器照样轻松。

http://www.zskr.cn/news/177573.html

相关文章:

  • 2025钢结构防火涂料厂家市场报告:行业格局、技术趋势与全屋卫士竞争力分析 - 品牌企业推荐师(官方)
  • PyTorch镜像如何实现多版本共存?标签管理技巧
  • PyTorch镜像运行分布式训练:DDP模式配置教程
  • 双指针刷题总结
  • 早上八点的电费涨到一块二了,家里的洗衣机还在嗡嗡转。我瘫在沙发上刷着电费账单,突然意识到这年头连用个电都得玩策略游戏——分时电价这玩意儿简直比股票K线图还刺激
  • cnn特征图可视化方法:在PyTorch-CUDA-v2.8中绘制中间层输出
  • 最近在研究磁耦合谐振式无线电能传输,发现相控电容式补偿方法挺有意思的。今天就来聊聊这个,顺便用Simulink仿真一下,看看效果如何
  • 大数据领域数据生命周期,藏在细节里的宝藏
  • Spring 高性能多级缓存全攻略:Caffeine + Redis 生产级实践
  • PyTorch安装包下载慢?国内加速镜像站点推荐列表
  • 【计算机毕业设计案例】基于springboot的骑行运动爱好者社交骑行交流论坛的设计与开发(程序+文档+讲解+定制)
  • 文件管理
  • 牛拉法电力系统潮流计算 MATLAB编写潮流计算程序 BPA计算潮流 另外包含参考文献
  • 【毕业设计】基于springboot的骑行交流论坛的设计与开发(源码+文档+远程调试,全bao定制等)
  • ssh批量管理多台机器:统一运维PyTorch-CUDA-v2.8集群
  • Hyperchain中区块打包的实现
  • markdown制作幻灯片:用Marp展示PyTorch-CUDA-v2.8研究成果
  • PyTorch-CUDA镜像推荐:高效运行CNN、YOLOv5和HuggingFace模型
  • 张祥前统一场论电荷定义方程分析报告
  • 代码后门检测:用 CodeQL + AI 扫描开源项目,我发现了 3 个隐藏极深的逻辑漏洞
  • PyTorch梯度裁剪技巧:防止训练崩溃在CUDA-v2.8中应用
  • 柯南变声器成真?基于 RVC 实现 Python 实时变声,男声秒变萝莉音
  • AI绘图封神王炸!Z-Image-Turbo图生图最新版!
  • cuda安装后nvidia-smi无显示?PyTorch-CUDA-v2.8内置诊断工具
  • PyTorch-CUDA-v2.8镜像支持A100/H100吗?高性能显卡实测反馈
  • Jupyter与SSH双模式支持:PyTorch镜像满足多种开发需求
  • 神州路由器的OSPF路由两种认证
  • cuda安装驱动不匹配?PyTorch-CUDA-v2.8自动规避版本冲突
  • github issues提问技巧:关于PyTorch-CUDA-v2.8的问题如何描述
  • SQLAlchemy 2.0 类型注解指南:`Mapped` 与 `mapped_column`