g-h Filter 详细讲解

g-h 过滤器

g-h 滤波器百科介绍

之前的翻译大家,我看都没什么阅读量,可能大家都不是很想看(估计也是我英文太水)。那么这篇博客我就先暂停直接翻译原文,而是直接说一下自己的理解。

本文章背后的书的详细介绍可以查看 链接

从头开始认识 g-h 过滤器

作者通过对使用含有误差的秤(现实世界的秤都不可能百分之百准确)测量自己的体重引出了 g-h 过滤器的概念。
这也是一个相当重要的概念,对后面的要学习的各种滤波算法起到了非常关键的思想上的引导。
g-h过滤器的核心思想就是对预测值和实际的测量值找到一个比重,来使得实际的评估值更加能接近最真实的体重。
下面的图就是如何对体重进行评估的方式描述。

在这里插入图片描述
这里的 last_estimate 是值上一次的评估值, estimate 是当前的评估值,prediction 是通过上一次的评估值对当前的预测值,measurement 是当前的测量值。这里的值全部是指作者要测量的目标,也就是体重。

这时如果单纯的只考虑测量值和预测值之间的关系,选择一个系数来分配他们的关系,比如下面的式子。

在这里插入图片描述
这个式子如果用代码来实现只需要用两行,变量名字起的很好,十分易懂。

        # 预测新的重量,gain_rate 就是对体重的预测变化
        predicted_weight = estimated_weight + gain_rate * time_step

        # 对过滤器的状态进行更新 , 这里的 scale_factor 就可以理解为上面式子的 4/10
        estimated_weight = predicted_weight + scale_factor * (measurement - predicted_weight)

在这种情况下因为没有考虑预测值与前一次评估值的变化关系,导致这种办法只在我们设计滤波器的时候对变化关系做出了正确设置的时候才会产生作用。
比如假设每天我们都会增加体重1lbs(磅),如下图所示:

在这里插入图片描述
这个时候滤波器表现的很好。但是如果我们对于预测值的变化设置错误的情况下,图形看起来就不会有这种比较好的效果了。
下图就是在代码中我们假设我们的体重仍是每天增长 1 lbs(磅),但是评估

