2026/1/1 11:17:42
网站建设
项目流程
高端营销型网站,电子商务网站服务器,湖北省建设工程质量协会网站,电子商务包括哪些资料: 软件滤波算法、数字滤波常用的算法#xff0c;
AD采集#xff0c;数据采集等经常会遇到由于干扰、电路误差、精度、抖动等带来的误差#xff0c;这些误差往往影响我们单位计算或控制#xff0c;在平常的设计中#xff0c;我们会加各种软件滤波来让数据变得平滑…资料: 软件滤波算法、数字滤波常用的算法 AD采集数据采集等经常会遇到由于干扰、电路误差、精度、抖动等带来的误差这些误差往往影响我们单位计算或控制在平常的设计中我们会加各种软件滤波来让数据变得平滑只要涉及到数据采集就离不开数字滤波。 keilstm32工程有写好的历程使用简单方便 滤波算法包括:限幅滤波中位值滤波算数平均滤波递推平均滤波中位值平均滤波限幅平均滤波一阶滞后滤波加权递推滤波消抖滤波限幅消抖滤波。在嵌入式开发里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 i0; isize-1; i) for(int j0; jsize-1-i; j) if(arr[j] arr[j1]) swap(arr[j], arr[j1]); 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 i0; iFILTER_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抽风时不妨把这些算法轮番伺候总有一款能治住那不安分的数据。