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

资料: 软件滤波算法、数字滤波常用的算法, AD采集,数据采集等经常会遇到由于干扰、电路误差、...

资料: 软件滤波算法、数字滤波常用的算法, AD采集,数据采集等经常会遇到由于干扰、电路误差、精度、抖动等带来的误差,这些误差往往影响我们单位计算或控制,在平常的设计中,我们会加各种软件滤波来让数据变得平滑,只要涉及到数据采集就离不开数字滤波。 keil,stm32工程,有写好的历程,使用简单方便, 滤波算法包括:限幅滤波,中位值滤波,算数平均滤波,递推平均滤波,中位值平均滤波,限幅平均滤波,一阶滞后滤波,加权递推滤波,消抖滤波,限幅消抖滤波。

在嵌入式开发里,ADC采集的数据就像青春期少年的心情——说变就变。上周调试温控系统时,ADC返回的温度值在25°C到30°C之间反复横跳,实际温度计却稳稳停在27°C。这时候就该祭出软件滤波大法了。

先看最直接的限幅滤波,适合处理突发性跳变。假设相邻两次采样间隔200ms,温度不可能突变5°C:

#define MAX_DIFF 2 //允许最大变化值 int limit_filter(int new_val, int old_val) { if(abs(new_val - old_val) > MAX_DIFF) return old_val; return new_val; }

这个暴力美学算法有个致命弱点:连续跳变时数据会卡死。于是中位值滤波登场,适合消除脉冲干扰。在STM32里可以这么玩:

int mid_filter(int *arr, uint8_t size) { // 冒泡排序虽然效率低,但代码简单 for(int i=0; i<size-1; i++) for(int j=0; j<size-1-i; j++) if(arr[j] > arr[j+1]) swap(&arr[j], &arr[j+1]); return size%2 ? arr[size/2] : (arr[size/2-1]+arr[size/2])/2; }

实际项目中发现,用3次采样取中值就能干掉80%的尖峰脉冲。不过频繁排序影响实时性,这时候递推平均滤波更合适:

#define FILTER_WIN 10 //滑动窗口大小 int filter_buf[FILTER_WIN]; uint8_t filter_index = 0; int moving_avg(int new_val) { filter_buf[filter_index++] = new_val; if(filter_index == FILTER_WIN) filter_index = 0; int sum = 0; for(int i=0; i<FILTER_WIN; i++) sum += filter_buf[i]; return sum / FILTER_WIN; }

这个算法的内存占用是硬伤,在内存吃紧的MCU上可以用移位平均代替:avg = avg - avg/FILTERWIN + newval/FILTER_WIN;,用一次乘法和两次加法搞定。

遇到既要消除脉冲又要平滑波动的场景,限幅平均滤波组合拳就派上用场了:

int combo_filter(int new_val) { static int last_val = 0; // 先限幅 if(abs(new_val - last_val) > MAX_DIFF) new_val = last_val; // 再递推平均 last_val = (last_val * 3 + new_val) / 4; //加权系数可调 return last_val; }

调试四轴飞行器时,陀螺仪数据既需要快速响应又不能抖动。这时候一阶滞后滤波表现出色:

float a = 0.3; //滤波系数 float first_order_filter(float new_val) { static float filtered = 0; filtered = a * new_val + (1 - a) * filtered; return filtered; }

把浮点运算改成Q格式定点数能提升速度:filtered = (anew_val + (0xFFFF - a)filtered) >> 16;

选择滤波算法就像选女朋友——没有最好,只有最合适。要快速响应的选限幅,求稳的用递推平均,内存紧张试试移位平均,对抗脉冲干扰必须中位值。下次遇到ADC抽风时,不妨把这些算法轮番伺候,总有一款能治住那不安分的数据。

http://www.cnnetsun.cn/news/69170.html

相关文章:

  • Iridescent:Day23
  • Laravel 13多模态权限实现技巧(99%的开发者忽略的关键细节)
  • 测试数据自动生成方法:策略、实施与最佳实践
  • 【医疗数据安全防线】:如何用PHP构建自动备份体系
  • 【R-Python模型融合实战】:揭秘跨平台建模结果验证的5大核心步骤
  • 从田间到R控制台,方差分析如何改变传统农业决策?
  • 基于comsol的多层冻土地基冻涨模型研究:低温热流固三场耦合效应的固体力学模拟
  • 2025年最新阿勒泰地区道路矢量数据
  • 设计模式[10]——外观模式一分钟彻底说清楚
  • Temu 分销重塑跨境生态:轻资产时代的新增长法则
  • Hello World的深度演进:一个Ascend C标量算子的性能剖析之旅
  • [Python桌面开发] 本地多服务启动神器:Python + Tkinter 构建“进程批量启动与监控工具”(跨平台 GUI + 源码开放)
  • 量子算法的实现路径解析(工业级应用稀缺技术曝光)
  • 揭秘Python最被低估的8个标准库,第6个能省下你一半代码量
  • GraphQL + PHP错误处理全解析,构建高可用API的必备技能
  • 当AI接管代码:哈佛调查显示53%年轻开发者每天用AI,却59%担心被取代,这届程序员太难了!
  • 16、编程中的颜色与图形绘制及HTML基础入门
  • PHP 8.6的JIT缓存机制揭秘:5大策略提升应用执行效率300%
  • 基于微信小程序的动漫社区交流小程序的设计与实现(源码+lw+部署文档+讲解等)
  • 响应格式化踩坑实录:Symfony 8开发者必须避开的5个陷阱
  • PHP 8.6性能监控面板实战(专家级配置全公开)
  • 性能监控在DevOps中的角色
  • RN Hooks 设计规范与反模式清单
  • 《Advanced Science》最新研究:多自由度折纸模块构建可编程机械超材料网络
  • 用梯形图+SCL玩转FactoryIO码垛控制
  • 7、Nagios 安装与功能拓展全解析
  • 读懂 NVIDIA Jetson OP-TEE 官方源码:从目录结构到 JetPack / Yocto 构建与运行的完整指南
  • LobeChat能否实现邀请码注册机制?控制用户增长节奏
  • Angular AOT编译失败?这份官方文档解读帮你10分钟定位问题
  • PHP环境下医疗数据备份怎么做?5种高可用方案对比分析