<think>好的,我现在需要帮助用户理解“Filter_ADC怎么用”。首先,我需要回顾之前的对话历史,确保回答的连贯性。用户之前询问了主函数如何调用HX711驱动代码,现在接着问Filter_ADC的使用方法,这说明他们可能在实现传感器数据采集时遇到了数据处理的问题,特别是滤波方面。 首先,我需要确定用户提到的Filter_ADC是什么。根据之前的回答,用户提供的代码示例中提到过使用带滤波的读取函数,比如“float weight = (Filter_ADC() - offset) * scale_factor;”。这表明Filter_ADC是一个用于对HX711读取的原始ADC数据进行滤波处理的函数,目的是减少噪声,提高数据稳定性。 接下来,我需要解释Filter_ADC的作用和常见实现方式。用户可能对滤波算法不太熟悉,所以需要简单介绍几种常用的滤波方法,比如滑动平均滤波、中值滤波、一阶滞后滤波等,并给出具体的代码示例。同时,要说明如何集成到现有的HX711驱动代码中。 我需要考虑用户可能的背景。他们可能是一个刚开始接触嵌入式系统或传感器数据处理的开发者,可能在制作电子秤或其他需要精确测量的项目。因此,回答需要保持技术细节的准确性,同时易于理解,避免使用过于专业的术语,或在必要时进行解释。 用户可能的问题包括:如何选择合适的滤波方法,如何调整滤波参数,滤波函数如何影响实时性,以及如何处理数据延迟等。因此,在回答中需要涵盖这些方面,给出实际应用的建议,比如根据系统需求选择滤波方式,测试不同参数的效果等。 另外,我需要参考之前的回答结构,保持一致性。之前的回答包含代码示例、关键说明、流程图和调试建议,因此这次回答也应该采用类似的格式,帮助用户快速找到所需信息。 在组织内容时,首先应定义Filter_ADC的作用,然后分点介绍不同的实现方法,每种方法附上代码示例和适用场景。接着,说明如何将滤波函数集成到主程序中,可能给出调用示例和参数调整建议。最后,提供调试技巧和常见问题处理,帮助用户在实际应用中解决问题。 需要注意的是,用户可能在实现滤波时遇到具体问题,比如滤波后的数据波动仍然较大,或者响应速度变慢。因此,在回答中应包含优化建议,比如调整窗口大小、系数或结合多种滤波方法,以及如何平衡噪声抑制和实时性。 最后,确保回答使用中文,结构清晰,代码示例正确,并遵循之前设定的格式,如使用适当的标题、代码块和列表,以增强可读性。</think>以下是关于`Filter_ADC`函数的使用详解,重点讲解滤波算法实现与工程实践技巧: --- ### **Filter_ADC的作用** 对HX711原始ADC数据进行**数字滤波**,消除噪声干扰,典型应用场景: - 电子秤重量抖动 - 传感器信号毛刺 - ADC量化误差 --- ### **常见滤波算法实现** #### 1. **滑动平均滤波**(简单易用) ```c #define FILTER_WINDOW 10 // 窗口越大越平滑,但延迟越高 int32_t Filter_ADC(void) { static int32_t buffer[FILTER_WINDOW]; static uint8_t index = 0; int64_t sum = 0; buffer[index] = HX711_Read(); // 调用原始读取函数 index = (index + 1) % FILTER_WINDOW; for(uint8_t i=0; i<FILTER_WINDOW; i++) { sum += buffer[i]; } return sum / FILTER_WINDOW; } ``` **特点**:实时性中等,适合缓慢变化的信号 --- #### 2. **中值滤波**(抗突发干扰) ```c #define MEDIAN_SIZE 5 // 推荐奇数,3-7之间 int32_t Filter_ADC(void) { int32_t samples[MEDIAN_SIZE]; // 快速采集样本 for(uint8_t i=0; i<MEDIAN_SIZE; i++){ samples[i] = HX711_Read(); } // 冒泡排序取中值 for(uint8_t i=0; i<MEDIAN_SIZE-1; i++) { for(uint8_t j=0; j<MEDIAN_SIZE-i-1; j++) { if(samples[j] > samples[j+1]) { int32_t temp = samples[j]; samples[j] = samples[j+1]; samples[j+1] = temp; } } } return samples[MEDIAN_SIZE/2]; } ``` **特点**:消除尖峰脉冲干扰,但消耗更多内存和CPU资源 --- #### 3. **一阶滞后滤波**(低内存消耗) ```c float alpha = 0.2; // 系数范围0.01~0.5,越小越平滑 int32_t Filter_ADC(void) { static int32_t filtered_val = 0; int32_t raw = HX711_Read(); filtered_val = alpha * raw + (1 - alpha) * filtered_val; return filtered_val; } ``` **特点**:适合嵌入式系统,需根据噪声频率调整α值 --- ### **工程实践技巧** 1. **参数调试方法**: - 通过串口输出原始数据绘制曲线,观察噪声频率 - 先用`HX711_Read()`获取原始值,确定需要滤波强度 ```c // 调试代码示例 printf("RAW:%ld, Filtered:%ld\r\n", HX711_Read(), Filter_ADC()); ``` 2. **混合滤波方案**(推荐): ```c int32_t Filter_ADC(void) { // 先中值滤波去突发噪声 int32_t med = MedianFilter(); // 再滑动平均平滑 return MovingAverage(med); } ``` 3. **动态调整策略**: ```c if(系统处于稳定状态){ 增大滤波窗口 // 更强平滑 } else { 减小窗口 // 提升响应速度 } ``` --- ### **典型问题排查** | 现象 | 解决方案 | |-------------------|----------------------------| | 滤波后数值跳变大 | 检查HX711电源稳定性,增加硬件RC滤波 | | 响应延迟明显 | 降低滑动平均窗口大小,或减小α系数 | | 滤波后数据不更新 | 检查静态变量初始化,避免数值溢出 | --- **建议开发流程**: ```mermaid graph LR A[采集原始数据] --> B[绘制波形] B --> C{判断噪声类型} C -->|高频噪声| D[选择滑动平均] C -->|脉冲干扰| E[中值滤波] C -->|低频波动| F[一阶滞后滤波] D/E/F --> G[参数微调] G --> H[验证实时性] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值