news 2026/5/1 10:26:48

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
资料: 软件滤波算法、数字滤波常用的算法, 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抽风时,不妨把这些算法轮番伺候,总有一款能治住那不安分的数据。

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

紧急修复漏洞来不及?用这1种方法实现PHP组件秒级更新

第一章&#xff1a;低代码 PHP 组件的更新机制在现代Web开发中&#xff0c;低代码平台通过可视化界面和模块化设计显著提升了PHP应用的开发效率。其中&#xff0c;组件的更新机制是保障系统稳定性和功能迭代的关键环节。低代码PHP组件通常以独立模块形式存在&#xff0c;其更新…

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

从农场到云端的安全链路,PHP如何扛起设备认证最后一道关卡?

第一章&#xff1a;从农场到云端的安全链路&#xff0c;PHP如何扛起设备认证最后一道关卡在现代农业物联网系统中&#xff0c;传感器设备从田间采集数据后&#xff0c;需经由安全链路上传至云端平台。而在这条链路的末端&#xff0c;PHP作为后端服务的核心语言之一&#xff0c;…

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

【R Shiny数据兼容性突破】:3步实现多模态数据智能解析与可视化

第一章&#xff1a;R Shiny 的多模态数据导入组件在构建交互式数据应用时&#xff0c;支持多种数据格式的灵活导入是提升用户体验的关键。R Shiny 提供了丰富的输入控件和后端逻辑处理能力&#xff0c;使开发者能够轻松实现对 CSV、Excel、JSON、数据库连接甚至图像文件等多种数…

作者头像 李华
网站建设 2026/5/1 8:52:54

重新测试小型封装的MOS管高频半桥:ASDM40N40E

简 介&#xff1a; 本文测试了ASDM40N40E-R小封装MOS管在半桥电路中的性能。实验使用单面PCB板&#xff0c;栅极电阻设为0欧姆&#xff0c;在24V电压和100kHz驱动信号下&#xff0c;电路工作稳定&#xff0c;未出现二次导通现象。通过优化示波器探头设置&#xff08;X10档位&am…

作者头像 李华
网站建设 2026/5/1 8:52:51

信捷XDPLC与欧姆龙E5CC温控器的实战联调笔记

信捷XDPLC与3台欧姆龙E5CC温控器通讯程序输出启停控制(XJXD-8) 功能&#xff1a;通过信捷XD5&#xff0c;实现对3台欧姆龙E5CC温控器设定温度&#xff0c;读取温度&#xff0c;控制温控器输出启停&#xff0c;反应灵敏&#xff0c;通讯稳定可靠。 程序采用轮询方式 器件&#x…

作者头像 李华
网站建设 2026/5/1 7:30:57

软件系统健壮性保障:恢复测试场景设计方法与最佳实践

1. 恢复测试的核心价值与定义 在当今高度依赖数字化服务的社会环境中&#xff0c;软件系统的容错与恢复能力已成为衡量产品质量的关键指标。恢复测试作为软件测试领域的重要组成部分&#xff0c;专注于验证系统在遭遇各种异常情况后&#xff0c;能否按照预期策略自动或手动恢复…

作者头像 李华