限幅滤波法对数据进行滤波优化
限幅滤波法(又称程序判断滤波法)可以有效抑制数据中的随机脉冲干扰。以下是具体的实现方法和代码示例:
限幅滤波法原理
通过比较相邻两次采样值的差值是否超过预设的阈值:
- 若差值 ≤ 阈值:视为有效数据,保留当前值
- 若差值 > 阈值:视为干扰数据,用前一次值替代
适用于数据变化缓慢的场景(如温度、压力等物理量)。
代码实现
1. 简单阈值判断法
#define THRESHOLD 10 // 根据实际数据波动范围调整uint16_t LimitFilter(uint16_t new_value) {static uint16_t last_value;if (abs(new_value - last_value) > THRESHOLD) {return last_value; // 超过阈值返回上次值} else {last_value = new_value; // 更新有效值return new_value;}
}
2. 带惯性补偿的改进算法
#define THRESHOLD 20 // 基础阈值
#define INERTIA_FACTOR 0.3 // 惯性系数(0~1)float ImprovedLimitFilter(float new_val) {static float last_val;float delta = new_val - last_val;if (fabs(delta) > THRESHOLD) {// 超限时按惯性逼近last_val += delta * INERTIA_FACTOR; } else {last_val = new_val;}return last_val;
}
使用注意事项
-
阈值选择
- 需大于正常信号的最大变化率
- 小于干扰信号的最小变化量
- 示例参考:
- 温度采集:2~5℃
- 转速测量:50~100 RPM
-
数据初始化
void Filter_Init(uint16_t init_value) {LimitFilter(init_value); // 首次调用时传入初始值 }
-
ADC应用示例
uint16_t Read_ADC_Filtered(void) {uint16_t raw = ADC_ReadChannel(ADC_CHANNEL_1);return LimitFilter(raw); }
性能特点对比
特性 | 传统限幅滤波 | 改进惯性滤波 |
---|---|---|
计算复杂度 | 低 | 中 |
抗脉冲干扰 | 优 | 良 |
信号跟踪速度 | 快 | 可调 |
相位延迟 | 无 | 有 |
适合场景 | 缓变信号 | 变速信号 |
优化建议
-
动态阈值调整
// 根据信号变化率自动调整阈值 void DynamicThreshold(float speed) {static float threshold = THRESHOLD;threshold = BASE_TH + speed * K_FACTOR;// 限制在合理范围threshold = constrain(threshold, TH_MIN, TH_MAX); }
-
复合滤波策略
结合中值滤波提高鲁棒性:#define SAMPLE_SIZE 5uint16_t CombinedFilter(void) {static uint16_t buf[SAMPLE_SIZE];// 先进行中值滤波uint16_t median = MedianFilter(ADC_Read());// 再进行限幅滤波return LimitFilter(median); }
-
边界保护
// 防止首次采样异常 if(last_value == 0 && new_value > MAX_SAFE_VALUE) {return 0; }
实际应用技巧
- 在低速采样时(<100Hz),建议配合移动平均滤波使用
- 对于12位ADC数据,典型阈值范围:30-100 LSB
- 在电机控制等实时性要求高的场景中,建议使用查表法优化计算速度
通过合理配置参数,限幅滤波法可有效提升STM32在工业现场等复杂环境中的测量可靠性。建议结合具体信号特性通过示波器或数据记录仪进行阈值校准。